diff --git a/.buckconfig b/.buckconfig new file mode 100644 index 0000000..934256c --- /dev/null +++ b/.buckconfig @@ -0,0 +1,6 @@ + +[android] + target = Google Inc.:Google APIs:23 + +[maven_repositories] + central = https://repo1.maven.org/maven2 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..7c28613 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,3 @@ +# Windows files +[*.bat] +end_of_line = crlf diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..40c6dcd --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + root: true, + extends: '@react-native-community', +}; diff --git a/.flowconfig b/.flowconfig new file mode 100644 index 0000000..315f274 --- /dev/null +++ b/.flowconfig @@ -0,0 +1,66 @@ +[ignore] +; We fork some components by platform +.*/*[.]android.js + +; Ignore "BUCK" generated dirs +/\.buckd/ + +; Ignore polyfills +node_modules/react-native/Libraries/polyfills/.* + +; Flow doesn't support platforms +.*/Libraries/Utilities/LoadingView.js + +[untyped] +.*/node_modules/@react-native-community/cli/.*/.* + +[include] + +[libs] +node_modules/react-native/interface.js +node_modules/react-native/flow/ + +[options] +emoji=true + +esproposal.optional_chaining=enable +esproposal.nullish_coalescing=enable + +exact_by_default=true + +module.file_ext=.js +module.file_ext=.json +module.file_ext=.ios.js + +munge_underscores=true + +module.name_mapper='^react-native/\(.*\)$' -> '/node_modules/react-native/\1' +module.name_mapper='^@?[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> '/node_modules/react-native/Libraries/Image/RelativeImageStub' + +suppress_type=$FlowIssue +suppress_type=$FlowFixMe +suppress_type=$FlowFixMeProps +suppress_type=$FlowFixMeState + +[lints] +sketchy-null-number=warn +sketchy-null-mixed=warn +sketchy-number=warn +untyped-type-import=warn +nonstrict-import=warn +deprecated-type=warn +unsafe-getters-setters=warn +unnecessary-invariant=warn +signature-verification-failure=warn + +[strict] +deprecated-type +nonstrict-import +sketchy-null +unclear-type +unsafe-getters-setters +untyped-import +untyped-type-import + +[version] +^0.137.0 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..45a3dcb --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +# Windows files should use crlf line endings +# https://help.github.com/articles/dealing-with-line-endings/ +*.bat text eol=crlf diff --git a/.gitignore b/.gitignore index 86d943a..03045a7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,46 +1,59 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# compiled output -/dist -/tmp -/out-tsc -# Only exists if Bazel was run -/bazel-out - -# dependencies -/node_modules - -# profiling files -chrome-profiler-events*.json -speed-measure-plugin*.json - -# IDEs and editors -/.idea -.project -.classpath -.c9/ -*.launch -.settings/ -*.sublime-workspace - -# IDE - VSCode -.vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json -!.vscode/extensions.json -.history/* - -# misc -/.sass-cache -/connect.lock -/coverage -/libpeerconnection.log +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate + +# Android/IntelliJ +# +build/ +.idea +.gradle +local.properties +*.iml + +# node.js +# +node_modules/ npm-debug.log yarn-error.log -testem.log -/typings -# System Files -.DS_Store -Thumbs.db +# BUCK +buck-out/ +\.buckd/ +*.keystore +!debug.keystore + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://docs.fastlane.tools/best-practices/source-control/ + +*/fastlane/report.xml +*/fastlane/Preview.html +*/fastlane/screenshots + +# Bundle artifact +*.jsbundle + +# CocoaPods +/ios/Pods/ diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 0000000..84196d9 --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,7 @@ +module.exports = { + bracketSpacing: false, + jsxBracketSameLine: true, + singleQuote: true, + trailingComma: 'all', + arrowParens: 'avoid', +}; diff --git a/android/app/build/intermediates/annotation_processor_list/debug/annotationProcessors.json b/.watchmanconfig similarity index 100% rename from android/app/build/intermediates/annotation_processor_list/debug/annotationProcessors.json rename to .watchmanconfig diff --git a/App.js b/App.js new file mode 100644 index 0000000..f85f38d --- /dev/null +++ b/App.js @@ -0,0 +1,112 @@ +/** + * Sample React Native App + * https://github.com/facebook/react-native + * + * @format + * @flow strict-local + */ + +import React from 'react'; +import type {Node} from 'react'; +import { + SafeAreaView, + ScrollView, + StatusBar, + StyleSheet, + Text, + useColorScheme, + View, +} from 'react-native'; + +import { + Colors, + DebugInstructions, + Header, + LearnMoreLinks, + ReloadInstructions, +} from 'react-native/Libraries/NewAppScreen'; + +const Section = ({children, title}): Node => { + const isDarkMode = useColorScheme() === 'dark'; + return ( + + + {title} + + + {children} + + + ); +}; + +const App: () => Node = () => { + const isDarkMode = useColorScheme() === 'dark'; + + const backgroundStyle = { + backgroundColor: isDarkMode ? Colors.darker : Colors.lighter, + }; + + return ( + + + +
+ +
+ Edit App.js to change this + screen and then come back to see your edits. +
+
+ +
+
+ +
+
+ Read the docs to discover what to do next: +
+ +
+ + + ); +}; + +const styles = StyleSheet.create({ + sectionContainer: { + marginTop: 32, + paddingHorizontal: 24, + }, + sectionTitle: { + fontSize: 24, + fontWeight: '600', + }, + sectionDescription: { + marginTop: 8, + fontSize: 18, + fontWeight: '400', + }, + highlight: { + fontWeight: '700', + }, +}); + +export default App; diff --git a/App.tsx b/App.tsx deleted file mode 100644 index b2f3c9d..0000000 --- a/App.tsx +++ /dev/null @@ -1,158 +0,0 @@ -import * as React from 'react'; -import { SafeAreaView, TextInput, View, StyleSheet, Button, Text, Dimensions } from 'react-native'; -import Container from "./src/component/Container"; -import CustomButton from "./src/component/CustomButton"; -import { Formik } from "formik"; -import { Validators } from "./src/utils/validators"; -interface State { - form: { - emailInputValue: string; - passwordInputValue: string; - }, - orientation: string; -} -interface Prop { } -enum InputType { - EMAIL = 'Email', - PASSWORD = 'Password' -} - -export class App extends React.Component{ - - private passwordInputRef; - - constructor(props) { - super(props); - this.state = { - form: { - emailInputValue: '', - passwordInputValue: '' - }, - orientation: 'portrait', - } - } - - componentDidMount(): void { - Dimensions.addEventListener('change', data => { - const isPortrait = data.window.height > data.window.width; - this.setState({ orientation: isPortrait ? 'portrait' : 'landscape' }); - }); - } - componentWillUnmount(): void { - Dimensions.removeEventListener('change', () => {}); - } - - updateTextInput = (val: any, type: any) => { - if (type == InputType.EMAIL) - this.setState({ form: { ...this.state.form, emailInputValue: val } }); - else if (type == InputType.PASSWORD) - this.setState({ form: { ...this.state.form, passwordInputValue: val } }); - } - - // loginButtonClicked = () => { - // console.log(this.state.emailInputValue) - // console.log(this.state.passwordInputValue) - // } - - render() { - return ( - - - Login - - { - console.log("On Submit is called"); - }}> - {(props) => { - return ( - - this.passwordInputRef.focus()} - returnKeyType={'next'} - style={this.state.orientation === 'portrait' - ? portraitStyles.textInput - : landScapeStyles.textInput} - placeholder={InputType.EMAIL} - onChangeText={props.handleChange('emailInputValue')} - editable={true} - onBlur={() => props.setFieldTouched('emailInputValue')} - value={props.values.emailInputValue} - > - - - {props.dirty && props.touched.emailInputValue ? - ({props.errors.emailInputValue}) - : null} - - - - { - if (props.isValid) { - console.log("is valid"); - } - else { - console.log("form is not valid"); - } - }} - ref={ref => this.passwordInputRef = ref} - returnKeyType={'done'} - style={this.state.orientation === 'portrait' - ? portraitStyles.textInput - : landScapeStyles.textInput} - placeholder={InputType.PASSWORD} - onChangeText={props.handleChange('passwordInputValue')} - editable={true} - value={props.values.passwordInputValue} - onBlur={() => props.setFieldTouched('passwordInputValue')} - > - - - {props.dirty && props.touched.passwordInputValue ? - ({props.errors.passwordInputValue}) - : null} - - - - {/* */} - { - if (props.isValid) { - console.log("is valid"); - props.handleSubmit; - } - else { - console.log("form is not valid", props.errors); - } - }} - title={'Login'} /> - - ) - }} - - - - ) - } -} - -const portraitStyles = StyleSheet.create({ - textInput: { - width: 300, - borderWidth: 1, - marginBottom: 10, - }, -}); - -const landScapeStyles = StyleSheet.create({ - textInput: { - ...portraitStyles.textInput, - width: 500, - }, -}); \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index d9fdc50..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 Rahul Kumar - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index 183ecf5..0000000 --- a/README.md +++ /dev/null @@ -1,188 +0,0 @@ -# reactNativeApp -To setup the environment and create the boilerplate of react native projects. - - - -## MAC User - - - install Xcode and Android Studio - - -## Setup Environment in machine - - - npm install -g react-native-cli - - - To check the version : react-native -v - - - react-native init projectName - - -## Project Structure Overview - - - android folder : It consist compiled code of android - - Ios folder : It consist compiled code of ios. - - package.json file : - - - It has dependencies i.e required for production & development. - - It has devdependencies i.e required for development only. - - -## TypeScript Setup - - install the following:- - - - react-native-typescript-transformer - - tsllint - - tslint-config-prettier - - tslint-react-recommended - - typescript - - ``` - npm i react-native-typescript-transformer tslint tslint-config-prettier tslint-react-recommended typescript - ``` - -## Add the file for the type script. - - ### Add tsconfig.json - - ``` - tsconfig.json - - { - "compilerOptions": { - "module": "commonjs", - "target": "es5", - "sourceMap": true, - "jsx": "react", - "lib": [ - "es2018", - "dom" - ], - "allowSyntheticDefaultImports": true - }, - "exclude": [ - "node_modules" - ], - "include": [ - "./src/**/*" - ] -} - ``` - - -### Add tslint.json - - ``` - - tslint.json - - { - "extends": [ - "tslint:recommended", - "tslint-config-prettier", - "tslint-plugin-prettier" - ], - "rules": { - "prettier": true, - "ordered-imports": [ - false - ], - "quotemark": [ - true, - "single", - "jsx-single", - "avoid-escape" - ], - "semicolon": [ - false, - "never" - ], - "member-access": [ - false - ], - "member-ordering": [ - false - ], - "trailing-comma": [ - true, - { - "singleline": "never", - "multiline": "always" - } - ], - "no-empty": false, - "no-submodule-imports": false, - "no-implicit-dependencies": false, - "no-constant-condition": false, - "triple-equals": [ - true, - "allow-undefined-check" - ], - "ter-indent": [ - false, - 2, - { - "SwitchCase": 1 - } - ], - "no-duplicate-imports": true, - "jsx-alignment": false, - "jsx-no-bind": true, - "jsx-no-lambda": true, - "interface-name": false, - "object-literal-sort-keys": false, - "max-classes-per-file": false - } -} - ``` - - -## To run the react-native app in android. - - ``` - react-native run-android - ``` - -## To Link assets or third party library. - - ``` - react-native.config.js - - - - module.exports = { - - 'react-native-code-push':{ - platforms:{ - android: null, - ios:null - } - } - } - - - - - - - module.exports = { - assets: ['./src/assets/fonts/'], - }; - - - - - - - - react-native link - - ``` - - - - ## To make responsive UI in react-native - - ``` - npm i react-native-responsive-screen - ``` diff --git a/android/.gradle/6.7/executionHistory/executionHistory.bin b/android/.gradle/6.7/executionHistory/executionHistory.bin deleted file mode 100644 index 638ffbd..0000000 Binary files a/android/.gradle/6.7/executionHistory/executionHistory.bin and /dev/null differ diff --git a/android/.gradle/6.7/executionHistory/executionHistory.lock b/android/.gradle/6.7/executionHistory/executionHistory.lock deleted file mode 100644 index d6ba2af..0000000 Binary files a/android/.gradle/6.7/executionHistory/executionHistory.lock and /dev/null differ diff --git a/android/.gradle/6.7/fileChanges/last-build.bin b/android/.gradle/6.7/fileChanges/last-build.bin deleted file mode 100644 index f76dd23..0000000 Binary files a/android/.gradle/6.7/fileChanges/last-build.bin and /dev/null differ diff --git a/android/.gradle/6.7/fileHashes/fileHashes.bin b/android/.gradle/6.7/fileHashes/fileHashes.bin deleted file mode 100644 index 234562e..0000000 Binary files a/android/.gradle/6.7/fileHashes/fileHashes.bin and /dev/null differ diff --git a/android/.gradle/6.7/fileHashes/fileHashes.lock b/android/.gradle/6.7/fileHashes/fileHashes.lock deleted file mode 100644 index 65caef9..0000000 Binary files a/android/.gradle/6.7/fileHashes/fileHashes.lock and /dev/null differ diff --git a/android/.gradle/6.7/fileHashes/resourceHashesCache.bin b/android/.gradle/6.7/fileHashes/resourceHashesCache.bin deleted file mode 100644 index 8eec51f..0000000 Binary files a/android/.gradle/6.7/fileHashes/resourceHashesCache.bin and /dev/null differ diff --git a/android/.gradle/6.7/gc.properties b/android/.gradle/6.7/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/android/.gradle/6.7/javaCompile/classAnalysis.bin b/android/.gradle/6.7/javaCompile/classAnalysis.bin deleted file mode 100644 index 198e440..0000000 Binary files a/android/.gradle/6.7/javaCompile/classAnalysis.bin and /dev/null differ diff --git a/android/.gradle/6.7/javaCompile/jarAnalysis.bin b/android/.gradle/6.7/javaCompile/jarAnalysis.bin deleted file mode 100644 index 84d89cf..0000000 Binary files a/android/.gradle/6.7/javaCompile/jarAnalysis.bin and /dev/null differ diff --git a/android/.gradle/6.7/javaCompile/javaCompile.lock b/android/.gradle/6.7/javaCompile/javaCompile.lock deleted file mode 100644 index 17b08d1..0000000 Binary files a/android/.gradle/6.7/javaCompile/javaCompile.lock and /dev/null differ diff --git a/android/.gradle/6.7/javaCompile/taskHistory.bin b/android/.gradle/6.7/javaCompile/taskHistory.bin deleted file mode 100644 index 4a1cb36..0000000 Binary files a/android/.gradle/6.7/javaCompile/taskHistory.bin and /dev/null differ diff --git a/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock deleted file mode 100644 index 03fde5c..0000000 Binary files a/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock and /dev/null differ diff --git a/android/.gradle/buildOutputCleanup/cache.properties b/android/.gradle/buildOutputCleanup/cache.properties deleted file mode 100644 index 64d7559..0000000 --- a/android/.gradle/buildOutputCleanup/cache.properties +++ /dev/null @@ -1,2 +0,0 @@ -#Sun Mar 21 17:32:55 IST 2021 -gradle.version=6.7 diff --git a/android/.gradle/buildOutputCleanup/outputFiles.bin b/android/.gradle/buildOutputCleanup/outputFiles.bin deleted file mode 100644 index d638aa0..0000000 Binary files a/android/.gradle/buildOutputCleanup/outputFiles.bin and /dev/null differ diff --git a/android/.gradle/checksums/checksums.lock b/android/.gradle/checksums/checksums.lock deleted file mode 100644 index 56b41eb..0000000 Binary files a/android/.gradle/checksums/checksums.lock and /dev/null differ diff --git a/android/.gradle/checksums/md5-checksums.bin b/android/.gradle/checksums/md5-checksums.bin deleted file mode 100644 index b0cd493..0000000 Binary files a/android/.gradle/checksums/md5-checksums.bin and /dev/null differ diff --git a/android/.gradle/checksums/sha1-checksums.bin b/android/.gradle/checksums/sha1-checksums.bin deleted file mode 100644 index d144683..0000000 Binary files a/android/.gradle/checksums/sha1-checksums.bin and /dev/null differ diff --git a/android/.gradle/configuration-cache/gc.properties b/android/.gradle/configuration-cache/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/android/.gradle/vcs-1/gc.properties b/android/.gradle/vcs-1/gc.properties deleted file mode 100644 index e69de29..0000000 diff --git a/android/app/BUCK b/android/app/BUCK index 5974fdf..1c9b988 100644 --- a/android/app/BUCK +++ b/android/app/BUCK @@ -35,12 +35,12 @@ android_library( android_build_config( name = "build_config", - package = "com.reactnativeapp", + package = "com.myapp", ) android_resource( name = "res", - package = "com.reactnativeapp", + package = "com.myapp", res = "src/main/res", ) diff --git a/android/app/build.gradle b/android/app/build.gradle index e637097..0b28165 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -131,7 +131,7 @@ android { } defaultConfig { - applicationId "com.reactnativeapp" + applicationId "com.myapp" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 diff --git a/android/app/build/generated/res/resValues/debug/values/gradleResValues.xml b/android/app/build/generated/res/resValues/debug/values/gradleResValues.xml deleted file mode 100644 index 562b2b9..0000000 --- a/android/app/build/generated/res/resValues/debug/values/gradleResValues.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - 8081 - - 8081 - - diff --git a/android/app/build/generated/rncli/src/main/java/com/facebook/react/PackageList.java b/android/app/build/generated/rncli/src/main/java/com/facebook/react/PackageList.java deleted file mode 100644 index 66ba416..0000000 --- a/android/app/build/generated/rncli/src/main/java/com/facebook/react/PackageList.java +++ /dev/null @@ -1,62 +0,0 @@ - -package com.facebook.react; - -import android.app.Application; -import android.content.Context; -import android.content.res.Resources; - -import com.facebook.react.ReactPackage; -import com.facebook.react.shell.MainPackageConfig; -import com.facebook.react.shell.MainReactPackage; -import java.util.Arrays; -import java.util.ArrayList; - - - -public class PackageList { - private Application application; - private ReactNativeHost reactNativeHost; - private MainPackageConfig mConfig; - - public PackageList(ReactNativeHost reactNativeHost) { - this(reactNativeHost, null); - } - - public PackageList(Application application) { - this(application, null); - } - - public PackageList(ReactNativeHost reactNativeHost, MainPackageConfig config) { - this.reactNativeHost = reactNativeHost; - mConfig = config; - } - - public PackageList(Application application, MainPackageConfig config) { - this.reactNativeHost = null; - this.application = application; - mConfig = config; - } - - private ReactNativeHost getReactNativeHost() { - return this.reactNativeHost; - } - - private Resources getResources() { - return this.getApplication().getResources(); - } - - private Application getApplication() { - if (this.reactNativeHost == null) return this.application; - return this.reactNativeHost.getApplication(); - } - - private Context getApplicationContext() { - return this.getApplication().getApplicationContext(); - } - - public ArrayList getPackages() { - return new ArrayList<>(Arrays.asList( - new MainReactPackage(mConfig) - )); - } -} diff --git a/android/app/build/generated/source/buildConfig/debug/com/reactnativeapp/BuildConfig.java b/android/app/build/generated/source/buildConfig/debug/com/reactnativeapp/BuildConfig.java deleted file mode 100644 index 5715f8a..0000000 --- a/android/app/build/generated/source/buildConfig/debug/com/reactnativeapp/BuildConfig.java +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Automatically generated file. DO NOT MODIFY - */ -package com.reactnativeapp; - -public final class BuildConfig { - public static final boolean DEBUG = Boolean.parseBoolean("true"); - public static final String APPLICATION_ID = "com.reactnativeapp"; - public static final String BUILD_TYPE = "debug"; - public static final int VERSION_CODE = 1; - public static final String VERSION_NAME = "1.0"; -} diff --git a/android/app/build/intermediates/compatible_screen_manifest/debug/output-metadata.json b/android/app/build/intermediates/compatible_screen_manifest/debug/output-metadata.json deleted file mode 100644 index 08f5dfb..0000000 --- a/android/app/build/intermediates/compatible_screen_manifest/debug/output-metadata.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "version": 2, - "artifactType": { - "type": "COMPATIBLE_SCREEN_MANIFEST", - "kind": "Directory" - }, - "applicationId": "com.reactnativeapp", - "variantName": "debug", - "elements": [] -} \ No newline at end of file diff --git a/android/app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/R.jar b/android/app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/R.jar deleted file mode 100644 index 32649dd..0000000 Binary files a/android/app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/R.jar and /dev/null differ diff --git a/android/app/build/intermediates/compressed_assets/debug/out/assets/fonts/cursive.ttf.jar b/android/app/build/intermediates/compressed_assets/debug/out/assets/fonts/cursive.ttf.jar deleted file mode 100644 index d6c9caf..0000000 Binary files a/android/app/build/intermediates/compressed_assets/debug/out/assets/fonts/cursive.ttf.jar and /dev/null differ diff --git a/android/app/build/intermediates/compressed_assets/debug/out/assets/fonts/muli.ttf.jar b/android/app/build/intermediates/compressed_assets/debug/out/assets/fonts/muli.ttf.jar deleted file mode 100644 index 7fc16fd..0000000 Binary files a/android/app/build/intermediates/compressed_assets/debug/out/assets/fonts/muli.ttf.jar and /dev/null differ diff --git a/android/app/build/intermediates/dex/debug/mergeExtDexDebug/classes.dex b/android/app/build/intermediates/dex/debug/mergeExtDexDebug/classes.dex deleted file mode 100644 index 021f497..0000000 Binary files a/android/app/build/intermediates/dex/debug/mergeExtDexDebug/classes.dex and /dev/null differ diff --git a/android/app/build/intermediates/dex/debug/mergeProjectDexDebug/classes.dex b/android/app/build/intermediates/dex/debug/mergeProjectDexDebug/classes.dex deleted file mode 100644 index 377aaca..0000000 Binary files a/android/app/build/intermediates/dex/debug/mergeProjectDexDebug/classes.dex and /dev/null differ diff --git a/android/app/build/intermediates/dex_archive_input_jar_hashes/debug/out b/android/app/build/intermediates/dex_archive_input_jar_hashes/debug/out deleted file mode 100644 index 13778bf..0000000 Binary files a/android/app/build/intermediates/dex_archive_input_jar_hashes/debug/out and /dev/null differ diff --git a/android/app/build/intermediates/dex_number_of_buckets_file/debug/out b/android/app/build/intermediates/dex_number_of_buckets_file/debug/out deleted file mode 100644 index 62f9457..0000000 --- a/android/app/build/intermediates/dex_number_of_buckets_file/debug/out +++ /dev/null @@ -1 +0,0 @@ -6 \ No newline at end of file diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/merge-state b/android/app/build/intermediates/incremental/debug-mergeJavaRes/merge-state deleted file mode 100644 index 2ef3c37..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/merge-state and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/+FvsyFGNpcqUzBRtGktPKEp70WM= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/+FvsyFGNpcqUzBRtGktPKEp70WM= deleted file mode 100644 index 5b0de3f..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/+FvsyFGNpcqUzBRtGktPKEp70WM= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/+MqLisAJWpXH2+qtB2VtPI_Oe+8= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/+MqLisAJWpXH2+qtB2VtPI_Oe+8= deleted file mode 100644 index 30185e4..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/+MqLisAJWpXH2+qtB2VtPI_Oe+8= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/0QD42SDJgXRSa7osmdS6i0g0sRk= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/0QD42SDJgXRSa7osmdS6i0g0sRk= deleted file mode 100644 index 0669512..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/0QD42SDJgXRSa7osmdS6i0g0sRk= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/0vd8+nLdHwZN77tZqFZiud39mio= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/0vd8+nLdHwZN77tZqFZiud39mio= deleted file mode 100644 index de755d1..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/0vd8+nLdHwZN77tZqFZiud39mio= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/3ZA2NPusn4wb+H0WCZdpMTfyXzA= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/3ZA2NPusn4wb+H0WCZdpMTfyXzA= deleted file mode 100644 index 33a6966..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/3ZA2NPusn4wb+H0WCZdpMTfyXzA= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/3wAfSthfGJG5YX5iNVI03TmYKXw= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/3wAfSthfGJG5YX5iNVI03TmYKXw= deleted file mode 100644 index 25e1933..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/3wAfSthfGJG5YX5iNVI03TmYKXw= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/4hyiHRObA9I_2oWJObKP9OFad1I= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/4hyiHRObA9I_2oWJObKP9OFad1I= deleted file mode 100644 index 301f098..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/4hyiHRObA9I_2oWJObKP9OFad1I= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7H0RyjyMN16rDleC12AUB8J6mO8= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7H0RyjyMN16rDleC12AUB8J6mO8= deleted file mode 100644 index f0533b7..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7H0RyjyMN16rDleC12AUB8J6mO8= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7uA1kwUd9_w0NFxnd2H8vSNITlM= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7uA1kwUd9_w0NFxnd2H8vSNITlM= deleted file mode 100644 index 6ccda32..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/7uA1kwUd9_w0NFxnd2H8vSNITlM= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/8lQFQFEfXqSqdzBbHSrubTnp8HA= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/8lQFQFEfXqSqdzBbHSrubTnp8HA= deleted file mode 100644 index 189e23f..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/8lQFQFEfXqSqdzBbHSrubTnp8HA= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/9OSptyli9ukRO1VwElqMKkuaAps= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/9OSptyli9ukRO1VwElqMKkuaAps= deleted file mode 100644 index 08e2872..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/9OSptyli9ukRO1VwElqMKkuaAps= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/9vE1dpI36TSZPo9xv2fh3OFQl4Q= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/9vE1dpI36TSZPo9xv2fh3OFQl4Q= deleted file mode 100644 index 59222d9..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/9vE1dpI36TSZPo9xv2fh3OFQl4Q= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/AclGTVZaFMTi+2qYeA6juEm9yY8= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/AclGTVZaFMTi+2qYeA6juEm9yY8= deleted file mode 100644 index 3f15ff8..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/AclGTVZaFMTi+2qYeA6juEm9yY8= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Aih9ERzZmy+1tSdPkS04KLxKRAU= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Aih9ERzZmy+1tSdPkS04KLxKRAU= deleted file mode 100644 index b2a9d0b..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Aih9ERzZmy+1tSdPkS04KLxKRAU= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/BOp+9gt14iB03o4Od9uZ0Iv6ZuU= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/BOp+9gt14iB03o4Od9uZ0Iv6ZuU= deleted file mode 100644 index d35f877..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/BOp+9gt14iB03o4Od9uZ0Iv6ZuU= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/BkxTKGEJEOJErUiDmAMtojsMZ34= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/BkxTKGEJEOJErUiDmAMtojsMZ34= deleted file mode 100644 index 5dd6acd..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/BkxTKGEJEOJErUiDmAMtojsMZ34= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/BqNXK7o1Sw8D9wZHBiZbjtjeNFc= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/BqNXK7o1Sw8D9wZHBiZbjtjeNFc= deleted file mode 100644 index 29efcdd..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/BqNXK7o1Sw8D9wZHBiZbjtjeNFc= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/DhmsklKj4GhCtEvJmardeMrItFg= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/DhmsklKj4GhCtEvJmardeMrItFg= deleted file mode 100644 index 422de52..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/DhmsklKj4GhCtEvJmardeMrItFg= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/E0yLo4ZJ+ThnH6JOkLV_I4ZacS4= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/E0yLo4ZJ+ThnH6JOkLV_I4ZacS4= deleted file mode 100644 index ba19014..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/E0yLo4ZJ+ThnH6JOkLV_I4ZacS4= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/EGWA5uUc6XtV0fcpZz5g2xCHGq8= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/EGWA5uUc6XtV0fcpZz5g2xCHGq8= deleted file mode 100644 index d3a6cfb..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/EGWA5uUc6XtV0fcpZz5g2xCHGq8= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/FMtmmsYLYPeJKHNImdpIvXJUmo4= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/FMtmmsYLYPeJKHNImdpIvXJUmo4= deleted file mode 100644 index 5283a77..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/FMtmmsYLYPeJKHNImdpIvXJUmo4= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Fsme7YeTJSPVBOLa1E8jgNA455g= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Fsme7YeTJSPVBOLa1E8jgNA455g= deleted file mode 100644 index 96690f4..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Fsme7YeTJSPVBOLa1E8jgNA455g= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Ih5dH2d9_ofG3q5WJyK61yCu+h8= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Ih5dH2d9_ofG3q5WJyK61yCu+h8= deleted file mode 100644 index 93da8e9..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Ih5dH2d9_ofG3q5WJyK61yCu+h8= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Ihcw+P4o7ZgJafihOcioVQ6DH9M= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Ihcw+P4o7ZgJafihOcioVQ6DH9M= deleted file mode 100644 index d4118d6..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Ihcw+P4o7ZgJafihOcioVQ6DH9M= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/IvO2e5P9GAHCDj0oe9tJ8S+5H3k= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/IvO2e5P9GAHCDj0oe9tJ8S+5H3k= deleted file mode 100644 index 8db9f9d..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/IvO2e5P9GAHCDj0oe9tJ8S+5H3k= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/JWyX8JJUgx0MKQx1dVhHiby4Su4= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/JWyX8JJUgx0MKQx1dVhHiby4Su4= deleted file mode 100644 index d0a17a9..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/JWyX8JJUgx0MKQx1dVhHiby4Su4= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Kj28HVKiOsCb1g5b1G0X9qHDYxA= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Kj28HVKiOsCb1g5b1G0X9qHDYxA= deleted file mode 100644 index bd40ca8..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Kj28HVKiOsCb1g5b1G0X9qHDYxA= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/LlARo_atPsA0leHXb3f3pWLKkU4= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/LlARo_atPsA0leHXb3f3pWLKkU4= deleted file mode 100644 index 8fd6cd4..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/LlARo_atPsA0leHXb3f3pWLKkU4= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/M+ORO9gQtA62zSFW88zAkMprhvY= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/M+ORO9gQtA62zSFW88zAkMprhvY= deleted file mode 100644 index f2b827a..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/M+ORO9gQtA62zSFW88zAkMprhvY= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/NatzP7u2zJjWixZwFzKQwWATeyo= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/NatzP7u2zJjWixZwFzKQwWATeyo= deleted file mode 100644 index 5e2ff47..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/NatzP7u2zJjWixZwFzKQwWATeyo= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/P0yRw+Clo2o56zp_E_01LvA6ppI= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/P0yRw+Clo2o56zp_E_01LvA6ppI= deleted file mode 100644 index f929dff..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/P0yRw+Clo2o56zp_E_01LvA6ppI= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/PLR4GuAt9UCcpOxSC759SRH1oV8= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/PLR4GuAt9UCcpOxSC759SRH1oV8= deleted file mode 100644 index 7eb6252..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/PLR4GuAt9UCcpOxSC759SRH1oV8= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Pwodq0a7Vl4qExyq8bloZU2du0E= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Pwodq0a7Vl4qExyq8bloZU2du0E= deleted file mode 100644 index 8a88caf..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Pwodq0a7Vl4qExyq8bloZU2du0E= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/TYj3ENsF1wE1DCGhJwWMiDZPmOc= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/TYj3ENsF1wE1DCGhJwWMiDZPmOc= deleted file mode 100644 index 28b9e4d..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/TYj3ENsF1wE1DCGhJwWMiDZPmOc= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/TezoSBKErCogH7fHfUNj7jkx9_0= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/TezoSBKErCogH7fHfUNj7jkx9_0= deleted file mode 100644 index 2288f6c..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/TezoSBKErCogH7fHfUNj7jkx9_0= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UNMsestvAEwCCLRZegOhYgru6kk= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UNMsestvAEwCCLRZegOhYgru6kk= deleted file mode 100644 index a64dbaa..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UNMsestvAEwCCLRZegOhYgru6kk= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/URU1AlQ3ENiZk7FdX5zU++MXhZk= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/URU1AlQ3ENiZk7FdX5zU++MXhZk= deleted file mode 100644 index 8568b5b..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/URU1AlQ3ENiZk7FdX5zU++MXhZk= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UkoRxitGrFBpV817hxASeap6RbU= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UkoRxitGrFBpV817hxASeap6RbU= deleted file mode 100644 index f28aebd..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UkoRxitGrFBpV817hxASeap6RbU= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UktqNez1WMTDs0RIoTZgfaoOaoM= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UktqNez1WMTDs0RIoTZgfaoOaoM= deleted file mode 100644 index 8a4f9eb..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/UktqNez1WMTDs0RIoTZgfaoOaoM= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/VO+cojdxztsP1pDRXVL882WeooQ= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/VO+cojdxztsP1pDRXVL882WeooQ= deleted file mode 100644 index c5edca1..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/VO+cojdxztsP1pDRXVL882WeooQ= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/WNLbO6OClT5KLsphC49q0HfJC2s= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/WNLbO6OClT5KLsphC49q0HfJC2s= deleted file mode 100644 index 2db9520..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/WNLbO6OClT5KLsphC49q0HfJC2s= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/WNlVrK6iM4vlMuYvas3DUZCC4Cc= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/WNlVrK6iM4vlMuYvas3DUZCC4Cc= deleted file mode 100644 index e717ddd..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/WNlVrK6iM4vlMuYvas3DUZCC4Cc= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/YExf6ic0mJ5Fs6F8mrT_YUgCGgU= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/YExf6ic0mJ5Fs6F8mrT_YUgCGgU= deleted file mode 100644 index 98584d6..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/YExf6ic0mJ5Fs6F8mrT_YUgCGgU= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Z9D_TBLxtFBKeheLBKfA4j34e1Q= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Z9D_TBLxtFBKeheLBKfA4j34e1Q= deleted file mode 100644 index fe4ea95..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/Z9D_TBLxtFBKeheLBKfA4j34e1Q= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/_khgd2JWdXVGblFIqmbUadmaFUs= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/_khgd2JWdXVGblFIqmbUadmaFUs= deleted file mode 100644 index 5707aa8..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/_khgd2JWdXVGblFIqmbUadmaFUs= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/_nrD6Mh2bzoC2ycUCSeeD5SYs0E= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/_nrD6Mh2bzoC2ycUCSeeD5SYs0E= deleted file mode 100644 index f26e2cf..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/_nrD6Mh2bzoC2ycUCSeeD5SYs0E= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/a6vFuvnYPEyGW4yD6FcMEewy+GY= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/a6vFuvnYPEyGW4yD6FcMEewy+GY= deleted file mode 100644 index eab8ff9..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/a6vFuvnYPEyGW4yD6FcMEewy+GY= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/cQ8fqfnvsFvekMV5mTZikJ_o+Y0= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/cQ8fqfnvsFvekMV5mTZikJ_o+Y0= deleted file mode 100644 index 2d98ee2..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/cQ8fqfnvsFvekMV5mTZikJ_o+Y0= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/dLPpgPMUxt_pV1jdFNm0f6KXwSY= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/dLPpgPMUxt_pV1jdFNm0f6KXwSY= deleted file mode 100644 index 871f0bf..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/dLPpgPMUxt_pV1jdFNm0f6KXwSY= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/dTCzTVV6P0vcfp9W91njGJ9X28M= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/dTCzTVV6P0vcfp9W91njGJ9X28M= deleted file mode 100644 index cbd222d..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/dTCzTVV6P0vcfp9W91njGJ9X28M= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/e3+P3ti9dmtIQ5LwWdEnMwQEh0A= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/e3+P3ti9dmtIQ5LwWdEnMwQEh0A= deleted file mode 100644 index aabb74b..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/e3+P3ti9dmtIQ5LwWdEnMwQEh0A= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/efrV+aVOHJrb04dTAMtSYrzit50= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/efrV+aVOHJrb04dTAMtSYrzit50= deleted file mode 100644 index fb3ddd9..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/efrV+aVOHJrb04dTAMtSYrzit50= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/mH_7zBWeUSmCFErbLxSBS8Cv0vo= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/mH_7zBWeUSmCFErbLxSBS8Cv0vo= deleted file mode 100644 index 0b3bd8b..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/mH_7zBWeUSmCFErbLxSBS8Cv0vo= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/mzjVxGRAezmEy5nC_EOtW7bjiUg= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/mzjVxGRAezmEy5nC_EOtW7bjiUg= deleted file mode 100644 index f4381a6..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/mzjVxGRAezmEy5nC_EOtW7bjiUg= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/oCc51o0wXErZAMCwsrHivMVmmTY= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/oCc51o0wXErZAMCwsrHivMVmmTY= deleted file mode 100644 index 003f3d5..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/oCc51o0wXErZAMCwsrHivMVmmTY= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/t_yFFa2RCLCauQ9cuB2bWIYh65Y= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/t_yFFa2RCLCauQ9cuB2bWIYh65Y= deleted file mode 100644 index 7c1dea3..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/t_yFFa2RCLCauQ9cuB2bWIYh65Y= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/vrV8klFFhku1uBddxYcFfPpxn4c= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/vrV8klFFhku1uBddxYcFfPpxn4c= deleted file mode 100644 index dfaf471..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/vrV8klFFhku1uBddxYcFfPpxn4c= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/wIJw2UVqdh4hg7uUkJREWiLR9VQ= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/wIJw2UVqdh4hg7uUkJREWiLR9VQ= deleted file mode 100644 index 81db71e..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/wIJw2UVqdh4hg7uUkJREWiLR9VQ= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/wf5VBm5swbnXwE_DKTUh8CohHhU= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/wf5VBm5swbnXwE_DKTUh8CohHhU= deleted file mode 100644 index 761fe3b..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/wf5VBm5swbnXwE_DKTUh8CohHhU= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/wjm99+OuGa5PEuFNIl7I6jPpsNs= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/wjm99+OuGa5PEuFNIl7I6jPpsNs= deleted file mode 100644 index a63f7e2..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/wjm99+OuGa5PEuFNIl7I6jPpsNs= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/xS_w9XK5WIvfQasr2EUyhOp8pQY= b/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/xS_w9XK5WIvfQasr2EUyhOp8pQY= deleted file mode 100644 index 1ffce77..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/xS_w9XK5WIvfQasr2EUyhOp8pQY= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/merge-state b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/merge-state deleted file mode 100644 index 2dfad21..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/merge-state and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/+FvsyFGNpcqUzBRtGktPKEp70WM= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/+FvsyFGNpcqUzBRtGktPKEp70WM= deleted file mode 100644 index 5b0de3f..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/+FvsyFGNpcqUzBRtGktPKEp70WM= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/+MqLisAJWpXH2+qtB2VtPI_Oe+8= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/+MqLisAJWpXH2+qtB2VtPI_Oe+8= deleted file mode 100644 index 30185e4..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/+MqLisAJWpXH2+qtB2VtPI_Oe+8= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/0QD42SDJgXRSa7osmdS6i0g0sRk= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/0QD42SDJgXRSa7osmdS6i0g0sRk= deleted file mode 100644 index 0669512..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/0QD42SDJgXRSa7osmdS6i0g0sRk= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/0vd8+nLdHwZN77tZqFZiud39mio= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/0vd8+nLdHwZN77tZqFZiud39mio= deleted file mode 100644 index de755d1..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/0vd8+nLdHwZN77tZqFZiud39mio= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/3ZA2NPusn4wb+H0WCZdpMTfyXzA= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/3ZA2NPusn4wb+H0WCZdpMTfyXzA= deleted file mode 100644 index 33a6966..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/3ZA2NPusn4wb+H0WCZdpMTfyXzA= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/3wAfSthfGJG5YX5iNVI03TmYKXw= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/3wAfSthfGJG5YX5iNVI03TmYKXw= deleted file mode 100644 index 25e1933..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/3wAfSthfGJG5YX5iNVI03TmYKXw= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/4hyiHRObA9I_2oWJObKP9OFad1I= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/4hyiHRObA9I_2oWJObKP9OFad1I= deleted file mode 100644 index 301f098..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/4hyiHRObA9I_2oWJObKP9OFad1I= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/7H0RyjyMN16rDleC12AUB8J6mO8= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/7H0RyjyMN16rDleC12AUB8J6mO8= deleted file mode 100644 index f0533b7..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/7H0RyjyMN16rDleC12AUB8J6mO8= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/7uA1kwUd9_w0NFxnd2H8vSNITlM= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/7uA1kwUd9_w0NFxnd2H8vSNITlM= deleted file mode 100644 index 6ccda32..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/7uA1kwUd9_w0NFxnd2H8vSNITlM= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/8lQFQFEfXqSqdzBbHSrubTnp8HA= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/8lQFQFEfXqSqdzBbHSrubTnp8HA= deleted file mode 100644 index 189e23f..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/8lQFQFEfXqSqdzBbHSrubTnp8HA= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/9OSptyli9ukRO1VwElqMKkuaAps= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/9OSptyli9ukRO1VwElqMKkuaAps= deleted file mode 100644 index 08e2872..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/9OSptyli9ukRO1VwElqMKkuaAps= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/9vE1dpI36TSZPo9xv2fh3OFQl4Q= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/9vE1dpI36TSZPo9xv2fh3OFQl4Q= deleted file mode 100644 index 59222d9..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/9vE1dpI36TSZPo9xv2fh3OFQl4Q= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/AclGTVZaFMTi+2qYeA6juEm9yY8= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/AclGTVZaFMTi+2qYeA6juEm9yY8= deleted file mode 100644 index 3f15ff8..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/AclGTVZaFMTi+2qYeA6juEm9yY8= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Aih9ERzZmy+1tSdPkS04KLxKRAU= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Aih9ERzZmy+1tSdPkS04KLxKRAU= deleted file mode 100644 index b2a9d0b..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Aih9ERzZmy+1tSdPkS04KLxKRAU= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/BOp+9gt14iB03o4Od9uZ0Iv6ZuU= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/BOp+9gt14iB03o4Od9uZ0Iv6ZuU= deleted file mode 100644 index d35f877..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/BOp+9gt14iB03o4Od9uZ0Iv6ZuU= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/BkxTKGEJEOJErUiDmAMtojsMZ34= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/BkxTKGEJEOJErUiDmAMtojsMZ34= deleted file mode 100644 index 5dd6acd..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/BkxTKGEJEOJErUiDmAMtojsMZ34= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/BqNXK7o1Sw8D9wZHBiZbjtjeNFc= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/BqNXK7o1Sw8D9wZHBiZbjtjeNFc= deleted file mode 100644 index 29efcdd..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/BqNXK7o1Sw8D9wZHBiZbjtjeNFc= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/DhmsklKj4GhCtEvJmardeMrItFg= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/DhmsklKj4GhCtEvJmardeMrItFg= deleted file mode 100644 index 422de52..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/DhmsklKj4GhCtEvJmardeMrItFg= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/E0yLo4ZJ+ThnH6JOkLV_I4ZacS4= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/E0yLo4ZJ+ThnH6JOkLV_I4ZacS4= deleted file mode 100644 index ba19014..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/E0yLo4ZJ+ThnH6JOkLV_I4ZacS4= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/EGWA5uUc6XtV0fcpZz5g2xCHGq8= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/EGWA5uUc6XtV0fcpZz5g2xCHGq8= deleted file mode 100644 index d3a6cfb..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/EGWA5uUc6XtV0fcpZz5g2xCHGq8= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/FMtmmsYLYPeJKHNImdpIvXJUmo4= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/FMtmmsYLYPeJKHNImdpIvXJUmo4= deleted file mode 100644 index 5283a77..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/FMtmmsYLYPeJKHNImdpIvXJUmo4= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Fsme7YeTJSPVBOLa1E8jgNA455g= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Fsme7YeTJSPVBOLa1E8jgNA455g= deleted file mode 100644 index 96690f4..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Fsme7YeTJSPVBOLa1E8jgNA455g= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Ih5dH2d9_ofG3q5WJyK61yCu+h8= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Ih5dH2d9_ofG3q5WJyK61yCu+h8= deleted file mode 100644 index 93da8e9..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Ih5dH2d9_ofG3q5WJyK61yCu+h8= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Ihcw+P4o7ZgJafihOcioVQ6DH9M= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Ihcw+P4o7ZgJafihOcioVQ6DH9M= deleted file mode 100644 index d4118d6..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Ihcw+P4o7ZgJafihOcioVQ6DH9M= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/IvO2e5P9GAHCDj0oe9tJ8S+5H3k= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/IvO2e5P9GAHCDj0oe9tJ8S+5H3k= deleted file mode 100644 index 8db9f9d..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/IvO2e5P9GAHCDj0oe9tJ8S+5H3k= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/JWyX8JJUgx0MKQx1dVhHiby4Su4= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/JWyX8JJUgx0MKQx1dVhHiby4Su4= deleted file mode 100644 index d0a17a9..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/JWyX8JJUgx0MKQx1dVhHiby4Su4= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Kj28HVKiOsCb1g5b1G0X9qHDYxA= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Kj28HVKiOsCb1g5b1G0X9qHDYxA= deleted file mode 100644 index bd40ca8..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Kj28HVKiOsCb1g5b1G0X9qHDYxA= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/LlARo_atPsA0leHXb3f3pWLKkU4= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/LlARo_atPsA0leHXb3f3pWLKkU4= deleted file mode 100644 index 8fd6cd4..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/LlARo_atPsA0leHXb3f3pWLKkU4= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/M+ORO9gQtA62zSFW88zAkMprhvY= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/M+ORO9gQtA62zSFW88zAkMprhvY= deleted file mode 100644 index f2b827a..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/M+ORO9gQtA62zSFW88zAkMprhvY= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/NatzP7u2zJjWixZwFzKQwWATeyo= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/NatzP7u2zJjWixZwFzKQwWATeyo= deleted file mode 100644 index 5e2ff47..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/NatzP7u2zJjWixZwFzKQwWATeyo= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/P0yRw+Clo2o56zp_E_01LvA6ppI= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/P0yRw+Clo2o56zp_E_01LvA6ppI= deleted file mode 100644 index f929dff..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/P0yRw+Clo2o56zp_E_01LvA6ppI= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/PLR4GuAt9UCcpOxSC759SRH1oV8= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/PLR4GuAt9UCcpOxSC759SRH1oV8= deleted file mode 100644 index 7eb6252..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/PLR4GuAt9UCcpOxSC759SRH1oV8= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Pwodq0a7Vl4qExyq8bloZU2du0E= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Pwodq0a7Vl4qExyq8bloZU2du0E= deleted file mode 100644 index 8a88caf..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Pwodq0a7Vl4qExyq8bloZU2du0E= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/TYj3ENsF1wE1DCGhJwWMiDZPmOc= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/TYj3ENsF1wE1DCGhJwWMiDZPmOc= deleted file mode 100644 index 28b9e4d..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/TYj3ENsF1wE1DCGhJwWMiDZPmOc= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/TezoSBKErCogH7fHfUNj7jkx9_0= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/TezoSBKErCogH7fHfUNj7jkx9_0= deleted file mode 100644 index 2288f6c..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/TezoSBKErCogH7fHfUNj7jkx9_0= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/UNMsestvAEwCCLRZegOhYgru6kk= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/UNMsestvAEwCCLRZegOhYgru6kk= deleted file mode 100644 index a64dbaa..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/UNMsestvAEwCCLRZegOhYgru6kk= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/URU1AlQ3ENiZk7FdX5zU++MXhZk= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/URU1AlQ3ENiZk7FdX5zU++MXhZk= deleted file mode 100644 index 8568b5b..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/URU1AlQ3ENiZk7FdX5zU++MXhZk= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/UkoRxitGrFBpV817hxASeap6RbU= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/UkoRxitGrFBpV817hxASeap6RbU= deleted file mode 100644 index f28aebd..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/UkoRxitGrFBpV817hxASeap6RbU= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/UktqNez1WMTDs0RIoTZgfaoOaoM= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/UktqNez1WMTDs0RIoTZgfaoOaoM= deleted file mode 100644 index 8a4f9eb..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/UktqNez1WMTDs0RIoTZgfaoOaoM= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/VO+cojdxztsP1pDRXVL882WeooQ= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/VO+cojdxztsP1pDRXVL882WeooQ= deleted file mode 100644 index c5edca1..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/VO+cojdxztsP1pDRXVL882WeooQ= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/WNLbO6OClT5KLsphC49q0HfJC2s= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/WNLbO6OClT5KLsphC49q0HfJC2s= deleted file mode 100644 index 2db9520..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/WNLbO6OClT5KLsphC49q0HfJC2s= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/WNlVrK6iM4vlMuYvas3DUZCC4Cc= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/WNlVrK6iM4vlMuYvas3DUZCC4Cc= deleted file mode 100644 index e717ddd..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/WNlVrK6iM4vlMuYvas3DUZCC4Cc= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/YExf6ic0mJ5Fs6F8mrT_YUgCGgU= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/YExf6ic0mJ5Fs6F8mrT_YUgCGgU= deleted file mode 100644 index 98584d6..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/YExf6ic0mJ5Fs6F8mrT_YUgCGgU= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Z9D_TBLxtFBKeheLBKfA4j34e1Q= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Z9D_TBLxtFBKeheLBKfA4j34e1Q= deleted file mode 100644 index fe4ea95..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/Z9D_TBLxtFBKeheLBKfA4j34e1Q= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/_khgd2JWdXVGblFIqmbUadmaFUs= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/_khgd2JWdXVGblFIqmbUadmaFUs= deleted file mode 100644 index 5707aa8..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/_khgd2JWdXVGblFIqmbUadmaFUs= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/_nrD6Mh2bzoC2ycUCSeeD5SYs0E= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/_nrD6Mh2bzoC2ycUCSeeD5SYs0E= deleted file mode 100644 index f26e2cf..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/_nrD6Mh2bzoC2ycUCSeeD5SYs0E= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/a6vFuvnYPEyGW4yD6FcMEewy+GY= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/a6vFuvnYPEyGW4yD6FcMEewy+GY= deleted file mode 100644 index eab8ff9..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/a6vFuvnYPEyGW4yD6FcMEewy+GY= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/cQ8fqfnvsFvekMV5mTZikJ_o+Y0= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/cQ8fqfnvsFvekMV5mTZikJ_o+Y0= deleted file mode 100644 index 2d98ee2..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/cQ8fqfnvsFvekMV5mTZikJ_o+Y0= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/dLPpgPMUxt_pV1jdFNm0f6KXwSY= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/dLPpgPMUxt_pV1jdFNm0f6KXwSY= deleted file mode 100644 index 871f0bf..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/dLPpgPMUxt_pV1jdFNm0f6KXwSY= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/dTCzTVV6P0vcfp9W91njGJ9X28M= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/dTCzTVV6P0vcfp9W91njGJ9X28M= deleted file mode 100644 index cbd222d..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/dTCzTVV6P0vcfp9W91njGJ9X28M= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/e3+P3ti9dmtIQ5LwWdEnMwQEh0A= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/e3+P3ti9dmtIQ5LwWdEnMwQEh0A= deleted file mode 100644 index aabb74b..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/e3+P3ti9dmtIQ5LwWdEnMwQEh0A= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/efrV+aVOHJrb04dTAMtSYrzit50= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/efrV+aVOHJrb04dTAMtSYrzit50= deleted file mode 100644 index fb3ddd9..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/efrV+aVOHJrb04dTAMtSYrzit50= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/mH_7zBWeUSmCFErbLxSBS8Cv0vo= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/mH_7zBWeUSmCFErbLxSBS8Cv0vo= deleted file mode 100644 index 0b3bd8b..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/mH_7zBWeUSmCFErbLxSBS8Cv0vo= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/mzjVxGRAezmEy5nC_EOtW7bjiUg= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/mzjVxGRAezmEy5nC_EOtW7bjiUg= deleted file mode 100644 index f4381a6..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/mzjVxGRAezmEy5nC_EOtW7bjiUg= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/oCc51o0wXErZAMCwsrHivMVmmTY= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/oCc51o0wXErZAMCwsrHivMVmmTY= deleted file mode 100644 index 003f3d5..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/oCc51o0wXErZAMCwsrHivMVmmTY= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/t_yFFa2RCLCauQ9cuB2bWIYh65Y= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/t_yFFa2RCLCauQ9cuB2bWIYh65Y= deleted file mode 100644 index 7c1dea3..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/t_yFFa2RCLCauQ9cuB2bWIYh65Y= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/vrV8klFFhku1uBddxYcFfPpxn4c= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/vrV8klFFhku1uBddxYcFfPpxn4c= deleted file mode 100644 index dfaf471..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/vrV8klFFhku1uBddxYcFfPpxn4c= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/wIJw2UVqdh4hg7uUkJREWiLR9VQ= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/wIJw2UVqdh4hg7uUkJREWiLR9VQ= deleted file mode 100644 index 81db71e..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/wIJw2UVqdh4hg7uUkJREWiLR9VQ= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/wf5VBm5swbnXwE_DKTUh8CohHhU= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/wf5VBm5swbnXwE_DKTUh8CohHhU= deleted file mode 100644 index 761fe3b..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/wf5VBm5swbnXwE_DKTUh8CohHhU= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/wjm99+OuGa5PEuFNIl7I6jPpsNs= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/wjm99+OuGa5PEuFNIl7I6jPpsNs= deleted file mode 100644 index a63f7e2..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/wjm99+OuGa5PEuFNIl7I6jPpsNs= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/xS_w9XK5WIvfQasr2EUyhOp8pQY= b/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/xS_w9XK5WIvfQasr2EUyhOp8pQY= deleted file mode 100644 index 1ffce77..0000000 Binary files a/android/app/build/intermediates/incremental/debug-mergeNativeLibs/zip-cache/xS_w9XK5WIvfQasr2EUyhOp8pQY= and /dev/null differ diff --git a/android/app/build/intermediates/incremental/mergeDebugAssets/merger.xml b/android/app/build/intermediates/incremental/mergeDebugAssets/merger.xml deleted file mode 100644 index 76b78b8..0000000 --- a/android/app/build/intermediates/incremental/mergeDebugAssets/merger.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/android/app/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml b/android/app/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml deleted file mode 100644 index 51fa789..0000000 --- a/android/app/build/intermediates/incremental/mergeDebugJniLibFolders/merger.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/android/app/build/intermediates/incremental/mergeDebugResources/compile-file-map.properties b/android/app/build/intermediates/incremental/mergeDebugResources/compile-file-map.properties deleted file mode 100644 index c6515b9..0000000 --- a/android/app/build/intermediates/incremental/mergeDebugResources/compile-file-map.properties +++ /dev/null @@ -1,11 +0,0 @@ -#Sun Mar 28 11:04:46 IST 2021 -/Users/rahul.kumar1/Documents/projects/React\ Native/myapp/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png=/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-xhdpi_ic_launcher_round.png.flat -/Users/rahul.kumar1/Documents/projects/React\ Native/myapp/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png=/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-xxxhdpi_ic_launcher_round.png.flat -/Users/rahul.kumar1/Documents/projects/React\ Native/myapp/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png=/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-xhdpi_ic_launcher.png.flat -/Users/rahul.kumar1/Documents/projects/React\ Native/myapp/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png=/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-xxhdpi_ic_launcher_round.png.flat -/Users/rahul.kumar1/Documents/projects/React\ Native/myapp/android/app/src/main/res/mipmap-hdpi/ic_launcher.png=/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-hdpi_ic_launcher.png.flat -/Users/rahul.kumar1/Documents/projects/React\ Native/myapp/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png=/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-mdpi_ic_launcher_round.png.flat -/Users/rahul.kumar1/Documents/projects/React\ Native/myapp/android/app/src/main/res/mipmap-mdpi/ic_launcher.png=/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-mdpi_ic_launcher.png.flat -/Users/rahul.kumar1/Documents/projects/React\ Native/myapp/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png=/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-xxxhdpi_ic_launcher.png.flat -/Users/rahul.kumar1/Documents/projects/React\ Native/myapp/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png=/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-hdpi_ic_launcher_round.png.flat -/Users/rahul.kumar1/Documents/projects/React\ Native/myapp/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png=/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-xxhdpi_ic_launcher.png.flat diff --git a/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values/values.xml b/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values/values.xml deleted file mode 100644 index 5cd0f0e..0000000 --- a/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values/values.xml +++ /dev/null @@ -1,3342 +0,0 @@ - - - - - - - true - false - true - @android:color/black - #7fa87f - @android:color/black - @android:color/black - @color/material_deep_teal_200 - @color/material_deep_teal_500 - @color/material_grey_800 - @android:color/white - @color/material_grey_850 - @color/material_grey_50 - #80ffffff - #80000000 - @color/bright_foreground_material_light - @color/bright_foreground_material_dark - @android:color/white - @android:color/black - #ff5a595b - #ffd6d7d7 - #ffffffff - #eecc0000 - #80bebebe - #80323232 - #ffbebebe - #ff323232 - #ff7043 - #ff5722 - @android:color/white - @android:color/black - #6680cbc4 - #66009688 - #ff37474f - #ff263238 - #ff21272b - #ff80cbc4 - #ff008577 - #fff5f5f5 - #ffe0e0e0 - #fffafafa - #ff757575 - #ff424242 - #ff303030 - #ff212121 - #ffffffff - #ff9e9e9e - @android:color/black - @color/material_grey_600 - @color/material_grey_900 - @color/material_grey_100 - #ffffffff - #de000000 - #4Dffffff - #39000000 - #33ffffff - #1f000000 - #b3ffffff - #8a000000 - #36ffffff - #24000000 - #ff616161 - #ffbdbdbd - #ffbdbdbd - #fff1f1f1 - #e6616161 - #e6FFFFFF - 16dp - 72dp - 56dp - 0dp - 0dp - 4dp - 16dp - 10dp - 6dp - 48dp - 180dp - 5dp - -3dp - 48dp - 48dp - 36dp - 48dp - 48dp - @dimen/abc_control_inset_material - 6dp - 8dp - @dimen/abc_control_padding_material - 720dp - 320dp - 2dp - 4dp - 4dp - 2dp - 80% - 100% - 320dp - 320dp - 8dp - 8dp - 65% - 95% - 24dp - 18dp - 8dp - 0.30 - 0.26 - 32dip - 8dip - 8dip - 7dp - 4dp - 10dp - 16dp - 80dp - 64dp - 48dp - @dimen/abc_action_bar_content_inset_material - 296dp - 4dp - 48dip - 320dip - 2dp - 2dp - 20dp - 3dp - 14sp - 14sp - 14sp - 12sp - 34sp - 45sp - 56sp - 112sp - 24sp - 22sp - 18sp - 14sp - 16sp - 14sp - 16sp - 16dp - 20sp - 20dp - 4dp - 6dp - 8dp - 4dp - 2dp - 320dp - 320dp - 0.30 - 0.26 - 0.26 - 0.20 - 0.12 - 0.50 - 0.38 - 0.70 - 0.54 - 32dp - 13sp - 12dp - 8dp - 64dp - 64dp - 10dp - @dimen/notification_content_margin_start - 16dp - 2dp - 3dp - 24dp - 13sp - 10dp - 5dp - 2dp - 16dp - 8dp - 8dp - 96dp - 6.5dp - 0dp - 16dp - #3333B5E5 - #0cffffff - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 220 - 150 - 127 - 150 - 8081 - 8081 - 999 - Navigate home - Navigate up - More options - Done - See all - Choose an app - OFF - ON - Alt+ - Ctrl+ - delete - enter - Function+ - Meta+ - Shift+ - space - Sym+ - Menu+ - Search… - Clear query - Search query - Search - Submit query - Voice search - Share with - Share with %s - Collapse - Alert - reactNativeApp - Button - Change Bundle Location - Copy\n - Debug - Debug with Chrome - Stop Chrome Debugging - Connecting to debugger... - Failed to connect to debugger! - Open Debugger - Stop Debugging - Open React DevTools - Dismiss\n(ESC) - Capture Heap - Enable Fast Refresh - Disabling Fast Refresh because it requires a development bundle. - Switching to development bundle in order to enable Fast Refresh. - Disable Fast Refresh - Toggle Inspector - Loading from %1$s… - Failed to open Flipper. Please check that Metro is running. - Show Perf Monitor - Hide Perf Monitor - Reload - Reload\n(R,\u00A0R) - Failed to load bundle. Try restarting the bundler or reconnecting your device. - Report - Disable Sampling Profiler - Enable Sampling Profiler - Settings - Debug Settings - Combo Box - Heading - Image - Button, Image - Link - Menu - Menu Bar - Menu Item - Progress Bar - Radio Group - Tab - Scroll Bar - Search Field - Search - Spin Button - busy - collapsed - expanded - mixed - off - on - 999+ - Summary - Tab List - Timer - Tool Bar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android/app/build/intermediates/incremental/mergeDebugResources/merger.xml b/android/app/build/intermediates/incremental/mergeDebugResources/merger.xml deleted file mode 100644 index 67a949e..0000000 --- a/android/app/build/intermediates/incremental/mergeDebugResources/merger.xml +++ /dev/null @@ -1,4263 +0,0 @@ - -@color/secondary_text_default_material_light0dp0dp12dp"999+""999+"">999""999+"4dp"999+""999+""999+""999+""999+""999+""999+""999+""999+""999+""999+""९९९+""999+""999+""999+""999+""999+""999+""999+""999+""999+""999+""999+""999+""999+"#ffffffff#ff9e9e9e#1f000000#8a0000004dp6dp8dp4dp2dp320dp320dp32dp13sp12dp8dp64dp64dp10dp@dimen/notification_content_margin_start16dp2dp3dp24dp13sp10dp5dp#3333B5E5#0cffffff999999+24dp80dp64dp8dp8dp580dp16dp20dp"Navigați la ecranul de pornire""Navigați în sus""Mai multe opțiuni""Gata""Afișați tot""Alegeți o aplicație""DEZACTIVAT""ACTIVAT""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""space""Sym+""Meniu+""Căutați…""Ștergeți interogarea""Termen de căutare""Căutați""Trimiteți interogarea""Căutare vocală""Trimiteți la""Trimiteți folosind %s""Restrângeți""Căutați""హోమ్‌కు నావిగేట్ చేస్తుంది""పైకి నావిగేట్ చేస్తుంది""మరిన్ని ఎంపికలు""పూర్తయింది""అన్నీ చూడండి""యాప్‌ను ఎంచుకోండి""ఆఫ్""ఆన్""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""స్పేస్""Sym+""Menu+""వెతకండి…""ప్రశ్నను తీసివేస్తుంది""శోధన ప్రశ్న""శోధన""ప్రశ్నని సమర్పిస్తుంది""వాయిస్ శోధన""వీరితో షేర్ చేస్తుంది""%sతో షేర్ చేస్తుంది""కుదిస్తుంది""శోధన"0px"Перейти на главный экран""Перейти вверх""Ещё""Готово""Показать все""Выберите приложение""ВЫКЛ""ВКЛ""Alt +""Ctrl +""Delete""Ввод""Fn +""Meta +""Shift +""Пробел""Sym +""Меню +""Введите запрос""Удалить запрос""Поисковый запрос""Поиск""Отправить запрос""Голосовой поиск""Поделиться с помощью""Поделиться с помощью %s""Свернуть""Поиск""Mag-navigate sa home""Mag-navigate pataas""Higit pang opsyon""Tapos na""Tingnan lahat""Pumili ng app""I-OFF""I-ON""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""space""Sym+""Menu+""Maghanap…""I-clear ang query""Query sa paghahanap""Maghanap""Isumite ang query""Paghahanap gamit ang boses""Ibahagi sa/kay""Ibahagi gamit ang %s""I-collapse""Maghanap""瀏覽首頁""向上瀏覽""更多選項""完成""查看全部""選擇應用程式""關閉""開啟""Alt +""Ctrl +""Delete 鍵""Enter 鍵""Fn +""Meta +""Shift +""空格鍵""Sym +""Menu +""搜尋…""清除查詢""搜尋查詢""搜尋""提交查詢""語音搜尋""分享對象""與「%s」分享""收合""搜尋""Portami a casa""Torna indietro""Altre opzioni""Fine""Mostra tutto""Scelta di un\'app""OFF""ON""ALT +""CTRL +""CANC""INVIO""FUNZIONE +""META +""MAIUSC +""SPAZIO""SYM +""MENU +""Cerca…""Cancella query""Query di ricerca""Cerca""Invia query""Ricerca vocale""Condividi con""Condividi tramite %s""Comprimi""Cerca""Navega a la pàgina d\'inici""Navega cap amunt""Més opcions""Fet""Mostra-ho tot""Selecciona una aplicació""DESACTIVA""ACTIVA""Alt+""Ctrl+""Supr""Retorn""Funció+""Meta+""Maj+""Espai""Sym+""Menú+""Cerca…""Esborra la consulta""Consulta de cerca""Cerca""Envia la consulta""Cerca per veu""Comparteix amb""Comparteix amb %s""Replega""Cerca""Fara heim""Fara upp""Fleiri valkostir""Lokið""Sjá allt""Veldu forrit""SLÖKKT""KVEIKT""Alt+""Ctrl+""eyða""enter""Aðgerðarlykill+""Meta+""Shift+""bilslá""Sym+""Valmynd+""Leita…""Hreinsa fyrirspurn""Leitarfyrirspurn""Leit""Senda fyrirspurn""Raddleit""Deila með""Deila með %s""Minnka""Leit""Přejít na plochu""Přejít nahoru""Více možností""Hotovo""Zobrazit vše""Vybrat aplikaci""VYP""ZAP""Alt+""Ctrl+""delete""enter""Fn+""Meta+""Shift+""mezerník""Sym+""Menu+""Vyhledat…""Smazat dotaz""Dotaz pro vyhledávání""Hledat""Odeslat dotaz""Hlasové vyhledávání""Sdílet s""Sdílet s aplikací %s""Sbalit""Hledat""转到首页""转到上一层级""更多选项""完成""查看全部""选择应用""关闭""开启""Alt+""Ctrl+""Delete 键""Enter 键""Fn+""Meta+""Shift+""空格键""Sym+""Menu+""搜索…""清除查询""搜索查询""搜索""提交查询""语音搜索""分享对象""与%s分享""收起""搜索""Tunjukkan jalan ke rumah""Kembali ke atas""Opsi lain""Selesai""Lihat semua""Pilih aplikasi""NONAKTIF""AKTIF""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""spasi""Sym+""Menu+""Telusuri...""Hapus kueri""Telusuri kueri""Telusuri""Kirim kueri""Penelusuran suara""Bagikan dengan""Bagikan dengan %s""Ciutkan""Telusuri""ホームに戻る""前に戻る""その他のオプション""完了""すべて表示""アプリの選択""OFF""ON""Alt+""Ctrl+""Delete""Enter""Function+""Meta+""Shift+""Space""Sym+""Menu+""検索…""検索キーワードを削除""検索キーワード""検索""検索キーワードを送信""音声検索""共有""%sと共有""折りたたむ""検索""Πλοήγηση στην αρχική σελίδα""Πλοήγηση προς τα επάνω""Περισσότερες επιλογές""Τέλος""Εμφάνιση όλων""Επιλέξτε μια εφαρμογή""ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ""ΕΝΕΡΓΟΠΟΙΗΣΗ""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""διάστημα""Sym+""Menu+""Αναζήτηση…""Διαγραφή ερωτήματος""Ερώτημα αναζήτησης""Αναζήτηση""Υποβολή ερωτήματος""Φωνητική αναζήτηση""Κοινοποίηση σε""Κοινοποίηση στην εφαρμογή %s""Σύμπτυξη""Αναζήτηση""นำทางไปหน้าแรก""กลับ""ตัวเลือกอื่น""เสร็จ""ดูทั้งหมด""เลือกแอป""ปิด""เปิด""Alt+""Ctrl+""ลบ""Enter""Function+""Meta+""Shift+""Space""Sym+""เมนู+""ค้นหา…""ล้างคำค้นหา""คำค้นหา""ค้นหา""ส่งคำค้นหา""ค้นหาด้วยเสียง""แชร์กับ""แชร์ทาง %s""ยุบ""ค้นหา""پیمایش به صفحه اصلی""رفتن به بالا""گزینه‌های بیشتر""تمام""دیدن همه""انتخاب برنامه""خاموش""روشن""‎Alt+‎""‎Ctrl+‎""حذف""enter""‎Function+‎""‎Meta+‎""‎Shift+‎""فاصله""‎Sym+‎""منو+""جستجو…‏""پاک کردن پُرسمان""درخواست جستجو""جستجو""ارسال پُرسمان""جستجوی گفتاری""هم‌رسانی با""هم‌رسانی با %s""کوچک کردن""جستجو""Eiti į pagrindinį puslapį""Naršyti aukštyn""Daugiau parinkčių""Atlikta""Žr. viską""Pasirinkite programą""IŠJUNGTI""ĮJUNGTI""„Alt“ +""„Ctrl“ +""„delete“""„enter“""„Function“ +""„Meta“ +""„Shift“ +""„space“""„Sym“ +""„Menu“ +""Ieškoti…""Išvalyti užklausą""Paieškos užklausa""Ieškoti""Pateikti užklausą""Paieška balsu""Bendrinti su""Bendrinti naudojant programą „%s“""Sutraukti""Ieškoti""ହୋମ୍ ପେଜ୍‌କୁ ନେଭିଗେଟ୍ କରନ୍ତୁ""ଉପରକୁ ନେଭିଗେଟ୍ କରନ୍ତୁ""ଅଧିକ ବିକଳ୍ପ""ହୋଇଗଲା""ସବୁ ଦେଖନ୍ତୁ""ଗୋଟିଏ ଆପ୍‍ ବାଛନ୍ତୁ""ଅଫ୍""ଅନ୍""Alt+""Ctrl+""ଡିଲିଟ୍‍""ଏଣ୍ଟର୍""Function+""Meta+""Shift+""ସ୍ପେସ୍‍""Sym+""ମେନୁ""ସର୍ଚ୍ଚ କରନ୍ତୁ…""କ୍ୱେରୀ ଖାଲି କରନ୍ତୁ""ସର୍ଚ୍ଚ କ୍ୱେରୀ""ସର୍ଚ୍ଚ କରନ୍ତୁ""କ୍ୱେରୀ ଦାଖଲ କରନ୍ତୁ""ଭଏସ୍‌ ସର୍ଚ୍ଚ""ଏହାଙ୍କ ସହ ସେୟାର୍‌ କରନ୍ତୁ""%s ସହ ସେୟାର୍‍ କରନ୍ତୁ""ସଂକୁଚିତ କରନ୍ତୁ""ସର୍ଚ୍ଚ କରନ୍ତୁ""Joan orri nagusira""Joan gora""Aukera gehiago""Eginda""Ikusi guztiak""Aukeratu aplikazio bat""DESAKTIBATU""AKTIBATU""Alt +""Ktrl +""ezabatu""sartu""Funtzioa +""Meta +""Maius +""zuriunea""Sym +""Menua +""Bilatu…""Garbitu kontsulta""Bilaketa-kontsulta""Bilatu""Bidali kontsulta""Ahozko bilaketa""Partekatu honekin""Partekatu %s aplikazioarekin""Tolestu""Bilatu""ກັບໄປໜ້າຫຼັກ""ເລື່ອນຂຶ້ນເທິງ""ຕົວເລືອກເພີ່ມເຕີມ""ແລ້ວໆ""ເບິ່ງທັງໝົດ""ເລືອກແອັບ""ປິດ""ເປີດ""Alt+""Ctrl+""ລຶບ""enter""Function+""Meta+""Shift+""ຍະຫວ່າງ""Sym+""Menu+""ຊອກຫາ…""ລຶບຂໍ້ຄວາມຊອກຫາ""ຄຳສຳລັບຄົ້ນຫາ""ຊອກຫາ""ສົ່ງຂໍ້ມູນ""ຊອກຫາດ້ວຍສຽງ""ແບ່ງປັນກັບ""ແບ່ງປັນດ້ວຍ %s""ຫຍໍ້ລົງ""ຊອກຫາ""ניווט לדף הבית""ניווט למעלה""עוד אפשרויות""סיום""הצגת הכול""בחירת אפליקציה""כבוי""מופעל""Alt+""Ctrl+‎""מחיקה""Enter""Function+""Meta+""Shift+""רווח""Sym+""תפריט+""חיפוש…""מחיקת השאילתה""שאילתת חיפוש""חיפוש""שליחת שאילתה""חיפוש קולי""שיתוף עם""שיתוף עם %s""כיווץ""חיפוש""Navigate home""Navigate up""More options""Done""See all""Choose an app""OFF""ON""Alt+""Ctrl+""delete""enter""Function+""Meta+""Shift+""space""Sym+""Menu+""Search…""Clear query""Search query""Search""Submit query""Voice search""Share with""Share with %s""Collapse""Search""Siirry etusivulle""Siirry ylös""Lisäasetukset""Valmis""Näytä kaikki""Valitse sovellus""POIS PÄÄLTÄ""PÄÄLLÄ""Alt+""Ctrl+""delete""enter""Fn+""Meta+""Vaihto+""välilyönti""Sym+""Valikko+""Haku…""Tyhjennä kysely""Hakukysely""Haku""Lähetä kysely""Puhehaku""Jaa…""Jaa: %s""Tiivistä""Haku"reactNativeApp80818081 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android/app/build/intermediates/incremental/mergeDebugShaders/merger.xml b/android/app/build/intermediates/incremental/mergeDebugShaders/merger.xml deleted file mode 100644 index d570fd0..0000000 --- a/android/app/build/intermediates/incremental/mergeDebugShaders/merger.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/android/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt b/android/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt deleted file mode 100644 index e3119f6..0000000 --- a/android/app/build/intermediates/incremental/packageDebug/tmp/debug/dex-renamer-state.txt +++ /dev/null @@ -1,7 +0,0 @@ -#Sun Mar 28 22:31:50 IST 2021 -base.0=/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/dex/debug/mergeExtDexDebug/classes.dex -path.1=classes.dex -renamed.1=classes2.dex -path.0=classes.dex -renamed.0=classes.dex -base.1=/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/dex/debug/mergeProjectDexDebug/classes.dex diff --git a/android/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/androidResources b/android/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/androidResources deleted file mode 100644 index c515f77..0000000 Binary files a/android/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/androidResources and /dev/null differ diff --git a/android/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/javaResources0 b/android/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/javaResources0 deleted file mode 100644 index 592f74f..0000000 Binary files a/android/app/build/intermediates/incremental/packageDebug/tmp/debug/zip-cache/javaResources0 and /dev/null differ diff --git a/android/app/build/intermediates/javac/debug/classes/com/facebook/react/PackageList.class b/android/app/build/intermediates/javac/debug/classes/com/facebook/react/PackageList.class deleted file mode 100644 index fbb55e0..0000000 Binary files a/android/app/build/intermediates/javac/debug/classes/com/facebook/react/PackageList.class and /dev/null differ diff --git a/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/BuildConfig.class b/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/BuildConfig.class deleted file mode 100644 index 783aa76..0000000 Binary files a/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/BuildConfig.class and /dev/null differ diff --git a/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/MainActivity.class b/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/MainActivity.class deleted file mode 100644 index cb0dba1..0000000 Binary files a/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/MainActivity.class and /dev/null differ diff --git a/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/MainApplication$1.class b/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/MainApplication$1.class deleted file mode 100644 index d7bfb2d..0000000 Binary files a/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/MainApplication$1.class and /dev/null differ diff --git a/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/MainApplication.class b/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/MainApplication.class deleted file mode 100644 index 366b912..0000000 Binary files a/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/MainApplication.class and /dev/null differ diff --git a/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/ReactNativeFlipper$1.class b/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/ReactNativeFlipper$1.class deleted file mode 100644 index 92574e2..0000000 Binary files a/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/ReactNativeFlipper$1.class and /dev/null differ diff --git a/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/ReactNativeFlipper$2$1.class b/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/ReactNativeFlipper$2$1.class deleted file mode 100644 index e316511..0000000 Binary files a/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/ReactNativeFlipper$2$1.class and /dev/null differ diff --git a/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/ReactNativeFlipper$2.class b/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/ReactNativeFlipper$2.class deleted file mode 100644 index 721ef71..0000000 Binary files a/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/ReactNativeFlipper$2.class and /dev/null differ diff --git a/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/ReactNativeFlipper.class b/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/ReactNativeFlipper.class deleted file mode 100644 index 600b73d..0000000 Binary files a/android/app/build/intermediates/javac/debug/classes/com/reactnativeapp/ReactNativeFlipper.class and /dev/null differ diff --git a/android/app/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt b/android/app/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt deleted file mode 100644 index 727f64b..0000000 --- a/android/app/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +++ /dev/null @@ -1,68 +0,0 @@ -1 -2 -6 -7 -10 -11 -11-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml:5:5-77 -11-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml:5:22-75 -12 -12-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:4:5-67 -12-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:4:22-64 -13 -13-->[com.facebook.flipper:flipper:0.75.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a8f6015f96666ab8d93bfe5b64998bc8/jetified-flipper-0.75.1/AndroidManifest.xml:16:5-76 -13-->[com.facebook.flipper:flipper:0.75.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a8f6015f96666ab8d93bfe5b64998bc8/jetified-flipper-0.75.1/AndroidManifest.xml:16:22-73 -14 -15 /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:6:5-24:19 -16 android:name="com.reactnativeapp.MainApplication" -16-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:7:7-38 -17 android:allowBackup="false" -17-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:11:7-34 -18 android:appComponentFactory="androidx.core.app.CoreComponentFactory" -18-->[androidx.core:core:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/AndroidManifest.xml:24:18-86 -19 android:debuggable="true" -20 android:icon="@mipmap/ic_launcher" -20-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:9:7-41 -21 android:label="@string/app_name" -21-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:8:7-39 -22 android:roundIcon="@mipmap/ic_launcher_round" -22-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:10:7-52 -23 android:theme="@style/AppTheme" -23-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:12:7-38 -24 android:usesCleartextTraffic="true" > -24-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml:8:9-44 -25 -25-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml:11:9-86 -25-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml:11:19-83 -26 /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:13:7-23:18 -27 android:name="com.reactnativeapp.MainActivity" -27-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:14:9-37 -28 android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" -28-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:16:9-86 -29 android:label="@string/app_name" -29-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:15:9-41 -30 android:launchMode="singleTask" -30-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:17:9-40 -31 android:windowSoftInputMode="adjustResize" > -31-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:18:9-51 -32 -32-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:19:9-22:25 -33 -33-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:20:13-65 -33-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:20:21-62 -34 -35 -35-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:21:13-73 -35-->/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:21:23-70 -36 -37 -38 -39 -40 diff --git a/android/app/build/intermediates/merged_assets/debug/out/fonts/cursive.ttf b/android/app/build/intermediates/merged_assets/debug/out/fonts/cursive.ttf deleted file mode 100644 index ef0bf92..0000000 Binary files a/android/app/build/intermediates/merged_assets/debug/out/fonts/cursive.ttf and /dev/null differ diff --git a/android/app/build/intermediates/merged_assets/debug/out/fonts/muli.ttf b/android/app/build/intermediates/merged_assets/debug/out/fonts/muli.ttf deleted file mode 100644 index c39e8eb..0000000 Binary files a/android/app/build/intermediates/merged_assets/debug/out/fonts/muli.ttf and /dev/null differ diff --git a/android/app/build/intermediates/merged_java_res/debug/out.jar b/android/app/build/intermediates/merged_java_res/debug/out.jar deleted file mode 100644 index 534a793..0000000 Binary files a/android/app/build/intermediates/merged_java_res/debug/out.jar and /dev/null differ diff --git a/android/app/build/intermediates/merged_manifest/debug/out/AndroidManifest.xml b/android/app/build/intermediates/merged_manifest/debug/out/AndroidManifest.xml deleted file mode 100644 index 0a9a789..0000000 --- a/android/app/build/intermediates/merged_manifest/debug/out/AndroidManifest.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android/app/build/intermediates/merged_manifests/debug/AndroidManifest.xml b/android/app/build/intermediates/merged_manifests/debug/AndroidManifest.xml deleted file mode 100644 index 0a9a789..0000000 --- a/android/app/build/intermediates/merged_manifests/debug/AndroidManifest.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android/app/build/intermediates/merged_manifests/debug/output-metadata.json b/android/app/build/intermediates/merged_manifests/debug/output-metadata.json deleted file mode 100644 index e8ef910..0000000 --- a/android/app/build/intermediates/merged_manifests/debug/output-metadata.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": 2, - "artifactType": { - "type": "MERGED_MANIFESTS", - "kind": "Directory" - }, - "applicationId": "com.reactnativeapp", - "variantName": "debug", - "elements": [ - { - "type": "SINGLE", - "filters": [], - "versionCode": 1, - "versionName": "1.0", - "outputFile": "AndroidManifest.xml" - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libc++_shared.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libc++_shared.so deleted file mode 100644 index 1b6a320..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libc++_shared.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libevent-2.1.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libevent-2.1.so deleted file mode 100644 index 630bc06..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libevent-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libevent_core-2.1.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libevent_core-2.1.so deleted file mode 100644 index 0e8df11..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libevent_core-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libevent_extra-2.1.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libevent_extra-2.1.so deleted file mode 100644 index 32cd1df..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libevent_extra-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libfb.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libfb.so deleted file mode 100644 index 92a4572..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libfb.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libfbjni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libfbjni.so deleted file mode 100644 index 73fccd5..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libfbjni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libflipper.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libflipper.so deleted file mode 100644 index 489f18e..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libflipper.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libfolly_futures.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libfolly_futures.so deleted file mode 100644 index 18ac20b..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libfolly_futures.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libfolly_json.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libfolly_json.so deleted file mode 100644 index cef1b28..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libfolly_json.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libglog.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libglog.so deleted file mode 100644 index 9c1b02c..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libglog.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libglog_init.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libglog_init.so deleted file mode 100644 index c7c0a96..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libglog_init.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-common-debug.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-common-debug.so deleted file mode 100644 index 2a50e2a..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-common-debug.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-common-release.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-common-release.so deleted file mode 100644 index f145d10..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-common-release.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-debug.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-debug.so deleted file mode 100644 index 92acb5d..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-debug.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-release.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-release.so deleted file mode 100644 index f64d612..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-release.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libhermes-inspector.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libhermes-inspector.so deleted file mode 100644 index 1981f07..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libhermes-inspector.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libimagepipeline.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libimagepipeline.so deleted file mode 100644 index aae77b7..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libimagepipeline.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libjsc.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libjsc.so deleted file mode 100644 index e997f19..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libjsc.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libjscexecutor.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libjscexecutor.so deleted file mode 100644 index ee6ff5a..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libjscexecutor.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libjsijniprofiler.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libjsijniprofiler.so deleted file mode 100644 index 7ac737b..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libjsijniprofiler.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libjsinspector.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libjsinspector.so deleted file mode 100644 index 348f20f..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libjsinspector.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libnative-filters.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libnative-filters.so deleted file mode 100644 index ecae0f1..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libnative-filters.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libnative-imagetranscoder.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libnative-imagetranscoder.so deleted file mode 100644 index 51b25af..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libnative-imagetranscoder.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreact_codegen_reactandroidspec.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreact_codegen_reactandroidspec.so deleted file mode 100644 index 72720a1..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreact_codegen_reactandroidspec.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreact_nativemodule_core.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreact_nativemodule_core.so deleted file mode 100644 index a2bda4d..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreact_nativemodule_core.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreactnativeblob.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreactnativeblob.so deleted file mode 100644 index 2bedfbf..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreactnativeblob.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreactnativejni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreactnativejni.so deleted file mode 100644 index d001162..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreactnativejni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreactnativeutilsjni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreactnativeutilsjni.so deleted file mode 100644 index 813ac9f..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreactnativeutilsjni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreactperfloggerjni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreactperfloggerjni.so deleted file mode 100644 index e9738e0..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libreactperfloggerjni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libturbomodulejsijni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libturbomodulejsijni.so deleted file mode 100644 index d023f5a..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libturbomodulejsijni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libyoga.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libyoga.so deleted file mode 100644 index c278387..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/arm64-v8a/libyoga.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libc++_shared.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libc++_shared.so deleted file mode 100644 index a64fb01..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libc++_shared.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libevent-2.1.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libevent-2.1.so deleted file mode 100644 index d659616..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libevent-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libevent_core-2.1.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libevent_core-2.1.so deleted file mode 100644 index 4a53e1d..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libevent_core-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libevent_extra-2.1.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libevent_extra-2.1.so deleted file mode 100644 index a2b8165..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libevent_extra-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libfb.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libfb.so deleted file mode 100644 index d9193ff..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libfb.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libfbjni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libfbjni.so deleted file mode 100644 index 0a0dfc6..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libfbjni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libflipper.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libflipper.so deleted file mode 100644 index 116e7c4..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libflipper.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libfolly_futures.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libfolly_futures.so deleted file mode 100644 index 2d15382..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libfolly_futures.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libfolly_json.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libfolly_json.so deleted file mode 100644 index ded9b0b..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libfolly_json.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libglog.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libglog.so deleted file mode 100644 index 6801673..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libglog.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libglog_init.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libglog_init.so deleted file mode 100644 index a0b9522..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libglog_init.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-common-debug.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-common-debug.so deleted file mode 100644 index c678458..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-common-debug.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-common-release.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-common-release.so deleted file mode 100644 index 1212076..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-common-release.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-debug.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-debug.so deleted file mode 100644 index dc8f90a..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-debug.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-release.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-release.so deleted file mode 100644 index 34195f2..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-release.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libhermes-inspector.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libhermes-inspector.so deleted file mode 100644 index 711d9d7..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libhermes-inspector.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libimagepipeline.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libimagepipeline.so deleted file mode 100644 index 907ce75..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libimagepipeline.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libjsc.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libjsc.so deleted file mode 100644 index 0b28059..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libjsc.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libjscexecutor.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libjscexecutor.so deleted file mode 100644 index 5c62e5b..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libjscexecutor.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libjsijniprofiler.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libjsijniprofiler.so deleted file mode 100644 index 881f239..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libjsijniprofiler.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libjsinspector.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libjsinspector.so deleted file mode 100644 index e71614b..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libjsinspector.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libnative-filters.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libnative-filters.so deleted file mode 100644 index 5498292..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libnative-filters.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libnative-imagetranscoder.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libnative-imagetranscoder.so deleted file mode 100644 index 971eb91..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libnative-imagetranscoder.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreact_codegen_reactandroidspec.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreact_codegen_reactandroidspec.so deleted file mode 100644 index 1640165..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreact_codegen_reactandroidspec.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreact_nativemodule_core.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreact_nativemodule_core.so deleted file mode 100644 index d274a10..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreact_nativemodule_core.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreactnativeblob.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreactnativeblob.so deleted file mode 100644 index b1d7838..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreactnativeblob.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreactnativejni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreactnativejni.so deleted file mode 100644 index 5c515c7..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreactnativejni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreactnativeutilsjni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreactnativeutilsjni.so deleted file mode 100644 index 1a21000..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreactnativeutilsjni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreactperfloggerjni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreactperfloggerjni.so deleted file mode 100644 index 2ab2300..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libreactperfloggerjni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libturbomodulejsijni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libturbomodulejsijni.so deleted file mode 100644 index ddf728d..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libturbomodulejsijni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libyoga.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libyoga.so deleted file mode 100644 index 3dc4e21..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/armeabi-v7a/libyoga.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libc++_shared.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libc++_shared.so deleted file mode 100644 index 7e9d748..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libc++_shared.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libevent-2.1.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libevent-2.1.so deleted file mode 100644 index d40e5a8..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libevent-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libevent_core-2.1.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libevent_core-2.1.so deleted file mode 100644 index fff9cbe..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libevent_core-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libevent_extra-2.1.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libevent_extra-2.1.so deleted file mode 100644 index cd22d2e..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libevent_extra-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libfb.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libfb.so deleted file mode 100644 index ec549b8..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libfb.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libfbjni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libfbjni.so deleted file mode 100644 index e8187bf..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libfbjni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libflipper.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libflipper.so deleted file mode 100644 index 501262e..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libflipper.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libfolly_futures.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libfolly_futures.so deleted file mode 100644 index 5ab22ec..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libfolly_futures.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libfolly_json.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libfolly_json.so deleted file mode 100644 index 5da69c4..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libfolly_json.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libglog.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libglog.so deleted file mode 100644 index d557551..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libglog.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libglog_init.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libglog_init.so deleted file mode 100644 index 4817f31..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libglog_init.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libhermes-executor-common-debug.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libhermes-executor-common-debug.so deleted file mode 100644 index 0c95e68..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libhermes-executor-common-debug.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libhermes-executor-common-release.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libhermes-executor-common-release.so deleted file mode 100644 index 845a385..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libhermes-executor-common-release.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libhermes-executor-debug.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libhermes-executor-debug.so deleted file mode 100644 index b431c0f..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libhermes-executor-debug.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libhermes-executor-release.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libhermes-executor-release.so deleted file mode 100644 index 88dc869..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libhermes-executor-release.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libhermes-inspector.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libhermes-inspector.so deleted file mode 100644 index b6233af..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libhermes-inspector.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libimagepipeline.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libimagepipeline.so deleted file mode 100644 index bc71e1a..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libimagepipeline.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libjsc.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libjsc.so deleted file mode 100644 index 2bbf435..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libjsc.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libjscexecutor.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libjscexecutor.so deleted file mode 100644 index 9f6b05c..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libjscexecutor.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libjsijniprofiler.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libjsijniprofiler.so deleted file mode 100644 index ff9041b..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libjsijniprofiler.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libjsinspector.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libjsinspector.so deleted file mode 100644 index 3a1b591..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libjsinspector.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libnative-filters.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libnative-filters.so deleted file mode 100644 index 181efc8..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libnative-filters.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libnative-imagetranscoder.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libnative-imagetranscoder.so deleted file mode 100644 index 30d79c3..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libnative-imagetranscoder.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreact_codegen_reactandroidspec.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreact_codegen_reactandroidspec.so deleted file mode 100644 index de863ca..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreact_codegen_reactandroidspec.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreact_nativemodule_core.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreact_nativemodule_core.so deleted file mode 100644 index d7b5732..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreact_nativemodule_core.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreactnativeblob.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreactnativeblob.so deleted file mode 100644 index 043619e..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreactnativeblob.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreactnativejni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreactnativejni.so deleted file mode 100644 index ea0b4db..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreactnativejni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreactnativeutilsjni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreactnativeutilsjni.so deleted file mode 100644 index fee37ae..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreactnativeutilsjni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreactperfloggerjni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreactperfloggerjni.so deleted file mode 100644 index 81effd9..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libreactperfloggerjni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libturbomodulejsijni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libturbomodulejsijni.so deleted file mode 100644 index e24691f..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libturbomodulejsijni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libyoga.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libyoga.so deleted file mode 100644 index 9ca6478..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86/libyoga.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libc++_shared.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libc++_shared.so deleted file mode 100644 index ee3c65a..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libc++_shared.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libevent-2.1.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libevent-2.1.so deleted file mode 100644 index 786d905..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libevent-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libevent_core-2.1.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libevent_core-2.1.so deleted file mode 100644 index 9c2f60e..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libevent_core-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libevent_extra-2.1.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libevent_extra-2.1.so deleted file mode 100644 index 0b6d363..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libevent_extra-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libfb.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libfb.so deleted file mode 100644 index e1257cd..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libfb.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libfbjni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libfbjni.so deleted file mode 100644 index 65bb4ae..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libfbjni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libflipper.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libflipper.so deleted file mode 100644 index 5cce668..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libflipper.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libfolly_futures.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libfolly_futures.so deleted file mode 100644 index be4b4f5..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libfolly_futures.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libfolly_json.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libfolly_json.so deleted file mode 100644 index 16d5b45..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libfolly_json.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libglog.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libglog.so deleted file mode 100644 index 9c6a929..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libglog.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libglog_init.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libglog_init.so deleted file mode 100644 index f389e36..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libglog_init.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libhermes-executor-common-debug.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libhermes-executor-common-debug.so deleted file mode 100644 index b471f79..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libhermes-executor-common-debug.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libhermes-executor-common-release.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libhermes-executor-common-release.so deleted file mode 100644 index 881b30e..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libhermes-executor-common-release.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libhermes-executor-debug.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libhermes-executor-debug.so deleted file mode 100644 index 1f3cf91..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libhermes-executor-debug.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libhermes-executor-release.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libhermes-executor-release.so deleted file mode 100644 index d68130c..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libhermes-executor-release.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libhermes-inspector.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libhermes-inspector.so deleted file mode 100644 index 406963d..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libhermes-inspector.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libimagepipeline.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libimagepipeline.so deleted file mode 100644 index 29b7911..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libimagepipeline.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libjsc.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libjsc.so deleted file mode 100644 index 2016ced..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libjsc.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libjscexecutor.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libjscexecutor.so deleted file mode 100644 index d99f0b4..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libjscexecutor.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libjsijniprofiler.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libjsijniprofiler.so deleted file mode 100644 index 3a92291..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libjsijniprofiler.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libjsinspector.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libjsinspector.so deleted file mode 100644 index 39d83de..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libjsinspector.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libnative-filters.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libnative-filters.so deleted file mode 100644 index 4b5fc20..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libnative-filters.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libnative-imagetranscoder.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libnative-imagetranscoder.so deleted file mode 100644 index 1dec96b..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libnative-imagetranscoder.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreact_codegen_reactandroidspec.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreact_codegen_reactandroidspec.so deleted file mode 100644 index 42caba6..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreact_codegen_reactandroidspec.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreact_nativemodule_core.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreact_nativemodule_core.so deleted file mode 100644 index e059b90..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreact_nativemodule_core.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreactnativeblob.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreactnativeblob.so deleted file mode 100644 index af4bbf4..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreactnativeblob.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreactnativejni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreactnativejni.so deleted file mode 100644 index b982b21..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreactnativejni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreactnativeutilsjni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreactnativeutilsjni.so deleted file mode 100644 index aa0bf94..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreactnativeutilsjni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreactperfloggerjni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreactperfloggerjni.so deleted file mode 100644 index e060913..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libreactperfloggerjni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libturbomodulejsijni.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libturbomodulejsijni.so deleted file mode 100644 index 519f08e..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libturbomodulejsijni.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libyoga.so b/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libyoga.so deleted file mode 100644 index b5612bb..0000000 Binary files a/android/app/build/intermediates/merged_native_libs/debug/out/lib/x86_64/libyoga.so and /dev/null differ diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/debug.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/debug.json deleted file mode 100644 index 0d0c03b..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/debug.json +++ /dev/null @@ -1,3211 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-v24_values-v24.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v24/values-v24.xml", - "from": { - "startLines": "2,3", - "startColumns": "4,4", - "startOffsets": "55,212", - "endColumns": "156,134", - "endOffsets": "207,342" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-ka_values-ka.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ka/values-ka.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2889", - "endColumns": "100", - "endOffsets": "2985" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ka/values-ka.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,316,427,513,618,731,814,894,985,1077,1172,1266,1367,1460,1555,1650,1741,1832,1912,2025,2131,2229,2342,2447,2551,2709,2808", - "endColumns": "107,102,110,85,104,112,82,79,90,91,94,93,100,92,94,94,90,90,79,112,105,97,112,104,103,157,98,80", - "endOffsets": "208,311,422,508,613,726,809,889,980,1072,1167,1261,1362,1455,1550,1645,1736,1827,1907,2020,2126,2224,2337,2442,2546,2704,2803,2884" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-pt_values-pt.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-pt/values-pt.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,331,438,527,628,747,832,913,1004,1096,1191,1285,1386,1479,1574,1669,1760,1851,1935,2042,2153,2255,2363,2471,2581,2743,2843", - "endColumns": "119,105,106,88,100,118,84,80,90,91,94,93,100,92,94,94,90,90,83,106,110,101,107,107,109,161,99,84", - "endOffsets": "220,326,433,522,623,742,827,908,999,1091,1186,1280,1381,1474,1569,1664,1755,1846,1930,2037,2148,2250,2358,2466,2576,2738,2838,2923" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-pt/values-pt.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2928", - "endColumns": "100", - "endOffsets": "3024" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-tl_values-tl.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-tl/values-tl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,324,437,525,631,746,826,904,995,1087,1182,1276,1377,1470,1565,1659,1750,1841,1924,2033,2143,2244,2354,2472,2580,2743,2845", - "endColumns": "110,107,112,87,105,114,79,77,90,91,94,93,100,92,94,93,90,90,82,108,109,100,109,117,107,162,101,83", - "endOffsets": "211,319,432,520,626,741,821,899,990,1082,1177,1271,1372,1465,1560,1654,1745,1836,1919,2028,2138,2239,2349,2467,2575,2738,2840,2924" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-tl/values-tl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2929", - "endColumns": "100", - "endOffsets": "3025" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-in_values-in.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-in/values-in.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,220,324,429,516,620,736,819,898,989,1081,1176,1270,1371,1464,1559,1653,1744,1835,1920,2023,2128,2229,2333,2442,2550,2710,2809", - "endColumns": "114,103,104,86,103,115,82,78,90,91,94,93,100,92,94,93,90,90,84,102,104,100,103,108,107,159,98,83", - "endOffsets": "215,319,424,511,615,731,814,893,984,1076,1171,1265,1366,1459,1554,1648,1739,1830,1915,2018,2123,2224,2328,2437,2545,2705,2804,2888" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-in/values-in.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2893", - "endColumns": "100", - "endOffsets": "2989" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-hr_values-hr.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-hr/values-hr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2900", - "endColumns": "100", - "endOffsets": "2996" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-hr/values-hr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,305,412,498,602,721,806,889,980,1072,1167,1261,1362,1455,1550,1645,1736,1827,1912,2016,2128,2229,2334,2448,2550,2719,2816", - "endColumns": "104,94,106,85,103,118,84,82,90,91,94,93,100,92,94,94,90,90,84,103,111,100,104,113,101,168,96,83", - "endOffsets": "205,300,407,493,597,716,801,884,975,1067,1162,1256,1357,1450,1545,1640,1731,1822,1907,2011,2123,2224,2329,2443,2545,2714,2811,2895" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-hi_values-hi.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-hi/values-hi.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,211,309,419,505,607,728,806,884,975,1067,1162,1256,1357,1450,1545,1639,1730,1821,1901,2006,2108,2206,2316,2419,2528,2686,2787", - "endColumns": "105,97,109,85,101,120,77,77,90,91,94,93,100,92,94,93,90,90,79,104,101,97,109,102,108,157,100,80", - "endOffsets": "206,304,414,500,602,723,801,879,970,1062,1157,1251,1352,1445,1540,1634,1725,1816,1896,2001,2103,2201,2311,2414,2523,2681,2782,2863" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-hi/values-hi.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2868", - "endColumns": "100", - "endOffsets": "2964" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-iw_values-iw.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-iw/values-iw.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,310,418,502,604,720,799,878,969,1062,1156,1250,1351,1444,1539,1632,1723,1815,1895,2000,2103,2201,2306,2408,2510,2664,2761", - "endColumns": "104,99,107,83,101,115,78,78,90,92,93,93,100,92,94,92,90,91,79,104,102,97,104,101,101,153,96,80", - "endOffsets": "205,305,413,497,599,715,794,873,964,1057,1151,1245,1346,1439,1534,1627,1718,1810,1890,1995,2098,2196,2301,2403,2505,2659,2756,2837" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-iw/values-iw.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2842", - "endColumns": "100", - "endOffsets": "2938" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-fi_values-fi.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-fi/values-fi.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,313,422,508,613,731,817,897,988,1080,1175,1269,1364,1457,1553,1652,1743,1837,1916,2023,2124,2221,2327,2427,2525,2675,2775", - "endColumns": "107,99,108,85,104,117,85,79,90,91,94,93,94,92,95,98,90,93,78,106,100,96,105,99,97,149,99,79", - "endOffsets": "208,308,417,503,608,726,812,892,983,1075,1170,1264,1359,1452,1548,1647,1738,1832,1911,2018,2119,2216,2322,2422,2520,2670,2770,2850" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-fi/values-fi.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2855", - "endColumns": "100", - "endOffsets": "2951" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-v28_values-v28.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v28/values-v28.xml", - "from": { - "startLines": "2,3,4,8", - "startColumns": "4,4,4,4", - "startOffsets": "55,130,217,447", - "endLines": "2,3,7,11", - "endColumns": "74,86,12,12", - "endOffsets": "125,212,442,684" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-lo_values-lo.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-lo/values-lo.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2853", - "endColumns": "100", - "endOffsets": "2949" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-lo/values-lo.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,311,424,509,613,724,802,880,971,1063,1155,1249,1350,1443,1538,1634,1725,1816,1896,2003,2107,2205,2308,2412,2516,2673,2772", - "endColumns": "102,102,112,84,103,110,77,77,90,91,91,93,100,92,94,95,90,90,79,106,103,97,102,103,103,156,98,80", - "endOffsets": "203,306,419,504,608,719,797,875,966,1058,1150,1244,1345,1438,1533,1629,1720,1811,1891,1998,2102,2200,2303,2407,2511,2668,2767,2848" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values_values.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values/values.xml", - "from": { - "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", - "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", - "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" - }, - "to": { - "startLines": "51,52,151,152,153,154,155,156,157,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,190,191,192,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,238,239,244,245,246,247,248,249,250,251,252,253,254,264,345,1725,1726,1730,1731,1735,1918,1919", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "3403,3472,10253,10323,10391,10463,10533,10594,10668,11525,11586,11647,11709,11773,11835,11896,11964,12064,12124,12190,12263,12332,12389,12441,12956,13028,13104,13220,13279,13338,13398,13458,13518,13578,13638,13698,13758,13818,13878,13938,13997,14057,14117,14177,14237,14297,14357,14417,14477,14537,14597,14656,14716,14776,14835,14894,14953,15012,15071,15738,15773,15993,16048,16111,16166,16224,16281,16331,16392,16449,16483,16518,17063,24214,115506,115623,115824,115934,116135,129806,129878", - "endLines": "51,52,151,152,153,154,155,156,157,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,190,191,192,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,238,239,244,245,246,247,248,249,250,251,252,253,254,264,345,1725,1729,1730,1734,1735,1918,1919", - "endColumns": "68,62,69,67,71,69,60,73,72,60,60,61,63,61,60,67,99,59,65,72,68,56,51,61,71,75,64,58,58,59,59,59,59,59,59,59,59,59,59,58,59,59,59,59,59,59,59,59,59,59,58,59,59,58,58,58,58,58,58,34,34,54,62,54,57,56,49,60,56,33,34,34,69,70,116,12,109,12,128,71,66", - "endOffsets": "3467,3530,10318,10386,10458,10528,10589,10663,10736,11581,11642,11704,11768,11830,11891,11959,12059,12119,12185,12258,12327,12384,12436,12498,13023,13099,13164,13274,13333,13393,13453,13513,13573,13633,13693,13753,13813,13873,13933,13992,14052,14112,14172,14232,14292,14352,14412,14472,14532,14592,14651,14711,14771,14830,14889,14948,15007,15066,15125,15768,15803,16043,16106,16161,16219,16276,16326,16387,16444,16478,16513,16548,17128,24280,115618,115819,115929,116130,116259,129873,129940" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a56511b037fb04f244c71df782e66ef7/jetified-react-native-0.64.0/res/values/values.xml", - "from": { - "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", - "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", - "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" - }, - "to": { - "startLines": "27,28,193,226,227,228,229,230,242,256,257,292,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,340,341,342,343,344,346,347,348,349,355,359,1434,1437,1440,1444,1663,1666,1742,1772,1773,1782,1789,1796,1799,1802,1805,1920", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "1924,1987,13169,15130,15178,15227,15275,15324,15904,16585,16639,18999,19124,19199,19322,19418,19507,19615,19732,19852,19972,20074,20177,20288,20395,20498,20609,20778,20946,21063,21167,21280,21436,21544,21657,21748,21859,22028,22126,22253,22378,22473,22580,22660,22736,22809,22896,22967,23038,23116,23196,23282,23366,23438,23520,23654,23738,23815,23902,23987,24066,24141,24285,24362,24440,24513,25033,25281,93395,93598,93789,93991,109402,109603,116692,118874,118909,119447,119865,120243,120420,120599,120782,129945", - "endLines": "27,28,193,226,227,228,229,230,242,256,257,292,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,340,341,342,343,344,346,347,348,349,358,362,1436,1439,1443,1447,1665,1668,1742,1772,1781,1788,1795,1798,1801,1804,1810,1929", - "endColumns": "62,62,50,47,48,47,48,48,42,53,47,72,74,122,95,88,107,116,119,119,101,102,110,106,102,110,168,167,116,103,112,155,107,112,90,110,168,97,126,124,94,106,79,75,72,86,70,70,77,79,85,83,71,81,80,83,76,86,84,78,74,72,76,77,72,77,10,10,12,12,10,10,12,12,25,34,10,10,10,10,10,12,12,10", - "endOffsets": "1982,2045,13215,15173,15222,15270,15319,15368,15942,16634,16682,19067,19194,19317,19413,19502,19610,19727,19847,19967,20069,20172,20283,20390,20493,20604,20773,20941,21058,21162,21275,21431,21539,21652,21743,21854,22023,22121,22248,22373,22468,22575,22655,22731,22804,22891,22962,23033,23111,23191,23277,23361,23433,23515,23596,23733,23810,23897,23982,24061,24136,24209,24357,24435,24508,24586,25276,25524,93593,93784,93986,94192,109598,109787,116713,118904,119442,119860,120238,120415,120594,120777,121142,130381" - } - }, - { - "source": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/generated/res/resValues/debug/values/gradleResValues.xml", - "from": { - "startLines": "-1,-1", - "startColumns": "-1,-1", - "startOffsets": "-1,-1" - }, - "to": { - "startLines": "262,263", - "startColumns": "4,4", - "startOffsets": "16930,16994", - "endColumns": "63,68", - "endOffsets": "16989,17058" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a8f6015f96666ab8d93bfe5b64998bc8/jetified-flipper-0.75.1/res/values/values.xml", - "from": { - "startLines": "-1,-1", - "startColumns": "-1,-1", - "startOffsets": "-1,-1" - }, - "to": { - "startLines": "235,236", - "startColumns": "4,4", - "startOffsets": "15578,15647", - "endColumns": "68,56", - "endOffsets": "15642,15699" - } - }, - { - "source": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/res/values/styles.xml", - "from": { - "startLines": "-1", - "startColumns": "-1", - "startOffsets": "-1" - }, - "to": { - "startLines": "363", - "startColumns": "4", - "startOffsets": "25529", - "endLines": "366", - "endColumns": "12", - "endOffsets": "25674" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values/values.xml", - "from": { - "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", - "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", - "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" - }, - "to": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,158,159,160,161,162,163,164,165,166,182,183,184,185,186,187,188,189,231,232,233,234,237,240,241,243,255,258,259,260,261,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,337,350,351,352,353,354,367,375,376,380,384,388,393,399,406,410,414,419,423,427,431,435,439,443,449,453,459,463,469,473,478,482,485,489,495,499,505,509,515,518,522,526,530,534,538,539,540,541,544,547,550,553,557,558,559,560,561,564,566,568,570,575,576,580,586,590,591,593,604,605,609,615,619,620,621,625,652,656,657,661,689,859,885,1056,1082,1113,1121,1127,1141,1163,1168,1173,1183,1192,1201,1205,1212,1220,1227,1228,1237,1240,1243,1247,1251,1255,1258,1259,1264,1269,1279,1284,1291,1297,1298,1301,1305,1310,1312,1314,1317,1320,1322,1326,1329,1336,1339,1342,1346,1348,1352,1354,1356,1358,1362,1370,1378,1390,1396,1405,1408,1419,1422,1423,1428,1429,1448,1517,1587,1588,1598,1607,1608,1610,1614,1617,1620,1623,1626,1629,1632,1635,1639,1642,1645,1648,1652,1655,1659,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1691,1693,1694,1695,1696,1697,1698,1699,1700,1702,1703,1705,1706,1708,1710,1711,1713,1714,1715,1716,1717,1718,1720,1721,1722,1723,1724,1736,1738,1740,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1757,1758,1759,1760,1761,1762,1764,1768,1811,1812,1813,1814,1815,1816,1820,1821,1822,1823,1825,1827,1829,1831,1833,1834,1835,1836,1838,1840,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1856,1857,1858,1859,1861,1863,1864,1866,1867,1869,1871,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1886,1887,1888,1889,1891,1892,1893,1894,1895,1897,1899,1901,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "150,205,250,299,340,395,454,516,597,658,733,809,886,964,1049,1131,1207,1283,1360,1438,1544,1650,1729,1809,1866,2050,2124,2199,2264,2330,2390,2451,2523,2596,2663,2731,2790,2849,2908,2967,3026,3080,3134,3187,3241,3295,3349,3535,3609,3688,3761,3835,3906,3978,4050,4123,4180,4238,4311,4385,4459,4534,4606,4679,4749,4820,4880,4941,5010,5079,5149,5223,5299,5363,5440,5516,5593,5658,5727,5804,5879,5948,6016,6093,6159,6220,6317,6382,6451,6550,6621,6680,6738,6795,6854,6918,6989,7061,7133,7205,7277,7344,7412,7480,7539,7602,7666,7756,7847,7907,7973,8040,8106,8176,8240,8293,8360,8421,8488,8601,8659,8722,8787,8852,8927,9000,9072,9121,9182,9243,9304,9366,9430,9494,9558,9623,9686,9746,9807,9873,9932,9992,10054,10125,10185,10741,10827,10914,11004,11091,11179,11261,11344,11434,12503,12555,12613,12658,12724,12788,12845,12902,15373,15430,15478,15527,15704,15808,15855,15947,16553,16687,16751,16813,16873,17133,17207,17277,17355,17409,17479,17564,17612,17658,17719,17782,17848,17912,17983,18046,18111,18175,18236,18297,18349,18422,18496,18565,18640,18714,18788,18929,23601,24591,24669,24759,24847,24943,25679,26261,26350,26597,26878,27130,27415,27808,28285,28507,28729,29005,29232,29462,29692,29922,30152,30379,30798,31024,31449,31679,32107,32326,32609,32817,32948,33175,33601,33826,34253,34474,34899,35019,35295,35596,35920,36211,36525,36662,36793,36898,37140,37307,37511,37719,37990,38102,38214,38319,38436,38650,38796,38936,39022,39370,39458,39704,40122,40371,40453,40551,41143,41243,41495,41919,42174,42268,42357,42594,44618,44860,44962,45215,47371,57903,59419,70050,71578,73335,73961,74381,75442,76707,76963,77199,77746,78240,78845,79043,79623,80187,80562,80680,81218,81375,81571,81844,82100,82270,82411,82475,82840,83207,83883,84147,84485,84838,84932,85118,85424,85686,85811,85938,86177,86388,86507,86700,86877,87332,87513,87635,87894,88007,88194,88296,88403,88532,88807,89315,89811,90688,90982,91552,91701,92433,92605,92689,93025,93117,94197,99443,104832,104894,105472,106056,106147,106260,106489,106649,106801,106972,107138,107307,107474,107637,107880,108050,108223,108394,108668,108867,109072,109792,109876,109972,110068,110166,110266,110368,110470,110572,110674,110776,110876,110972,111084,111213,111336,111467,111598,111696,111810,111904,112044,112178,112274,112386,112486,112602,112698,112810,112910,113050,113186,113350,113480,113638,113788,113929,114073,114208,114320,114470,114598,114726,114862,114994,115124,115254,115366,116264,116410,116554,116718,116784,116874,116950,117054,117144,117246,117354,117462,117562,117642,117734,117832,117942,118020,118126,118218,118322,118432,118554,118717,121147,121227,121327,121417,121527,121617,121858,121952,122058,122150,122250,122362,122476,122592,122708,122802,122916,123028,123130,123250,123372,123454,123558,123678,123804,123902,123996,124084,124196,124312,124434,124546,124721,124837,124923,125015,125127,125251,125318,125444,125512,125640,125784,125912,125981,126076,126191,126304,126403,126512,126623,126734,126835,126940,127040,127170,127261,127384,127478,127590,127676,127780,127876,127964,128082,128186,128290,128416,128504,128612,128712,128802,128912,128996,129098,129182,129236,129300,129406,129492,129602,129686", - "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,158,159,160,161,162,163,164,165,166,182,183,184,185,186,187,188,189,231,232,233,234,237,240,241,243,255,258,259,260,261,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,337,350,351,352,353,354,374,375,379,383,387,392,398,405,409,413,418,422,426,430,434,438,442,448,452,458,462,468,472,477,481,484,488,494,498,504,508,514,517,521,525,529,533,537,538,539,540,543,546,549,552,556,557,558,559,560,563,565,567,569,574,575,579,585,589,590,592,603,604,608,614,618,619,620,624,651,655,656,660,688,858,884,1055,1081,1112,1120,1126,1140,1162,1167,1172,1182,1191,1200,1204,1211,1219,1226,1227,1236,1239,1242,1246,1250,1254,1257,1258,1263,1268,1278,1283,1290,1296,1297,1300,1304,1309,1311,1313,1316,1319,1321,1325,1328,1335,1338,1341,1345,1347,1351,1353,1355,1357,1361,1369,1377,1389,1395,1404,1407,1418,1421,1422,1427,1428,1433,1516,1586,1587,1597,1606,1607,1609,1613,1616,1619,1622,1625,1628,1631,1634,1638,1641,1644,1647,1651,1654,1658,1662,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1690,1692,1693,1694,1695,1696,1697,1698,1699,1701,1702,1704,1705,1707,1709,1710,1712,1713,1714,1715,1716,1717,1719,1720,1721,1722,1723,1724,1737,1739,1741,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1756,1757,1758,1759,1760,1761,1763,1767,1771,1811,1812,1813,1814,1815,1819,1820,1821,1822,1824,1826,1828,1830,1832,1833,1834,1835,1837,1839,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1855,1856,1857,1858,1860,1862,1863,1865,1866,1868,1870,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1885,1886,1887,1888,1890,1891,1892,1893,1894,1896,1898,1900,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917", - "endColumns": "54,44,48,40,54,58,61,80,60,74,75,76,77,84,81,75,75,76,77,105,105,78,79,56,57,73,74,64,65,59,60,71,72,66,67,58,58,58,58,58,53,53,52,53,53,53,53,73,78,72,73,70,71,71,72,56,57,72,73,73,74,71,72,69,70,59,60,68,68,69,73,75,63,76,75,76,64,68,76,74,68,67,76,65,60,96,64,68,98,70,58,57,56,58,63,70,71,71,71,71,66,67,67,58,62,63,89,90,59,65,66,65,69,63,52,66,60,66,112,57,62,64,64,74,72,71,48,60,60,60,61,63,63,63,64,62,59,60,65,58,59,61,70,59,67,85,86,89,86,87,81,82,89,90,51,57,44,65,63,56,56,53,56,47,48,50,33,46,48,45,31,63,61,59,56,73,69,77,53,69,84,47,45,60,62,65,63,70,62,64,63,60,60,51,72,73,68,74,73,73,140,69,52,77,89,87,95,89,12,88,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,136,130,104,12,12,12,12,12,111,111,104,116,12,12,12,12,12,87,12,12,12,81,12,12,99,12,12,12,93,88,12,12,12,101,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,117,12,12,12,12,12,12,12,63,12,12,12,12,12,12,93,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,12,91,12,12,12,61,12,12,90,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,95,95,97,99,101,101,101,101,101,99,95,111,128,122,130,130,97,113,93,12,12,95,111,99,115,95,111,99,12,135,12,129,12,12,140,12,134,111,149,127,127,12,131,129,129,111,139,12,12,12,65,89,75,103,89,101,107,107,99,79,91,97,12,77,105,91,103,109,12,12,12,79,99,89,109,89,12,93,105,91,12,12,12,12,12,93,113,111,12,12,12,81,103,119,125,97,93,87,111,115,121,111,12,115,85,91,12,12,66,12,67,12,12,12,68,94,114,112,98,108,110,110,100,104,99,12,90,122,93,12,85,103,95,87,12,12,12,12,87,107,99,89,109,83,101,83,53,63,105,85,109,83,119", - "endOffsets": "200,245,294,335,390,449,511,592,653,728,804,881,959,1044,1126,1202,1278,1355,1433,1539,1645,1724,1804,1861,1919,2119,2194,2259,2325,2385,2446,2518,2591,2658,2726,2785,2844,2903,2962,3021,3075,3129,3182,3236,3290,3344,3398,3604,3683,3756,3830,3901,3973,4045,4118,4175,4233,4306,4380,4454,4529,4601,4674,4744,4815,4875,4936,5005,5074,5144,5218,5294,5358,5435,5511,5588,5653,5722,5799,5874,5943,6011,6088,6154,6215,6312,6377,6446,6545,6616,6675,6733,6790,6849,6913,6984,7056,7128,7200,7272,7339,7407,7475,7534,7597,7661,7751,7842,7902,7968,8035,8101,8171,8235,8288,8355,8416,8483,8596,8654,8717,8782,8847,8922,8995,9067,9116,9177,9238,9299,9361,9425,9489,9553,9618,9681,9741,9802,9868,9927,9987,10049,10120,10180,10248,10822,10909,10999,11086,11174,11256,11339,11429,11520,12550,12608,12653,12719,12783,12840,12897,12951,15425,15473,15522,15573,15733,15850,15899,15988,16580,16746,16808,16868,16925,17202,17272,17350,17404,17474,17559,17607,17653,17714,17777,17843,17907,17978,18041,18106,18170,18231,18292,18344,18417,18491,18560,18635,18709,18783,18924,18994,23649,24664,24754,24842,24938,25028,26256,26345,26592,26873,27125,27410,27803,28280,28502,28724,29000,29227,29457,29687,29917,30147,30374,30793,31019,31444,31674,32102,32321,32604,32812,32943,33170,33596,33821,34248,34469,34894,35014,35290,35591,35915,36206,36520,36657,36788,36893,37135,37302,37506,37714,37985,38097,38209,38314,38431,38645,38791,38931,39017,39365,39453,39699,40117,40366,40448,40546,41138,41238,41490,41914,42169,42263,42352,42589,44613,44855,44957,45210,47366,57898,59414,70045,71573,73330,73956,74376,75437,76702,76958,77194,77741,78235,78840,79038,79618,80182,80557,80675,81213,81370,81566,81839,82095,82265,82406,82470,82835,83202,83878,84142,84480,84833,84927,85113,85419,85681,85806,85933,86172,86383,86502,86695,86872,87327,87508,87630,87889,88002,88189,88291,88398,88527,88802,89310,89806,90683,90977,91547,91696,92428,92600,92684,93020,93112,93390,99438,104827,104889,105467,106051,106142,106255,106484,106644,106796,106967,107133,107302,107469,107632,107875,108045,108218,108389,108663,108862,109067,109397,109871,109967,110063,110161,110261,110363,110465,110567,110669,110771,110871,110967,111079,111208,111331,111462,111593,111691,111805,111899,112039,112173,112269,112381,112481,112597,112693,112805,112905,113045,113181,113345,113475,113633,113783,113924,114068,114203,114315,114465,114593,114721,114857,114989,115119,115249,115361,115501,116405,116549,116687,116779,116869,116945,117049,117139,117241,117349,117457,117557,117637,117729,117827,117937,118015,118121,118213,118317,118427,118549,118712,118869,121222,121322,121412,121522,121612,121853,121947,122053,122145,122245,122357,122471,122587,122703,122797,122911,123023,123125,123245,123367,123449,123553,123673,123799,123897,123991,124079,124191,124307,124429,124541,124716,124832,124918,125010,125122,125246,125313,125439,125507,125635,125779,125907,125976,126071,126186,126299,126398,126507,126618,126729,126830,126935,127035,127165,127256,127379,127473,127585,127671,127775,127871,127959,128077,128181,128285,128411,128499,128607,128707,128797,128907,128991,129093,129177,129231,129295,129401,129487,129597,129681,129801" - } - }, - { - "source": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/res/values/strings.xml", - "from": { - "startLines": "1", - "startColumns": "4", - "startOffsets": "16", - "endColumns": "51", - "endOffsets": "63" - }, - "to": { - "startLines": "293", - "startColumns": "4", - "startOffsets": "19072", - "endColumns": "51", - "endOffsets": "19119" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-uz_values-uz.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-uz/values-uz.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,305,405,487,587,704,789,868,959,1051,1146,1240,1335,1428,1523,1618,1709,1801,1884,1994,2100,2200,2308,2414,2516,2677,2776", - "endColumns": "104,94,99,81,99,116,84,78,90,91,94,93,94,92,94,94,90,91,82,109,105,99,107,105,101,160,98,82", - "endOffsets": "205,300,400,482,582,699,784,863,954,1046,1141,1235,1330,1423,1518,1613,1704,1796,1879,1989,2095,2195,2303,2409,2511,2672,2771,2854" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-uz/values-uz.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2859", - "endColumns": "100", - "endOffsets": "2955" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-night-v8_values-night-v8.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-night-v8/values-night-v8.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9", - "startColumns": "4,4,4,4,4,4,4,4", - "startOffsets": "55,125,209,293,389,491,593,687", - "endColumns": "69,83,83,95,101,101,93,88", - "endOffsets": "120,204,288,384,486,588,682,771" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-nb_values-nb.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-nb/values-nb.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2816", - "endColumns": "100", - "endOffsets": "2912" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-nb/values-nb.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,303,417,503,603,716,793,869,960,1052,1146,1240,1341,1434,1529,1627,1718,1809,1886,1989,2087,2183,2287,2386,2487,2640,2737", - "endColumns": "102,94,113,85,99,112,76,75,90,91,93,93,100,92,94,97,90,90,76,102,97,95,103,98,100,152,96,78", - "endOffsets": "203,298,412,498,598,711,788,864,955,1047,1141,1235,1336,1429,1524,1622,1713,1804,1881,1984,2082,2178,2282,2381,2482,2635,2732,2811" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-th_values-th.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-th/values-th.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,303,411,496,598,708,786,864,955,1047,1138,1232,1333,1426,1521,1615,1706,1797,1877,1980,2078,2176,2279,2385,2486,2639,2734", - "endColumns": "104,92,107,84,101,109,77,77,90,91,90,93,100,92,94,93,90,90,79,102,97,97,102,105,100,152,94,80", - "endOffsets": "205,298,406,491,593,703,781,859,950,1042,1133,1227,1328,1421,1516,1610,1701,1792,1872,1975,2073,2171,2274,2380,2481,2634,2729,2810" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-th/values-th.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2815", - "endColumns": "100", - "endOffsets": "2911" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-is_values-is.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-is/values-is.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2859", - "endColumns": "100", - "endOffsets": "2955" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-is/values-is.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,205,302,414,499,600,714,795,875,966,1058,1151,1245,1352,1445,1540,1635,1726,1820,1900,2010,2117,2214,2323,2423,2526,2681,2779", - "endColumns": "99,96,111,84,100,113,80,79,90,91,92,93,106,92,94,94,90,93,79,109,106,96,108,99,102,154,97,79", - "endOffsets": "200,297,409,494,595,709,790,870,961,1053,1146,1240,1347,1440,1535,1630,1721,1815,1895,2005,2112,2209,2318,2418,2521,2676,2774,2854" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-v18_values-v18.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v18/values-v18.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "48", - "endOffsets": "99" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-sk_values-sk.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-sk/values-sk.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2899", - "endColumns": "100", - "endOffsets": "2995" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-sk/values-sk.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,313,424,510,618,736,815,893,984,1076,1174,1268,1369,1462,1557,1655,1746,1837,1920,2025,2133,2232,2338,2450,2553,2719,2817", - "endColumns": "106,100,110,85,107,117,78,77,90,91,97,93,100,92,94,97,90,90,82,104,107,98,105,111,102,165,97,81", - "endOffsets": "207,308,419,505,613,731,810,888,979,1071,1169,1263,1364,1457,1552,1650,1741,1832,1915,2020,2128,2227,2333,2445,2548,2714,2812,2894" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-ms_values-ms.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ms/values-ms.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,321,429,516,620,731,810,889,980,1072,1167,1261,1360,1453,1548,1642,1733,1824,1903,2015,2123,2220,2329,2433,2540,2699,2800", - "endColumns": "110,104,107,86,103,110,78,78,90,91,94,93,98,92,94,93,90,90,78,111,107,96,108,103,106,158,100,79", - "endOffsets": "211,316,424,511,615,726,805,884,975,1067,1162,1256,1355,1448,1543,1637,1728,1819,1898,2010,2118,2215,2324,2428,2535,2694,2795,2875" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ms/values-ms.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2880", - "endColumns": "100", - "endOffsets": "2976" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-port_values-port.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-port/values-port.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "55", - "endOffsets": "106" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-sw600dp-v13_values-sw600dp-v13.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-sw600dp-v13/values-sw600dp-v13.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9", - "startColumns": "4,4,4,4,4,4,4,4", - "startOffsets": "55,124,193,263,337,413,472,543", - "endColumns": "68,68,69,73,75,58,70,67", - "endOffsets": "119,188,258,332,408,467,538,606" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-kn_values-kn.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-kn/values-kn.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,331,444,532,639,765,843,920,1011,1103,1198,1292,1393,1486,1581,1675,1766,1857,1938,2054,2164,2263,2376,2481,2595,2759,2859", - "endColumns": "113,111,112,87,106,125,77,76,90,91,94,93,100,92,94,93,90,90,80,115,109,98,112,104,113,163,99,81", - "endOffsets": "214,326,439,527,634,760,838,915,1006,1098,1193,1287,1388,1481,1576,1670,1761,1852,1933,2049,2159,2258,2371,2476,2590,2754,2854,2936" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-kn/values-kn.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2941", - "endColumns": "100", - "endOffsets": "3037" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-zh-rTW_values-zh-rTW.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-zh-rTW/values-zh-rTW.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2749", - "endColumns": "100", - "endOffsets": "2845" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-zh-rTW/values-zh-rTW.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,200,293,393,475,572,680,757,833,925,1018,1115,1211,1307,1401,1497,1589,1681,1773,1850,1946,2041,2136,2233,2329,2427,2577,2671", - "endColumns": "94,92,99,81,96,107,76,75,91,92,96,95,95,93,95,91,91,91,76,95,94,94,96,95,97,149,93,77", - "endOffsets": "195,288,388,470,567,675,752,828,920,1013,1110,1206,1302,1396,1492,1584,1676,1768,1845,1941,2036,2131,2228,2324,2422,2572,2666,2744" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-fr_values-fr.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-fr/values-fr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,331,441,523,629,759,837,914,1005,1097,1195,1290,1391,1484,1577,1672,1763,1854,1939,2049,2160,2263,2374,2482,2589,2748,2847", - "endColumns": "110,114,109,81,105,129,77,76,90,91,97,94,100,92,92,94,90,90,84,109,110,102,110,107,106,158,98,85", - "endOffsets": "211,326,436,518,624,754,832,909,1000,1092,1190,1285,1386,1479,1572,1667,1758,1849,1934,2044,2155,2258,2369,2477,2584,2743,2842,2928" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-fr/values-fr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2933", - "endColumns": "100", - "endOffsets": "3029" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-pa_values-pa.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-pa/values-pa.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,305,410,496,596,709,787,865,956,1048,1142,1236,1337,1430,1525,1619,1710,1801,1879,1989,2092,2188,2299,2401,2511,2670,2767", - "endColumns": "102,96,104,85,99,112,77,77,90,91,93,93,100,92,94,93,90,90,77,109,102,95,110,101,109,158,96,78", - "endOffsets": "203,300,405,491,591,704,782,860,951,1043,1137,1231,1332,1425,1520,1614,1705,1796,1874,1984,2087,2183,2294,2396,2506,2665,2762,2841" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-pa/values-pa.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2846", - "endColumns": "100", - "endOffsets": "2942" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-lt_values-lt.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-lt/values-lt.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,221,325,438,525,627,749,832,913,1007,1102,1199,1295,1399,1495,1593,1689,1783,1877,1959,2068,2176,2276,2386,2491,2597,2773,2874", - "endColumns": "115,103,112,86,101,121,82,80,93,94,96,95,103,95,97,95,93,93,81,108,107,99,109,104,105,175,100,82", - "endOffsets": "216,320,433,520,622,744,827,908,1002,1097,1194,1290,1394,1490,1588,1684,1778,1872,1954,2063,2171,2271,2381,2486,2592,2768,2869,2952" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-lt/values-lt.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2957", - "endColumns": "100", - "endOffsets": "3053" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-fa_values-fa.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-fa/values-fa.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2876", - "endColumns": "100", - "endOffsets": "2972" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-fa/values-fa.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,215,316,427,511,612,727,807,885,978,1072,1164,1258,1361,1456,1553,1647,1740,1830,1911,2019,2123,2221,2327,2432,2537,2694,2795", - "endColumns": "109,100,110,83,100,114,79,77,92,93,91,93,102,94,96,93,92,89,80,107,103,97,105,104,104,156,100,80", - "endOffsets": "210,311,422,506,607,722,802,880,973,1067,1159,1253,1356,1451,1548,1642,1735,1825,1906,2014,2118,2216,2322,2427,2532,2689,2790,2871" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-gu_values-gu.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-gu/values-gu.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,316,423,510,610,730,808,886,977,1069,1164,1258,1359,1452,1547,1641,1732,1823,1902,2008,2109,2206,2315,2415,2525,2685,2788", - "endColumns": "106,103,106,86,99,119,77,77,90,91,94,93,100,92,94,93,90,90,78,105,100,96,108,99,109,159,102,79", - "endOffsets": "207,311,418,505,605,725,803,881,972,1064,1159,1253,1354,1447,1542,1636,1727,1818,1897,2003,2104,2201,2310,2410,2520,2680,2783,2863" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-gu/values-gu.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2868", - "endColumns": "100", - "endOffsets": "2964" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-eu_values-eu.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-eu/values-eu.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2932", - "endColumns": "100", - "endOffsets": "3028" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-eu/values-eu.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,312,422,508,614,738,824,906,998,1091,1187,1281,1383,1477,1573,1670,1762,1855,1936,2045,2154,2253,2362,2469,2580,2751,2850", - "endColumns": "108,97,109,85,105,123,85,81,91,92,95,93,101,93,95,96,91,92,80,108,108,98,108,106,110,170,98,81", - "endOffsets": "209,307,417,503,609,733,819,901,993,1086,1182,1276,1378,1472,1568,1665,1757,1850,1931,2040,2149,2248,2357,2464,2575,2746,2845,2927" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-mn_values-mn.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-mn/values-mn.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2877", - "endColumns": "100", - "endOffsets": "2973" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-mn/values-mn.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,319,428,514,620,734,817,899,990,1082,1177,1273,1371,1464,1558,1650,1741,1831,1910,2017,2120,2217,2324,2426,2539,2698,2797", - "endColumns": "113,99,108,85,105,113,82,81,90,91,94,95,97,92,93,91,90,89,78,106,102,96,106,101,112,158,98,79", - "endOffsets": "214,314,423,509,615,729,812,894,985,1077,1172,1268,1366,1459,1553,1645,1736,1826,1905,2012,2115,2212,2319,2421,2534,2693,2792,2872" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-de_values-de.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-de/values-de.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2913", - "endColumns": "100", - "endOffsets": "3009" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-de/values-de.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,308,420,506,612,727,805,881,973,1066,1162,1263,1371,1471,1575,1673,1771,1868,1949,2060,2162,2260,2367,2470,2574,2730,2832", - "endColumns": "104,97,111,85,105,114,77,75,91,92,95,100,107,99,103,97,97,96,80,110,101,97,106,102,103,155,101,80", - "endOffsets": "205,303,415,501,607,722,800,876,968,1061,1157,1258,1366,1466,1570,1668,1766,1863,1944,2055,2157,2255,2362,2465,2569,2725,2827,2908" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-pl_values-pl.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-pl/values-pl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2899", - "endColumns": "100", - "endOffsets": "2995" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-pl/values-pl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,220,322,430,516,623,742,821,898,989,1081,1176,1270,1372,1465,1560,1655,1746,1837,1918,2027,2127,2226,2335,2447,2558,2721,2817", - "endColumns": "114,101,107,85,106,118,78,76,90,91,94,93,101,92,94,94,90,90,80,108,99,98,108,111,110,162,95,81", - "endOffsets": "215,317,425,511,618,737,816,893,984,1076,1171,1265,1367,1460,1555,1650,1741,1832,1913,2022,2122,2221,2330,2442,2553,2716,2812,2894" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-ru_values-ru.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ru/values-ru.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2903", - "endColumns": "100", - "endOffsets": "2999" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ru/values-ru.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,220,322,421,507,612,733,812,889,981,1074,1169,1262,1358,1452,1548,1643,1735,1827,1915,2021,2128,2226,2335,2442,2556,2722,2822", - "endColumns": "114,101,98,85,104,120,78,76,91,92,94,92,95,93,95,94,91,91,87,105,106,97,108,106,113,165,99,80", - "endOffsets": "215,317,416,502,607,728,807,884,976,1069,1164,1257,1353,1447,1543,1638,1730,1822,1910,2016,2123,2221,2330,2437,2551,2717,2817,2898" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-si_values-si.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-si/values-si.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,221,328,435,518,623,739,829,916,1007,1099,1193,1287,1388,1481,1576,1670,1761,1852,1935,2044,2148,2246,2356,2456,2563,2722,2821", - "endColumns": "115,106,106,82,104,115,89,86,90,91,93,93,100,92,94,93,90,90,82,108,103,97,109,99,106,158,98,80", - "endOffsets": "216,323,430,513,618,734,824,911,1002,1094,1188,1282,1383,1476,1571,1665,1756,1847,1930,2039,2143,2241,2351,2451,2558,2717,2816,2897" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-si/values-si.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2902", - "endColumns": "100", - "endOffsets": "2998" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-or_values-or.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-or/values-or.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,224,334,441,527,631,751,829,906,997,1089,1185,1280,1381,1474,1569,1665,1756,1846,1934,2044,2148,2254,2365,2469,2587,2750,2856", - "endColumns": "118,109,106,85,103,119,77,76,90,91,95,94,100,92,94,95,90,89,87,109,103,105,110,103,117,162,105,88", - "endOffsets": "219,329,436,522,626,746,824,901,992,1084,1180,1275,1376,1469,1564,1660,1751,1841,1929,2039,2143,2249,2360,2464,2582,2745,2851,2940" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-or/values-or.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2945", - "endColumns": "100", - "endOffsets": "3041" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-az_values-az.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-az/values-az.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2896", - "endColumns": "100", - "endOffsets": "2992" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-az/values-az.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,215,316,426,514,621,735,817,896,987,1079,1173,1272,1373,1466,1561,1655,1746,1838,1922,2027,2133,2233,2342,2447,2549,2707,2813", - "endColumns": "109,100,109,87,106,113,81,78,90,91,93,98,100,92,94,93,90,91,83,104,105,99,108,104,101,157,105,82", - "endOffsets": "210,311,421,509,616,730,812,891,982,1074,1168,1267,1368,1461,1556,1650,1741,1833,1917,2022,2128,2228,2337,2442,2544,2702,2808,2891" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-af_values-af.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-af/values-af.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2857", - "endColumns": "100", - "endOffsets": "2953" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-af/values-af.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,309,415,500,603,721,798,875,966,1058,1153,1247,1347,1440,1535,1634,1729,1823,1903,2010,2115,2212,2320,2423,2525,2679,2777", - "endColumns": "107,95,105,84,102,117,76,76,90,91,94,93,99,92,94,98,94,93,79,106,104,96,107,102,101,153,97,79", - "endOffsets": "208,304,410,495,598,716,793,870,961,1053,1148,1242,1342,1435,1530,1629,1724,1818,1898,2005,2110,2207,2315,2418,2520,2674,2772,2852" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-bn_values-bn.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-bn/values-bn.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,319,425,514,619,740,823,906,997,1089,1183,1277,1378,1471,1566,1660,1751,1842,1927,2037,2141,2244,2352,2460,2565,2730,2835", - "endColumns": "107,105,105,88,104,120,82,82,90,91,93,93,100,92,94,93,90,90,84,109,103,102,107,107,104,164,104,85", - "endOffsets": "208,314,420,509,614,735,818,901,992,1084,1178,1272,1373,1466,1561,1655,1746,1837,1922,2032,2136,2239,2347,2455,2560,2725,2830,2916" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-bn/values-bn.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2921", - "endColumns": "100", - "endOffsets": "3017" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-ja_values-ja.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ja/values-ja.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2769", - "endColumns": "100", - "endOffsets": "2865" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ja/values-ja.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,202,295,400,482,580,688,766,842,933,1025,1120,1214,1315,1408,1503,1597,1688,1779,1856,1958,2056,2151,2254,2350,2446,2594,2691", - "endColumns": "96,92,104,81,97,107,77,75,90,91,94,93,100,92,94,93,90,90,76,101,97,94,102,95,95,147,96,77", - "endOffsets": "197,290,395,477,575,683,761,837,928,1020,1115,1209,1310,1403,1498,1592,1683,1774,1851,1953,2051,2146,2249,2345,2441,2589,2686,2764" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-gl_values-gl.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-gl/values-gl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2935", - "endColumns": "100", - "endOffsets": "3031" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-gl/values-gl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,313,421,506,607,735,820,901,993,1086,1183,1277,1378,1472,1568,1663,1755,1847,1927,2035,2142,2249,2358,2463,2577,2754,2853", - "endColumns": "103,103,107,84,100,127,84,80,91,92,96,93,100,93,95,94,91,91,79,107,106,106,108,104,113,176,98,81", - "endOffsets": "204,308,416,501,602,730,815,896,988,1081,1178,1272,1373,1467,1563,1658,1750,1842,1922,2030,2137,2244,2353,2458,2572,2749,2848,2930" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-km_values-km.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-km/values-km.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,207,306,416,503,606,727,805,882,973,1065,1157,1251,1352,1445,1540,1634,1725,1816,1898,2002,2106,2206,2315,2424,2533,2695,2793", - "endColumns": "101,98,109,86,102,120,77,76,90,91,91,93,100,92,94,93,90,90,81,103,103,99,108,108,108,161,97,82", - "endOffsets": "202,301,411,498,601,722,800,877,968,1060,1152,1246,1347,1440,1535,1629,1720,1811,1893,1997,2101,2201,2310,2419,2528,2690,2788,2871" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-km/values-km.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2876", - "endColumns": "100", - "endOffsets": "2972" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-zh-rCN_values-zh-rCN.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-zh-rCN/values-zh-rCN.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,200,295,395,477,574,680,757,833,924,1016,1113,1209,1304,1397,1492,1584,1675,1766,1843,1939,2034,2129,2226,2322,2420,2568,2662", - "endColumns": "94,94,99,81,96,105,76,75,90,91,96,95,94,92,94,91,90,90,76,95,94,94,96,95,97,147,93,77", - "endOffsets": "195,290,390,472,569,675,752,828,919,1011,1108,1204,1299,1392,1487,1579,1670,1761,1838,1934,2029,2124,2221,2317,2415,2563,2657,2735" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-zh-rCN/values-zh-rCN.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2740", - "endColumns": "100", - "endOffsets": "2836" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-el_values-el.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-el/values-el.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,223,334,451,536,642,765,854,940,1031,1123,1218,1312,1413,1506,1601,1698,1789,1880,1964,2075,2184,2286,2397,2507,2615,2786,2886", - "endColumns": "117,110,116,84,105,122,88,85,90,91,94,93,100,92,94,96,90,90,83,110,108,101,110,109,107,170,99,84", - "endOffsets": "218,329,446,531,637,760,849,935,1026,1118,1213,1307,1408,1501,1596,1693,1784,1875,1959,2070,2179,2281,2392,2502,2610,2781,2881,2966" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-el/values-el.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2971", - "endColumns": "100", - "endOffsets": "3067" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-mr_values-mr.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-mr/values-mr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,322,429,519,621,733,811,889,980,1072,1165,1262,1363,1456,1551,1645,1736,1827,1906,2013,2114,2210,2319,2421,2535,2692,2795", - "endColumns": "110,105,106,89,101,111,77,77,90,91,92,96,100,92,94,93,90,90,78,106,100,95,108,101,113,156,102,78", - "endOffsets": "211,317,424,514,616,728,806,884,975,1067,1160,1257,1358,1451,1546,1640,1731,1822,1901,2008,2109,2205,2314,2416,2530,2687,2790,2869" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-mr/values-mr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2874", - "endColumns": "100", - "endOffsets": "2970" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-v22_values-v22.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v22/values-v22.xml", - "from": { - "startLines": "2,3,4,9", - "startColumns": "4,4,4,4", - "startOffsets": "55,130,217,553", - "endLines": "2,3,8,13", - "endColumns": "74,86,12,12", - "endOffsets": "125,212,548,896" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-watch-v21_values-watch-v21.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-watch-v21/values-watch-v21.xml", - "from": { - "startLines": "2,6,10", - "startColumns": "4,4,4", - "startOffsets": "55,271,499", - "endLines": "5,9,13", - "endColumns": "12,12,12", - "endOffsets": "266,494,724" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-en-rAU_values-en-rAU.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-en-rAU/values-en-rAU.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2844", - "endColumns": "100", - "endOffsets": "2940" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-en-rAU/values-en-rAU.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,417,501,601,716,794,870,961,1053,1148,1242,1343,1436,1531,1625,1716,1807,1888,1991,2094,2193,2298,2402,2506,2662,2762", - "endColumns": "103,99,107,83,99,114,77,75,90,91,94,93,100,92,94,93,90,90,80,102,102,98,104,103,103,155,99,81", - "endOffsets": "204,304,412,496,596,711,789,865,956,1048,1143,1237,1338,1431,1526,1620,1711,1802,1883,1986,2089,2188,2293,2397,2501,2657,2757,2839" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-bs_values-bs.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-bs/values-bs.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2916", - "endColumns": "100", - "endOffsets": "3012" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-bs/values-bs.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,226,323,430,516,620,742,827,910,1001,1093,1188,1282,1383,1476,1571,1666,1757,1848,1935,2038,2142,2243,2348,2462,2565,2734,2830", - "endColumns": "120,96,106,85,103,121,84,82,90,91,94,93,100,92,94,94,90,90,86,102,103,100,104,113,102,168,95,85", - "endOffsets": "221,318,425,511,615,737,822,905,996,1088,1183,1277,1378,1471,1566,1661,1752,1843,1930,2033,2137,2238,2343,2457,2560,2729,2825,2911" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-v26_values-v26.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v26/values-v26.xml", - "from": { - "startLines": "2,3,4,8,12,16", - "startColumns": "4,4,4,4,4,4", - "startOffsets": "55,130,217,431,657,896", - "endLines": "2,3,7,11,15,16", - "endColumns": "74,86,12,12,12,92", - "endOffsets": "125,212,426,652,891,984" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-ta_values-ta.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ta/values-ta.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2952", - "endColumns": "100", - "endOffsets": "3048" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ta/values-ta.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,218,320,435,524,635,756,835,912,1010,1109,1204,1298,1406,1506,1608,1702,1800,1898,1978,2086,2189,2288,2404,2507,2612,2769,2871", - "endColumns": "112,101,114,88,110,120,78,76,97,98,94,93,107,99,101,93,97,97,79,107,102,98,115,102,104,156,101,80", - "endOffsets": "213,315,430,519,630,751,830,907,1005,1104,1199,1293,1401,1501,1603,1697,1795,1893,1973,2081,2184,2283,2399,2502,2607,2764,2866,2947" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-cs_values-cs.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-cs/values-cs.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,314,423,509,614,731,809,886,977,1069,1164,1258,1353,1446,1541,1638,1729,1820,1903,2007,2119,2218,2324,2435,2537,2700,2798", - "endColumns": "106,101,108,85,104,116,77,76,90,91,94,93,94,92,94,96,90,90,82,103,111,98,105,110,101,162,97,81", - "endOffsets": "207,309,418,504,609,726,804,881,972,1064,1159,1253,1348,1441,1536,1633,1724,1815,1898,2002,2114,2213,2319,2430,2532,2695,2793,2875" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-cs/values-cs.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2880", - "endColumns": "100", - "endOffsets": "2976" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-sw_values-sw.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-sw/values-sw.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,307,415,505,610,727,810,893,984,1076,1171,1265,1366,1459,1554,1648,1739,1830,1911,2012,2120,2219,2326,2438,2542,2704,2801", - "endColumns": "102,98,107,89,104,116,82,82,90,91,94,93,100,92,94,93,90,90,80,100,107,98,106,111,103,161,96,81", - "endOffsets": "203,302,410,500,605,722,805,888,979,1071,1166,1260,1361,1454,1549,1643,1734,1825,1906,2007,2115,2214,2321,2433,2537,2699,2796,2878" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-sw/values-sw.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2883", - "endColumns": "100", - "endOffsets": "2979" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-as_values-as.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-as/values-as.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2923", - "endColumns": "100", - "endOffsets": "3019" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-as/values-as.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,312,419,510,612,732,809,885,976,1068,1163,1257,1358,1451,1546,1640,1731,1822,1907,2020,2128,2227,2336,2452,2572,2739,2841", - "endColumns": "107,98,106,90,101,119,76,75,90,91,94,93,100,92,94,93,90,90,84,112,107,98,108,115,119,166,101,81", - "endOffsets": "208,307,414,505,607,727,804,880,971,1063,1158,1252,1353,1446,1541,1635,1726,1817,1902,2015,2123,2222,2331,2447,2567,2734,2836,2918" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-hy_values-hy.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-hy/values-hy.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,313,423,512,618,735,817,898,989,1081,1176,1270,1371,1464,1559,1653,1744,1835,1917,2023,2129,2228,2338,2446,2547,2717,2814", - "endColumns": "107,99,109,88,105,116,81,80,90,91,94,93,100,92,94,93,90,90,81,105,105,98,109,107,100,169,96,81", - "endOffsets": "208,308,418,507,613,730,812,893,984,1076,1171,1265,1366,1459,1554,1648,1739,1830,1912,2018,2124,2223,2333,2441,2542,2712,2809,2891" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-hy/values-hy.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2896", - "endColumns": "100", - "endOffsets": "2992" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-watch-v20_values-watch-v20.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-watch-v20/values-watch-v20.xml", - "from": { - "startLines": "2,5,8", - "startColumns": "4,4,4", - "startOffsets": "55,214,385", - "endLines": "4,7,10", - "endColumns": "12,12,12", - "endOffsets": "209,380,553" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-be_values-be.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-be/values-be.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2916", - "endColumns": "100", - "endOffsets": "3012" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-be/values-be.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,328,444,530,635,754,834,912,1004,1097,1192,1286,1382,1476,1572,1667,1759,1851,1931,2037,2142,2240,2348,2454,2562,2735,2835", - "endColumns": "119,102,115,85,104,118,79,77,91,92,94,93,95,93,95,94,91,91,79,105,104,97,107,105,107,172,99,80", - "endOffsets": "220,323,439,525,630,749,829,907,999,1092,1187,1281,1377,1471,1567,1662,1754,1846,1926,2032,2137,2235,2343,2449,2557,2730,2830,2911" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-da_values-da.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-da/values-da.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2836", - "endColumns": "100", - "endOffsets": "2932" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-da/values-da.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,205,299,415,500,600,713,791,868,959,1051,1144,1238,1333,1426,1521,1619,1710,1801,1879,1987,2094,2190,2303,2406,2507,2660,2757", - "endColumns": "99,93,115,84,99,112,77,76,90,91,92,93,94,92,94,97,90,90,77,107,106,95,112,102,100,152,96,78", - "endOffsets": "200,294,410,495,595,708,786,863,954,1046,1139,1233,1328,1421,1516,1614,1705,1796,1874,1982,2089,2185,2298,2401,2502,2655,2752,2831" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-v16_values-v16.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v16/values-v16.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endLines": "5", - "endColumns": "12", - "endOffsets": "223" - }, - "to": { - "startLines": "3", - "startColumns": "4", - "startOffsets": "121", - "endLines": "6", - "endColumns": "12", - "endOffsets": "289" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-v16/values-v16.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "65", - "endOffsets": "116" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-ml_values-ml.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ml/values-ml.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,318,429,520,625,747,825,901,992,1084,1185,1279,1380,1474,1569,1668,1759,1850,1931,2040,2144,2243,2355,2467,2588,2753,2854", - "endColumns": "106,105,110,90,104,121,77,75,90,91,100,93,100,93,94,98,90,90,80,108,103,98,111,111,120,164,100,81", - "endOffsets": "207,313,424,515,620,742,820,896,987,1079,1180,1274,1375,1469,1564,1663,1754,1845,1926,2035,2139,2238,2350,2462,2583,2748,2849,2931" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ml/values-ml.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2936", - "endColumns": "100", - "endOffsets": "3032" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-en-rXC_values-en-rXC.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-en-rXC/values-en-rXC.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "202", - "endOffsets": "253" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "5682", - "endColumns": "202", - "endOffsets": "5880" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-en-rXC/values-en-rXC.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,310,510,719,904,1106,1321,1494,1671,1862,2055,2253,2449,2652,2847,3044,3239,3432,3623,3807,4011,4216,4417,4624,4826,5031,5303,5503", - "endColumns": "204,199,208,184,201,214,172,176,190,192,197,195,202,194,196,194,192,190,183,203,204,200,206,201,204,271,199,178", - "endOffsets": "305,505,714,899,1101,1316,1489,1666,1857,2050,2248,2444,2647,2842,3039,3234,3427,3618,3802,4006,4211,4412,4619,4821,5026,5298,5498,5677" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-en-rGB_values-en-rGB.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-en-rGB/values-en-rGB.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2844", - "endColumns": "100", - "endOffsets": "2940" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-en-rGB/values-en-rGB.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,417,501,601,716,794,870,961,1053,1148,1242,1343,1436,1531,1625,1716,1807,1888,1991,2094,2193,2298,2402,2506,2662,2762", - "endColumns": "103,99,107,83,99,114,77,75,90,91,94,93,100,92,94,93,90,90,80,102,102,98,104,103,103,155,99,81", - "endOffsets": "204,304,412,496,596,711,789,865,956,1048,1143,1237,1338,1431,1526,1620,1711,1802,1883,1986,2089,2188,2293,2397,2501,2657,2757,2839" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-h720dp-v13_values-h720dp-v13.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-h720dp-v13/values-h720dp-v13.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "66", - "endOffsets": "117" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-hu_values-hu.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-hu/values-hu.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,305,420,504,619,742,819,895,986,1078,1173,1267,1368,1461,1556,1651,1742,1833,1915,2025,2135,2235,2346,2455,2574,2756,2859", - "endColumns": "107,91,114,83,114,122,76,75,90,91,94,93,100,92,94,94,90,90,81,109,109,99,110,108,118,181,102,82", - "endOffsets": "208,300,415,499,614,737,814,890,981,1073,1168,1262,1363,1456,1551,1646,1737,1828,1910,2020,2130,2230,2341,2450,2569,2751,2854,2937" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-hu/values-hu.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2942", - "endColumns": "100", - "endOffsets": "3038" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-et_values-et.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-et/values-et.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2909", - "endColumns": "100", - "endOffsets": "3005" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-et/values-et.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,211,310,421,507,609,726,807,885,977,1070,1166,1268,1378,1472,1573,1667,1759,1852,1934,2045,2149,2248,2358,2460,2559,2725,2827", - "endColumns": "105,98,110,85,101,116,80,77,91,92,95,101,109,93,100,93,91,92,81,110,103,98,109,101,98,165,101,81", - "endOffsets": "206,305,416,502,604,721,802,880,972,1065,1161,1263,1373,1467,1568,1662,1754,1847,1929,2040,2144,2243,2353,2455,2554,2720,2822,2904" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-pt-rPT_values-pt-rPT.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-pt-rPT/values-pt-rPT.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2933", - "endColumns": "100", - "endOffsets": "3029" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-pt-rPT/values-pt-rPT.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,319,426,515,616,740,825,906,998,1091,1188,1282,1382,1476,1572,1667,1759,1851,1935,2042,2153,2255,2363,2471,2578,2749,2848", - "endColumns": "107,105,106,88,100,123,84,80,91,92,96,93,99,93,95,94,91,91,83,106,110,101,107,107,106,170,98,84", - "endOffsets": "208,314,421,510,611,735,820,901,993,1086,1183,1277,1377,1471,1567,1662,1754,1846,1930,2037,2148,2250,2358,2466,2573,2744,2843,2928" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-ca_values-ca.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ca/values-ca.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2906", - "endColumns": "100", - "endOffsets": "3002" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ca/values-ca.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,223,328,435,518,624,750,834,914,1005,1097,1190,1285,1384,1477,1570,1664,1755,1846,1926,2037,2145,2243,2353,2458,2566,2726,2825", - "endColumns": "117,104,106,82,105,125,83,79,90,91,92,94,98,92,92,93,90,90,79,110,107,97,109,104,107,159,98,80", - "endOffsets": "218,323,430,513,619,745,829,909,1000,1092,1185,1280,1379,1472,1565,1659,1750,1841,1921,2032,2140,2238,2348,2453,2561,2721,2820,2901" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-v17_values-v17.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v17/values-v17.xml", - "from": { - "startLines": "2,5,9,12,15,18,22,25,29,33,37,40,43,46,50,53,57", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,228,456,614,764,936,1161,1331,1559,1783,2025,2196,2370,2539,2812,3012,3216", - "endLines": "4,8,11,14,17,21,24,28,32,36,39,42,45,49,52,56,60", - "endColumns": "12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12", - "endOffsets": "223,451,609,759,931,1156,1326,1554,1778,2020,2191,2365,2534,2807,3007,3211,3540" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-nl_values-nl.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-nl/values-nl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2914", - "endColumns": "100", - "endOffsets": "3010" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-nl/values-nl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,223,328,435,521,629,749,827,904,996,1089,1184,1278,1379,1473,1569,1664,1756,1848,1929,2040,2143,2242,2357,2471,2574,2729,2832", - "endColumns": "117,104,106,85,107,119,77,76,91,92,94,93,100,93,95,94,91,91,80,110,102,98,114,113,102,154,102,81", - "endOffsets": "218,323,430,516,624,744,822,899,991,1084,1179,1273,1374,1468,1564,1659,1751,1843,1924,2035,2138,2237,2352,2466,2569,2724,2827,2909" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-land_values-land.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-land/values-land.xml", - "from": { - "startLines": "2,3,4", - "startColumns": "4,4,4", - "startOffsets": "55,125,196", - "endColumns": "69,70,67", - "endOffsets": "120,191,259" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-uk_values-uk.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-uk/values-uk.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,316,424,510,615,733,814,894,985,1077,1172,1266,1367,1460,1555,1650,1741,1832,1930,2036,2142,2240,2347,2454,2559,2729,2829", - "endColumns": "108,101,107,85,104,117,80,79,90,91,94,93,100,92,94,94,90,90,97,105,105,97,106,106,104,169,99,80", - "endOffsets": "209,311,419,505,610,728,809,889,980,1072,1167,1261,1362,1455,1550,1645,1736,1827,1925,2031,2137,2235,2342,2449,2554,2724,2824,2905" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-uk/values-uk.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2910", - "endColumns": "100", - "endOffsets": "3006" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-sr_values-sr.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-sr/values-sr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2919", - "endColumns": "100", - "endOffsets": "3015" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-sr/values-sr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,313,419,505,609,731,815,897,988,1080,1175,1269,1370,1463,1558,1663,1754,1845,1930,2035,2141,2244,2350,2459,2566,2736,2833", - "endColumns": "106,100,105,85,103,121,83,81,90,91,94,93,100,92,94,104,90,90,84,104,105,102,105,108,106,169,96,85", - "endOffsets": "207,308,414,500,604,726,810,892,983,1075,1170,1264,1365,1458,1553,1658,1749,1840,1925,2030,2136,2239,2345,2454,2561,2731,2828,2914" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-tr_values-tr.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-tr/values-tr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2876", - "endColumns": "100", - "endOffsets": "2972" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-tr/values-tr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,318,430,515,621,741,821,897,988,1080,1172,1266,1367,1460,1562,1657,1748,1839,1917,2024,2128,2224,2331,2434,2543,2699,2797", - "endColumns": "113,98,111,84,105,119,79,75,90,91,91,93,100,92,101,94,90,90,77,106,103,95,106,102,108,155,97,78", - "endOffsets": "214,313,425,510,616,736,816,892,983,1075,1167,1261,1362,1455,1557,1652,1743,1834,1912,2019,2123,2219,2326,2429,2538,2694,2792,2871" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-hdpi-v4_values-hdpi-v4.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-hdpi-v4/values-hdpi-v4.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endLines": "6", - "endColumns": "13", - "endOffsets": "327" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-fr-rCA_values-fr-rCA.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-fr-rCA/values-fr-rCA.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2941", - "endColumns": "100", - "endOffsets": "3037" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-fr-rCA/values-fr-rCA.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,323,433,520,626,756,841,922,1013,1105,1203,1298,1399,1492,1585,1680,1771,1862,1947,2057,2168,2271,2382,2490,2597,2756,2855", - "endColumns": "110,106,109,86,105,129,84,80,90,91,97,94,100,92,92,94,90,90,84,109,110,102,110,107,106,158,98,85", - "endOffsets": "211,318,428,515,621,751,836,917,1008,1100,1198,1293,1394,1487,1580,1675,1766,1857,1942,2052,2163,2266,2377,2485,2592,2751,2850,2936" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-es-rUS_values-es-rUS.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-es-rUS/values-es-rUS.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,334,442,527,629,745,830,911,1002,1094,1189,1283,1383,1476,1575,1671,1762,1853,1934,2041,2140,2239,2347,2455,2562,2721,2821", - "endColumns": "119,108,107,84,101,115,84,80,90,91,94,93,99,92,98,95,90,90,80,106,98,98,107,107,106,158,99,81", - "endOffsets": "220,329,437,522,624,740,825,906,997,1089,1184,1278,1378,1471,1570,1666,1757,1848,1929,2036,2135,2234,2342,2450,2557,2716,2816,2898" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-es-rUS/values-es-rUS.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2903", - "endColumns": "100", - "endOffsets": "2999" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-kk_values-kk.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-kk/values-kk.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2877", - "endColumns": "100", - "endOffsets": "2973" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-kk/values-kk.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,318,428,513,619,738,818,896,987,1079,1174,1268,1369,1462,1557,1654,1745,1836,1916,2021,2124,2222,2329,2435,2535,2701,2796", - "endColumns": "107,104,109,84,105,118,79,77,90,91,94,93,100,92,94,96,90,90,79,104,102,97,106,105,99,165,94,80", - "endOffsets": "208,313,423,508,614,733,813,891,982,1074,1169,1263,1364,1457,1552,1649,1740,1831,1911,2016,2119,2217,2324,2430,2530,2696,2791,2872" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-ne_values-ne.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ne/values-ne.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,327,435,526,633,760,844,924,1015,1107,1202,1296,1397,1490,1585,1679,1770,1861,1946,2059,2160,2256,2369,2479,2603,2777,2888", - "endColumns": "110,110,107,90,106,126,83,79,90,91,94,93,100,92,94,93,90,90,84,112,100,95,112,109,123,173,110,78", - "endOffsets": "211,322,430,521,628,755,839,919,1010,1102,1197,1291,1392,1485,1580,1674,1765,1856,1941,2054,2155,2251,2364,2474,2598,2772,2883,2962" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ne/values-ne.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2967", - "endColumns": "100", - "endOffsets": "3063" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-xlarge-v4_values-xlarge-v4.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-xlarge-v4/values-xlarge-v4.xml", - "from": { - "startLines": "2,3,4,5,6,7", - "startColumns": "4,4,4,4,4,4", - "startOffsets": "55,126,197,267,337,405", - "endColumns": "70,70,69,69,67,67", - "endOffsets": "121,192,262,332,400,468" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-vi_values-vi.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-vi/values-vi.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2882", - "endColumns": "100", - "endOffsets": "2978" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-vi/values-vi.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,314,423,507,610,729,807,884,975,1067,1162,1256,1357,1450,1545,1639,1730,1821,1904,2008,2116,2217,2322,2437,2542,2699,2798", - "endColumns": "106,101,108,83,102,118,77,76,90,91,94,93,100,92,94,93,90,90,82,103,107,100,104,114,104,156,98,83", - "endOffsets": "207,309,418,502,605,724,802,879,970,1062,1157,1251,1352,1445,1540,1634,1725,1816,1899,2003,2111,2212,2317,2432,2537,2694,2793,2877" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-zh-rHK_values-zh-rHK.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-zh-rHK/values-zh-rHK.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,200,293,393,475,572,680,757,833,925,1018,1109,1205,1301,1395,1491,1583,1675,1767,1844,1940,2035,2130,2227,2323,2421,2572,2666", - "endColumns": "94,92,99,81,96,107,76,75,91,92,90,95,95,93,95,91,91,91,76,95,94,94,96,95,97,150,93,77", - "endOffsets": "195,288,388,470,567,675,752,828,920,1013,1104,1200,1296,1390,1486,1578,1670,1762,1839,1935,2030,2125,2222,2318,2416,2567,2661,2739" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-zh-rHK/values-zh-rHK.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2744", - "endColumns": "100", - "endOffsets": "2840" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-v23_values-v23.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v23/values-v23.xml", - "from": { - "startLines": "2,3,4,5,6,20,34,35,36,37,41,42,43,44", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,190,325,400,487,1371,2267,2386,2513,2618,2842,2957,3064,3177", - "endLines": "2,3,4,5,19,33,34,35,36,40,41,42,43,47", - "endColumns": "134,134,74,86,12,12,118,126,104,12,114,106,112,12", - "endOffsets": "185,320,395,482,1366,2262,2381,2508,2613,2837,2952,3059,3172,3402" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-ro_values-ro.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ro/values-ro.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2934", - "endColumns": "100", - "endOffsets": "3030" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ro/values-ro.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,226,330,443,527,631,752,837,918,1009,1101,1196,1290,1391,1484,1579,1673,1764,1856,1938,2050,2158,2258,2372,2478,2584,2748,2851", - "endColumns": "120,103,112,83,103,120,84,80,90,91,94,93,100,92,94,93,90,91,81,111,107,99,113,105,105,163,102,82", - "endOffsets": "221,325,438,522,626,747,832,913,1004,1096,1191,1285,1386,1479,1574,1668,1759,1851,1933,2045,2153,2253,2367,2473,2579,2743,2846,2929" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-my_values-my.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-my/values-my.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,218,325,441,528,637,760,842,924,1015,1107,1202,1296,1397,1490,1585,1679,1770,1861,1945,2060,2169,2268,2394,2501,2609,2769,2872", - "endColumns": "112,106,115,86,108,122,81,81,90,91,94,93,100,92,94,93,90,90,83,114,108,98,125,106,107,159,102,84", - "endOffsets": "213,320,436,523,632,755,837,919,1010,1102,1197,1291,1392,1485,1580,1674,1765,1856,1940,2055,2164,2263,2389,2496,2604,2764,2867,2952" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-my/values-my.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2957", - "endColumns": "100", - "endOffsets": "3053" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-b+sr+Latn_values-b+sr+Latn.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-b+sr+Latn/values-b+sr+Latn.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2922", - "endColumns": "100", - "endOffsets": "3018" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-b+sr+Latn/values-b+sr+Latn.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,313,419,505,609,731,816,899,990,1082,1177,1271,1372,1465,1560,1665,1756,1847,1932,2037,2143,2246,2353,2462,2569,2739,2836", - "endColumns": "106,100,105,85,103,121,84,82,90,91,94,93,100,92,94,104,90,90,84,104,105,102,106,108,106,169,96,85", - "endOffsets": "207,308,414,500,604,726,811,894,985,1077,1172,1266,1367,1460,1555,1660,1751,1842,1927,2032,2138,2241,2348,2457,2564,2734,2831,2917" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-ur_values-ur.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ur/values-ur.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2917", - "endColumns": "100", - "endOffsets": "3013" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ur/values-ur.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,325,434,520,624,744,821,897,989,1082,1177,1271,1373,1467,1563,1657,1749,1841,1925,2033,2139,2241,2352,2453,2569,2734,2832", - "endColumns": "113,105,108,85,103,119,76,75,91,92,94,93,101,93,95,93,91,91,83,107,105,101,110,100,115,164,97,84", - "endOffsets": "214,320,429,515,619,739,816,892,984,1077,1172,1266,1368,1462,1558,1652,1744,1836,1920,2028,2134,2236,2347,2448,2564,2729,2827,2912" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-v25_values-v25.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v25/values-v25.xml", - "from": { - "startLines": "2,3,4,6", - "startColumns": "4,4,4,4", - "startOffsets": "55,126,209,308", - "endLines": "2,3,5,7", - "endColumns": "70,82,12,12", - "endOffsets": "121,204,303,414" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-sv_values-sv.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-sv/values-sv.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2857", - "endColumns": "100", - "endOffsets": "2953" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-sv/values-sv.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,311,422,506,608,721,798,874,967,1061,1156,1250,1353,1448,1545,1643,1739,1832,1911,2017,2116,2212,2317,2420,2522,2676,2778", - "endColumns": "102,102,110,83,101,112,76,75,92,93,94,93,102,94,96,97,95,92,78,105,98,95,104,102,101,153,101,78", - "endOffsets": "203,306,417,501,603,716,793,869,962,1056,1151,1245,1348,1443,1540,1638,1734,1827,1906,2012,2111,2207,2312,2415,2517,2671,2773,2852" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-bg_values-bg.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-bg/values-bg.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,331,436,522,632,753,833,911,1002,1094,1189,1283,1384,1477,1572,1680,1771,1862,1944,2058,2166,2266,2380,2487,2595,2755,2854", - "endColumns": "119,105,104,85,109,120,79,77,90,91,94,93,100,92,94,107,90,90,81,113,107,99,113,106,107,159,98,82", - "endOffsets": "220,326,431,517,627,748,828,906,997,1089,1184,1278,1379,1472,1567,1675,1766,1857,1939,2053,2161,2261,2375,2482,2590,2750,2849,2932" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-bg/values-bg.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2937", - "endColumns": "100", - "endOffsets": "3033" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-large-v4_values-large-v4.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-large-v4/values-large-v4.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10", - "startColumns": "4,4,4,4,4,4,4,4,4", - "startOffsets": "55,114,185,256,326,396,464,532,636", - "endColumns": "58,70,70,69,69,67,67,103,115", - "endOffsets": "109,180,251,321,391,459,527,631,747" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-am_values-am.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-am/values-am.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,203,301,407,493,596,713,791,868,959,1051,1143,1237,1338,1431,1526,1619,1710,1801,1880,1980,2080,2176,2278,2378,2477,2627,2723", - "endColumns": "97,97,105,85,102,116,77,76,90,91,91,93,100,92,94,92,90,90,78,99,99,95,101,99,98,149,95,78", - "endOffsets": "198,296,402,488,591,708,786,863,954,1046,1138,1232,1333,1426,1521,1614,1705,1796,1875,1975,2075,2171,2273,2373,2472,2622,2718,2797" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-am/values-am.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2802", - "endColumns": "100", - "endOffsets": "2898" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-zu_values-zu.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-zu/values-zu.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2872", - "endColumns": "100", - "endOffsets": "2968" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-zu/values-zu.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,320,432,520,623,738,817,895,986,1078,1173,1267,1368,1461,1556,1650,1741,1834,1914,2018,2121,2219,2326,2433,2538,2695,2791", - "endColumns": "107,106,111,87,102,114,78,77,90,91,94,93,100,92,94,93,90,92,79,103,102,97,106,106,104,156,95,80", - "endOffsets": "208,315,427,515,618,733,812,890,981,1073,1168,1262,1363,1456,1551,1645,1736,1829,1909,2013,2116,2214,2321,2428,2533,2690,2786,2867" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-lv_values-lv.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-lv/values-lv.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "3071", - "endColumns": "100", - "endOffsets": "3167" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-lv/values-lv.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,335,444,530,634,756,838,919,1029,1136,1242,1351,1463,1566,1678,1785,1890,1990,2074,2183,2294,2393,2504,2611,2716,2890,2989", - "endColumns": "119,109,108,85,103,121,81,80,109,106,105,108,111,102,111,106,104,99,83,108,110,98,110,106,104,173,98,81", - "endOffsets": "220,330,439,525,629,751,833,914,1024,1131,1237,1346,1458,1561,1673,1780,1885,1985,2069,2178,2289,2388,2499,2606,2711,2885,2984,3066" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-ldltr-v21_values-ldltr-v21.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ldltr-v21/values-ldltr-v21.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "112", - "endOffsets": "163" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-it_values-it.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-it/values-it.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,313,422,506,611,730,808,884,976,1069,1162,1256,1358,1452,1549,1644,1736,1828,1908,2014,2121,2219,2323,2429,2536,2699,2799", - "endColumns": "104,102,108,83,104,118,77,75,91,92,92,93,101,93,96,94,91,91,79,105,106,97,103,105,106,162,99,80", - "endOffsets": "205,308,417,501,606,725,803,879,971,1064,1157,1251,1353,1447,1544,1639,1731,1823,1903,2009,2116,2214,2318,2424,2531,2694,2794,2875" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-it/values-it.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2880", - "endColumns": "100", - "endOffsets": "2976" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-ky_values-ky.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ky/values-ky.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2901", - "endColumns": "100", - "endOffsets": "2997" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ky/values-ky.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,325,437,522,627,744,823,902,993,1085,1180,1274,1375,1468,1563,1658,1749,1840,1920,2026,2131,2229,2336,2442,2557,2718,2820", - "endColumns": "110,108,111,84,104,116,78,78,90,91,94,93,100,92,94,94,90,90,79,105,104,97,106,105,114,160,101,80", - "endOffsets": "211,320,432,517,622,739,818,897,988,1080,1175,1269,1370,1463,1558,1653,1744,1835,1915,2021,2126,2224,2331,2437,2552,2713,2815,2896" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-mk_values-mk.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-mk/values-mk.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,317,425,511,619,738,822,904,995,1087,1183,1277,1378,1471,1566,1662,1753,1844,1930,2036,2142,2243,2350,2462,2566,2722,2820", - "endColumns": "107,103,107,85,107,118,83,81,90,91,95,93,100,92,94,95,90,90,85,105,105,100,106,111,103,155,97,83", - "endOffsets": "208,312,420,506,614,733,817,899,990,1082,1178,1272,1373,1466,1561,1657,1748,1839,1925,2031,2137,2238,2345,2457,2561,2717,2815,2899" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-mk/values-mk.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2904", - "endColumns": "100", - "endOffsets": "3000" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-ar_values-ar.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ar/values-ar.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,317,424,506,607,721,801,880,971,1063,1155,1249,1350,1443,1538,1631,1722,1816,1894,1999,2097,2195,2303,2403,2506,2661,2758", - "endColumns": "107,103,106,81,100,113,79,78,90,91,91,93,100,92,94,92,90,93,77,104,97,97,107,99,102,154,96,80", - "endOffsets": "208,312,419,501,602,716,796,875,966,1058,1150,1244,1345,1438,1533,1626,1717,1811,1889,1994,2092,2190,2298,2398,2501,2656,2753,2834" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ar/values-ar.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2839", - "endColumns": "100", - "endOffsets": "2935" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-en-rIN_values-en-rIN.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-en-rIN/values-en-rIN.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2844", - "endColumns": "100", - "endOffsets": "2940" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-en-rIN/values-en-rIN.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,417,501,601,716,794,870,961,1053,1148,1242,1343,1436,1531,1625,1716,1807,1888,1991,2094,2193,2298,2402,2506,2662,2762", - "endColumns": "103,99,107,83,99,114,77,75,90,91,94,93,100,92,94,93,90,90,80,102,102,98,104,103,103,155,99,81", - "endOffsets": "204,304,412,496,596,711,789,865,956,1048,1143,1237,1338,1431,1526,1620,1711,1802,1883,1986,2089,2188,2293,2397,2501,2657,2757,2839" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-sq_values-sq.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-sq/values-sq.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,319,431,517,623,746,828,907,998,1090,1185,1279,1381,1474,1569,1666,1757,1850,1930,2036,2140,2238,2344,2448,2550,2704,2801", - "endColumns": "113,99,111,85,105,122,81,78,90,91,94,93,101,92,94,96,90,92,79,105,103,97,105,103,101,153,96,80", - "endOffsets": "214,314,426,512,618,741,823,902,993,1085,1180,1274,1376,1469,1564,1661,1752,1845,1925,2031,2135,2233,2339,2443,2545,2699,2796,2877" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-sq/values-sq.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2882", - "endColumns": "100", - "endOffsets": "2978" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-ko_values-ko.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ko/values-ko.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2763", - "endColumns": "100", - "endOffsets": "2859" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ko/values-ko.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,202,296,397,479,577,683,763,839,930,1022,1117,1211,1312,1405,1500,1594,1685,1776,1855,1953,2047,2142,2242,2339,2439,2591,2685", - "endColumns": "96,93,100,81,97,105,79,75,90,91,94,93,100,92,94,93,90,90,78,97,93,94,99,96,99,151,93,77", - "endOffsets": "197,291,392,474,572,678,758,834,925,1017,1112,1206,1307,1400,1495,1589,1680,1771,1850,1948,2042,2137,2237,2334,2434,2586,2680,2758" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-te_values-te.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-te/values-te.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2925", - "endColumns": "100", - "endOffsets": "3021" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-te/values-te.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,222,334,445,535,640,759,837,914,1005,1097,1192,1286,1387,1480,1575,1670,1761,1852,1934,2048,2150,2247,2362,2465,2580,2742,2845", - "endColumns": "116,111,110,89,104,118,77,76,90,91,94,93,100,92,94,94,90,90,81,113,101,96,114,102,114,161,102,79", - "endOffsets": "217,329,440,530,635,754,832,909,1000,1092,1187,1281,1382,1475,1570,1665,1756,1847,1929,2043,2145,2242,2357,2460,2575,2737,2840,2920" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-sl_values-sl.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-sl/values-sl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2934", - "endColumns": "100", - "endOffsets": "3030" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-sl/values-sl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,217,319,427,514,617,736,817,896,988,1081,1176,1270,1366,1460,1556,1656,1748,1840,1923,2031,2139,2239,2352,2460,2568,2751,2851", - "endColumns": "111,101,107,86,102,118,80,78,91,92,94,93,95,93,95,99,91,91,82,107,107,99,112,107,107,182,99,82", - "endOffsets": "212,314,422,509,612,731,812,891,983,1076,1171,1265,1361,1455,1551,1651,1743,1835,1918,2026,2134,2234,2347,2455,2563,2746,2846,2929" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-pt-rBR_values-pt-rBR.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-pt-rBR/values-pt-rBR.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2928", - "endColumns": "100", - "endOffsets": "3024" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-pt-rBR/values-pt-rBR.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,331,438,527,628,747,832,913,1004,1096,1191,1285,1386,1479,1574,1669,1760,1851,1935,2042,2153,2255,2363,2471,2581,2743,2843", - "endColumns": "119,105,106,88,100,118,84,80,90,91,94,93,100,92,94,94,90,90,83,106,110,101,107,107,109,161,99,84", - "endOffsets": "220,326,433,522,623,742,827,908,999,1091,1186,1280,1381,1474,1569,1664,1755,1846,1930,2037,2148,2250,2358,2466,2576,2738,2838,2923" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-en-rCA_values-en-rCA.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-en-rCA/values-en-rCA.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,417,501,601,716,793,869,960,1053,1149,1243,1344,1437,1532,1626,1717,1808,1890,1993,2097,2196,2301,2404,2508,2664,2764", - "endColumns": "103,99,107,83,99,114,76,75,90,92,95,93,100,92,94,93,90,90,81,102,103,98,104,102,103,155,99,81", - "endOffsets": "204,304,412,496,596,711,788,864,955,1048,1144,1238,1339,1432,1527,1621,1712,1803,1885,1988,2092,2191,2296,2399,2503,2659,2759,2841" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-en-rCA/values-en-rCA.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2846", - "endColumns": "100", - "endOffsets": "2942" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-es_values-es.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-es/values-es.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,207,320,428,513,614,742,828,910,1002,1095,1192,1286,1387,1481,1577,1673,1765,1857,1938,2045,2156,2255,2363,2471,2578,2737,2836", - "endColumns": "101,112,107,84,100,127,85,81,91,92,96,93,100,93,95,95,91,91,80,106,110,98,107,107,106,158,98,81", - "endOffsets": "202,315,423,508,609,737,823,905,997,1090,1187,1281,1382,1476,1572,1668,1760,1852,1933,2040,2151,2250,2358,2466,2573,2732,2831,2913" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-es/values-es.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2918", - "endColumns": "100", - "endOffsets": "3014" - } - } - ] - }, - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/values-v21_values-v21.arsc.flat", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v21/values-v21.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,19,20,21,22,24,26,27,28,29,30,32,34,36,38,40,42,43,48,50,52,53,54,56,58,59,60,61,62,63,106,109,152,155,158,160,162,164,167,171,174,175,176,179,180,181,182,183,184,187,188,190,192,194,196,200,202,203,204,205,207,211,213,215,216,217,218,219,220,222,223,224,234,235,236,248", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,146,249,352,457,564,673,782,891,1000,1109,1216,1319,1438,1593,1748,1853,1974,2075,2222,2363,2466,2585,2692,2795,2950,3121,3270,3435,3592,3743,3862,4213,4362,4511,4623,4770,4923,5070,5145,5234,5321,5422,5525,8499,8684,11670,11867,12066,12189,12312,12425,12608,12863,13064,13153,13264,13497,13598,13693,13816,13945,14062,14239,14338,14473,14616,14751,14870,15071,15190,15283,15394,15450,15557,15752,15863,15996,16091,16182,16273,16366,16483,16622,16693,16776,17456,17513,17571,18265", - "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,16,18,19,20,21,23,25,26,27,28,29,31,33,35,37,39,41,42,47,49,51,52,53,55,57,58,59,60,61,62,105,108,151,154,157,159,161,163,166,170,173,174,175,178,179,180,181,182,183,186,187,189,191,193,195,199,201,202,203,204,206,210,212,214,215,216,217,218,219,221,222,223,233,234,235,247,259", - "endColumns": "90,102,102,104,106,108,108,108,108,108,106,102,118,12,12,104,120,100,12,12,102,118,106,102,12,12,12,12,12,12,118,12,12,12,111,146,12,12,74,88,86,100,102,12,12,12,12,12,12,12,12,12,12,12,88,110,12,100,94,122,128,116,12,98,12,12,12,12,12,12,92,110,55,12,12,12,12,94,90,90,92,116,12,70,82,12,56,57,12,12", - "endOffsets": "141,244,347,452,559,668,777,886,995,1104,1211,1314,1433,1588,1743,1848,1969,2070,2217,2358,2461,2580,2687,2790,2945,3116,3265,3430,3587,3738,3857,4208,4357,4506,4618,4765,4918,5065,5140,5229,5316,5417,5520,8494,8679,11665,11862,12061,12184,12307,12420,12603,12858,13059,13148,13259,13492,13593,13688,13811,13940,14057,14234,14333,14468,14611,14746,14865,15066,15185,15278,15389,15445,15552,15747,15858,15991,16086,16177,16268,16361,16478,16617,16688,16771,17451,17508,17566,18260,18966" - }, - "to": { - "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,23,24,25,26,28,30,31,32,33,34,36,38,40,42,44,46,47,52,54,56,57,58,60,62,63,64,65,66,67,110,113,156,159,162,164,166,168,171,175,178,179,180,183,184,185,186,187,188,191,192,194,196,198,200,204,206,207,208,209,211,215,217,219,220,221,222,223,224,226,227,228,238,239,240,252", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "354,445,548,651,756,863,972,1081,1190,1299,1408,1515,1618,1737,1892,2047,2152,2273,2374,2521,2662,2765,2884,2991,3094,3249,3420,3569,3734,3891,4042,4161,4512,4661,4810,4922,5069,5222,5369,5444,5533,5620,5721,5824,8798,8983,11969,12166,12365,12488,12611,12724,12907,13162,13363,13452,13563,13796,13897,13992,14115,14244,14361,14538,14637,14772,14915,15050,15169,15370,15489,15582,15693,15749,15856,16051,16162,16295,16390,16481,16572,16665,16782,16921,16992,17075,17755,17812,17870,18564", - "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,27,29,30,31,32,33,35,37,39,41,43,45,46,51,53,55,56,57,59,61,62,63,64,65,66,109,112,155,158,161,163,165,167,170,174,177,178,179,182,183,184,185,186,187,190,191,193,195,197,199,203,205,206,207,208,210,214,216,218,219,220,221,222,223,225,226,227,237,238,239,251,263", - "endColumns": "90,102,102,104,106,108,108,108,108,108,106,102,118,12,12,104,120,100,12,12,102,118,106,102,12,12,12,12,12,12,118,12,12,12,111,146,12,12,74,88,86,100,102,12,12,12,12,12,12,12,12,12,12,12,88,110,12,100,94,122,128,116,12,98,12,12,12,12,12,12,92,110,55,12,12,12,12,94,90,90,92,116,12,70,82,12,56,57,12,12", - "endOffsets": "440,543,646,751,858,967,1076,1185,1294,1403,1510,1613,1732,1887,2042,2147,2268,2369,2516,2657,2760,2879,2986,3089,3244,3415,3564,3729,3886,4037,4156,4507,4656,4805,4917,5064,5217,5364,5439,5528,5615,5716,5819,8793,8978,11964,12161,12360,12483,12606,12719,12902,13157,13358,13447,13558,13791,13892,13987,14110,14239,14356,14533,14632,14767,14910,15045,15164,15365,15484,15577,15688,15744,15851,16046,16157,16290,16385,16476,16567,16660,16777,16916,16987,17070,17750,17807,17865,18559,19265" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-v21/values-v21.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,13", - "startColumns": "4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,159,223,290,354,470,596,722,850,1022", - "endLines": "2,3,4,5,6,7,8,9,12,17", - "endColumns": "103,63,66,63,115,125,125,127,12,12", - "endOffsets": "154,218,285,349,465,591,717,845,1017,1355" - }, - "to": { - "startLines": "2,3,4,5,264,265,266,267,268,271", - "startColumns": "4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,159,223,290,19270,19386,19512,19638,19766,19938", - "endLines": "2,3,4,5,264,265,266,267,270,275", - "endColumns": "103,63,66,63,115,125,125,127,12,12", - "endOffsets": "154,218,285,349,19381,19507,19633,19761,19933,20271" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-af.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-af.json deleted file mode 100644 index 6bb3ec5..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-af.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-af/values-af.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-af/values-af.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2857", - "endColumns": "100", - "endOffsets": "2953" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-af/values-af.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,309,415,500,603,721,798,875,966,1058,1153,1247,1347,1440,1535,1634,1729,1823,1903,2010,2115,2212,2320,2423,2525,2679,2777", - "endColumns": "107,95,105,84,102,117,76,76,90,91,94,93,99,92,94,98,94,93,79,106,104,96,107,102,101,153,97,79", - "endOffsets": "208,304,410,495,598,716,793,870,961,1053,1148,1242,1342,1435,1530,1629,1724,1818,1898,2005,2110,2207,2315,2418,2520,2674,2772,2852" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-am.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-am.json deleted file mode 100644 index 0cdd480..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-am.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-am/values-am.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-am/values-am.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,203,301,407,493,596,713,791,868,959,1051,1143,1237,1338,1431,1526,1619,1710,1801,1880,1980,2080,2176,2278,2378,2477,2627,2723", - "endColumns": "97,97,105,85,102,116,77,76,90,91,91,93,100,92,94,92,90,90,78,99,99,95,101,99,98,149,95,78", - "endOffsets": "198,296,402,488,591,708,786,863,954,1046,1138,1232,1333,1426,1521,1614,1705,1796,1875,1975,2075,2171,2273,2373,2472,2622,2718,2797" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-am/values-am.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2802", - "endColumns": "100", - "endOffsets": "2898" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ar.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ar.json deleted file mode 100644 index 7c4bd09..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ar.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ar/values-ar.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ar/values-ar.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,317,424,506,607,721,801,880,971,1063,1155,1249,1350,1443,1538,1631,1722,1816,1894,1999,2097,2195,2303,2403,2506,2661,2758", - "endColumns": "107,103,106,81,100,113,79,78,90,91,91,93,100,92,94,92,90,93,77,104,97,97,107,99,102,154,96,80", - "endOffsets": "208,312,419,501,602,716,796,875,966,1058,1150,1244,1345,1438,1533,1626,1717,1811,1889,1994,2092,2190,2298,2398,2501,2656,2753,2834" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ar/values-ar.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2839", - "endColumns": "100", - "endOffsets": "2935" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-as.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-as.json deleted file mode 100644 index 893b9ce..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-as.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-as/values-as.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-as/values-as.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2923", - "endColumns": "100", - "endOffsets": "3019" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-as/values-as.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,312,419,510,612,732,809,885,976,1068,1163,1257,1358,1451,1546,1640,1731,1822,1907,2020,2128,2227,2336,2452,2572,2739,2841", - "endColumns": "107,98,106,90,101,119,76,75,90,91,94,93,100,92,94,93,90,90,84,112,107,98,108,115,119,166,101,81", - "endOffsets": "208,307,414,505,607,727,804,880,971,1063,1158,1252,1353,1446,1541,1635,1726,1817,1902,2015,2123,2222,2331,2447,2567,2734,2836,2918" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-az.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-az.json deleted file mode 100644 index 8dd0aa4..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-az.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-az/values-az.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-az/values-az.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2896", - "endColumns": "100", - "endOffsets": "2992" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-az/values-az.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,215,316,426,514,621,735,817,896,987,1079,1173,1272,1373,1466,1561,1655,1746,1838,1922,2027,2133,2233,2342,2447,2549,2707,2813", - "endColumns": "109,100,109,87,106,113,81,78,90,91,93,98,100,92,94,93,90,91,83,104,105,99,108,104,101,157,105,82", - "endOffsets": "210,311,421,509,616,730,812,891,982,1074,1168,1267,1368,1461,1556,1650,1741,1833,1917,2022,2128,2228,2337,2442,2544,2702,2808,2891" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-b+sr+Latn.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-b+sr+Latn.json deleted file mode 100644 index 8559082..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-b+sr+Latn.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-b+sr+Latn/values-b+sr+Latn.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-b+sr+Latn/values-b+sr+Latn.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2922", - "endColumns": "100", - "endOffsets": "3018" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-b+sr+Latn/values-b+sr+Latn.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,313,419,505,609,731,816,899,990,1082,1177,1271,1372,1465,1560,1665,1756,1847,1932,2037,2143,2246,2353,2462,2569,2739,2836", - "endColumns": "106,100,105,85,103,121,84,82,90,91,94,93,100,92,94,104,90,90,84,104,105,102,106,108,106,169,96,85", - "endOffsets": "207,308,414,500,604,726,811,894,985,1077,1172,1266,1367,1460,1555,1660,1751,1842,1927,2032,2138,2241,2348,2457,2564,2734,2831,2917" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-be.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-be.json deleted file mode 100644 index e372f9f..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-be.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-be/values-be.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-be/values-be.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2916", - "endColumns": "100", - "endOffsets": "3012" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-be/values-be.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,328,444,530,635,754,834,912,1004,1097,1192,1286,1382,1476,1572,1667,1759,1851,1931,2037,2142,2240,2348,2454,2562,2735,2835", - "endColumns": "119,102,115,85,104,118,79,77,91,92,94,93,95,93,95,94,91,91,79,105,104,97,107,105,107,172,99,80", - "endOffsets": "220,323,439,525,630,749,829,907,999,1092,1187,1281,1377,1471,1567,1662,1754,1846,1926,2032,2137,2235,2343,2449,2557,2730,2830,2911" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-bg.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-bg.json deleted file mode 100644 index 1f1ac18..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-bg.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-bg/values-bg.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-bg/values-bg.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,331,436,522,632,753,833,911,1002,1094,1189,1283,1384,1477,1572,1680,1771,1862,1944,2058,2166,2266,2380,2487,2595,2755,2854", - "endColumns": "119,105,104,85,109,120,79,77,90,91,94,93,100,92,94,107,90,90,81,113,107,99,113,106,107,159,98,82", - "endOffsets": "220,326,431,517,627,748,828,906,997,1089,1184,1278,1379,1472,1567,1675,1766,1857,1939,2053,2161,2261,2375,2482,2590,2750,2849,2932" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-bg/values-bg.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2937", - "endColumns": "100", - "endOffsets": "3033" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-bn.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-bn.json deleted file mode 100644 index 0b16559..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-bn.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-bn/values-bn.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-bn/values-bn.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,319,425,514,619,740,823,906,997,1089,1183,1277,1378,1471,1566,1660,1751,1842,1927,2037,2141,2244,2352,2460,2565,2730,2835", - "endColumns": "107,105,105,88,104,120,82,82,90,91,93,93,100,92,94,93,90,90,84,109,103,102,107,107,104,164,104,85", - "endOffsets": "208,314,420,509,614,735,818,901,992,1084,1178,1272,1373,1466,1561,1655,1746,1837,1922,2032,2136,2239,2347,2455,2560,2725,2830,2916" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-bn/values-bn.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2921", - "endColumns": "100", - "endOffsets": "3017" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-bs.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-bs.json deleted file mode 100644 index 8e2c0bf..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-bs.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-bs/values-bs.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-bs/values-bs.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2916", - "endColumns": "100", - "endOffsets": "3012" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-bs/values-bs.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,226,323,430,516,620,742,827,910,1001,1093,1188,1282,1383,1476,1571,1666,1757,1848,1935,2038,2142,2243,2348,2462,2565,2734,2830", - "endColumns": "120,96,106,85,103,121,84,82,90,91,94,93,100,92,94,94,90,90,86,102,103,100,104,113,102,168,95,85", - "endOffsets": "221,318,425,511,615,737,822,905,996,1088,1183,1277,1378,1471,1566,1661,1752,1843,1930,2033,2137,2238,2343,2457,2560,2729,2825,2911" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ca.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ca.json deleted file mode 100644 index 80f5f2d..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ca.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ca/values-ca.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ca/values-ca.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2906", - "endColumns": "100", - "endOffsets": "3002" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ca/values-ca.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,223,328,435,518,624,750,834,914,1005,1097,1190,1285,1384,1477,1570,1664,1755,1846,1926,2037,2145,2243,2353,2458,2566,2726,2825", - "endColumns": "117,104,106,82,105,125,83,79,90,91,92,94,98,92,92,93,90,90,79,110,107,97,109,104,107,159,98,80", - "endOffsets": "218,323,430,513,619,745,829,909,1000,1092,1185,1280,1379,1472,1565,1659,1750,1841,1921,2032,2140,2238,2348,2453,2561,2721,2820,2901" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-cs.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-cs.json deleted file mode 100644 index b3ed786..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-cs.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-cs/values-cs.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-cs/values-cs.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,314,423,509,614,731,809,886,977,1069,1164,1258,1353,1446,1541,1638,1729,1820,1903,2007,2119,2218,2324,2435,2537,2700,2798", - "endColumns": "106,101,108,85,104,116,77,76,90,91,94,93,94,92,94,96,90,90,82,103,111,98,105,110,101,162,97,81", - "endOffsets": "207,309,418,504,609,726,804,881,972,1064,1159,1253,1348,1441,1536,1633,1724,1815,1898,2002,2114,2213,2319,2430,2532,2695,2793,2875" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-cs/values-cs.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2880", - "endColumns": "100", - "endOffsets": "2976" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-da.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-da.json deleted file mode 100644 index 2195992..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-da.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-da/values-da.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-da/values-da.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2836", - "endColumns": "100", - "endOffsets": "2932" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-da/values-da.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,205,299,415,500,600,713,791,868,959,1051,1144,1238,1333,1426,1521,1619,1710,1801,1879,1987,2094,2190,2303,2406,2507,2660,2757", - "endColumns": "99,93,115,84,99,112,77,76,90,91,92,93,94,92,94,97,90,90,77,107,106,95,112,102,100,152,96,78", - "endOffsets": "200,294,410,495,595,708,786,863,954,1046,1139,1233,1328,1421,1516,1614,1705,1796,1874,1982,2089,2185,2298,2401,2502,2655,2752,2831" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-de.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-de.json deleted file mode 100644 index 74b6170..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-de.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-de/values-de.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-de/values-de.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2913", - "endColumns": "100", - "endOffsets": "3009" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-de/values-de.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,308,420,506,612,727,805,881,973,1066,1162,1263,1371,1471,1575,1673,1771,1868,1949,2060,2162,2260,2367,2470,2574,2730,2832", - "endColumns": "104,97,111,85,105,114,77,75,91,92,95,100,107,99,103,97,97,96,80,110,101,97,106,102,103,155,101,80", - "endOffsets": "205,303,415,501,607,722,800,876,968,1061,1157,1258,1366,1466,1570,1668,1766,1863,1944,2055,2157,2255,2362,2465,2569,2725,2827,2908" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-el.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-el.json deleted file mode 100644 index e83dafe..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-el.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-el/values-el.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-el/values-el.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,223,334,451,536,642,765,854,940,1031,1123,1218,1312,1413,1506,1601,1698,1789,1880,1964,2075,2184,2286,2397,2507,2615,2786,2886", - "endColumns": "117,110,116,84,105,122,88,85,90,91,94,93,100,92,94,96,90,90,83,110,108,101,110,109,107,170,99,84", - "endOffsets": "218,329,446,531,637,760,849,935,1026,1118,1213,1307,1408,1501,1596,1693,1784,1875,1959,2070,2179,2281,2392,2502,2610,2781,2881,2966" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-el/values-el.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2971", - "endColumns": "100", - "endOffsets": "3067" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-en-rAU.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-en-rAU.json deleted file mode 100644 index 8348ed3..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-en-rAU.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rAU/values-en-rAU.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-en-rAU/values-en-rAU.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2844", - "endColumns": "100", - "endOffsets": "2940" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-en-rAU/values-en-rAU.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,417,501,601,716,794,870,961,1053,1148,1242,1343,1436,1531,1625,1716,1807,1888,1991,2094,2193,2298,2402,2506,2662,2762", - "endColumns": "103,99,107,83,99,114,77,75,90,91,94,93,100,92,94,93,90,90,80,102,102,98,104,103,103,155,99,81", - "endOffsets": "204,304,412,496,596,711,789,865,956,1048,1143,1237,1338,1431,1526,1620,1711,1802,1883,1986,2089,2188,2293,2397,2501,2657,2757,2839" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-en-rCA.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-en-rCA.json deleted file mode 100644 index cc8749d..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-en-rCA.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rCA/values-en-rCA.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-en-rCA/values-en-rCA.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,417,501,601,716,793,869,960,1053,1149,1243,1344,1437,1532,1626,1717,1808,1890,1993,2097,2196,2301,2404,2508,2664,2764", - "endColumns": "103,99,107,83,99,114,76,75,90,92,95,93,100,92,94,93,90,90,81,102,103,98,104,102,103,155,99,81", - "endOffsets": "204,304,412,496,596,711,788,864,955,1048,1144,1238,1339,1432,1527,1621,1712,1803,1885,1988,2092,2191,2296,2399,2503,2659,2759,2841" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-en-rCA/values-en-rCA.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2846", - "endColumns": "100", - "endOffsets": "2942" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-en-rGB.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-en-rGB.json deleted file mode 100644 index 259b53b..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-en-rGB.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rGB/values-en-rGB.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-en-rGB/values-en-rGB.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2844", - "endColumns": "100", - "endOffsets": "2940" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-en-rGB/values-en-rGB.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,417,501,601,716,794,870,961,1053,1148,1242,1343,1436,1531,1625,1716,1807,1888,1991,2094,2193,2298,2402,2506,2662,2762", - "endColumns": "103,99,107,83,99,114,77,75,90,91,94,93,100,92,94,93,90,90,80,102,102,98,104,103,103,155,99,81", - "endOffsets": "204,304,412,496,596,711,789,865,956,1048,1143,1237,1338,1431,1526,1620,1711,1802,1883,1986,2089,2188,2293,2397,2501,2657,2757,2839" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-en-rIN.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-en-rIN.json deleted file mode 100644 index 9adf489..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-en-rIN.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rIN/values-en-rIN.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-en-rIN/values-en-rIN.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2844", - "endColumns": "100", - "endOffsets": "2940" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-en-rIN/values-en-rIN.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,309,417,501,601,716,794,870,961,1053,1148,1242,1343,1436,1531,1625,1716,1807,1888,1991,2094,2193,2298,2402,2506,2662,2762", - "endColumns": "103,99,107,83,99,114,77,75,90,91,94,93,100,92,94,93,90,90,80,102,102,98,104,103,103,155,99,81", - "endOffsets": "204,304,412,496,596,711,789,865,956,1048,1143,1237,1338,1431,1526,1620,1711,1802,1883,1986,2089,2188,2293,2397,2501,2657,2757,2839" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-en-rXC.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-en-rXC.json deleted file mode 100644 index b5255ef..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-en-rXC.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-en-rXC/values-en-rXC.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-en-rXC/values-en-rXC.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "202", - "endOffsets": "253" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "5682", - "endColumns": "202", - "endOffsets": "5880" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-en-rXC/values-en-rXC.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,310,510,719,904,1106,1321,1494,1671,1862,2055,2253,2449,2652,2847,3044,3239,3432,3623,3807,4011,4216,4417,4624,4826,5031,5303,5503", - "endColumns": "204,199,208,184,201,214,172,176,190,192,197,195,202,194,196,194,192,190,183,203,204,200,206,201,204,271,199,178", - "endOffsets": "305,505,714,899,1101,1316,1489,1666,1857,2050,2248,2444,2647,2842,3039,3234,3427,3618,3802,4006,4211,4412,4619,4821,5026,5298,5498,5677" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-es-rUS.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-es-rUS.json deleted file mode 100644 index 7d890ae..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-es-rUS.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-es-rUS/values-es-rUS.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-es-rUS/values-es-rUS.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,334,442,527,629,745,830,911,1002,1094,1189,1283,1383,1476,1575,1671,1762,1853,1934,2041,2140,2239,2347,2455,2562,2721,2821", - "endColumns": "119,108,107,84,101,115,84,80,90,91,94,93,99,92,98,95,90,90,80,106,98,98,107,107,106,158,99,81", - "endOffsets": "220,329,437,522,624,740,825,906,997,1089,1184,1278,1378,1471,1570,1666,1757,1848,1929,2036,2135,2234,2342,2450,2557,2716,2816,2898" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-es-rUS/values-es-rUS.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2903", - "endColumns": "100", - "endOffsets": "2999" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-es.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-es.json deleted file mode 100644 index ad4c8a1..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-es.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-es/values-es.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-es/values-es.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,207,320,428,513,614,742,828,910,1002,1095,1192,1286,1387,1481,1577,1673,1765,1857,1938,2045,2156,2255,2363,2471,2578,2737,2836", - "endColumns": "101,112,107,84,100,127,85,81,91,92,96,93,100,93,95,95,91,91,80,106,110,98,107,107,106,158,98,81", - "endOffsets": "202,315,423,508,609,737,823,905,997,1090,1187,1281,1382,1476,1572,1668,1760,1852,1933,2040,2151,2250,2358,2466,2573,2732,2831,2913" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-es/values-es.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2918", - "endColumns": "100", - "endOffsets": "3014" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-et.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-et.json deleted file mode 100644 index 71f4102..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-et.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-et/values-et.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-et/values-et.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2909", - "endColumns": "100", - "endOffsets": "3005" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-et/values-et.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,211,310,421,507,609,726,807,885,977,1070,1166,1268,1378,1472,1573,1667,1759,1852,1934,2045,2149,2248,2358,2460,2559,2725,2827", - "endColumns": "105,98,110,85,101,116,80,77,91,92,95,101,109,93,100,93,91,92,81,110,103,98,109,101,98,165,101,81", - "endOffsets": "206,305,416,502,604,721,802,880,972,1065,1161,1263,1373,1467,1568,1662,1754,1847,1929,2040,2144,2243,2353,2455,2554,2720,2822,2904" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-eu.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-eu.json deleted file mode 100644 index 3d5b283..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-eu.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-eu/values-eu.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-eu/values-eu.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2932", - "endColumns": "100", - "endOffsets": "3028" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-eu/values-eu.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,312,422,508,614,738,824,906,998,1091,1187,1281,1383,1477,1573,1670,1762,1855,1936,2045,2154,2253,2362,2469,2580,2751,2850", - "endColumns": "108,97,109,85,105,123,85,81,91,92,95,93,101,93,95,96,91,92,80,108,108,98,108,106,110,170,98,81", - "endOffsets": "209,307,417,503,609,733,819,901,993,1086,1182,1276,1378,1472,1568,1665,1757,1850,1931,2040,2149,2248,2357,2464,2575,2746,2845,2927" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-fa.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-fa.json deleted file mode 100644 index cfa6317..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-fa.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-fa/values-fa.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-fa/values-fa.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2876", - "endColumns": "100", - "endOffsets": "2972" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-fa/values-fa.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,215,316,427,511,612,727,807,885,978,1072,1164,1258,1361,1456,1553,1647,1740,1830,1911,2019,2123,2221,2327,2432,2537,2694,2795", - "endColumns": "109,100,110,83,100,114,79,77,92,93,91,93,102,94,96,93,92,89,80,107,103,97,105,104,104,156,100,80", - "endOffsets": "210,311,422,506,607,722,802,880,973,1067,1159,1253,1356,1451,1548,1642,1735,1825,1906,2014,2118,2216,2322,2427,2532,2689,2790,2871" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-fi.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-fi.json deleted file mode 100644 index 9e3e9e3..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-fi.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-fi/values-fi.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-fi/values-fi.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,313,422,508,613,731,817,897,988,1080,1175,1269,1364,1457,1553,1652,1743,1837,1916,2023,2124,2221,2327,2427,2525,2675,2775", - "endColumns": "107,99,108,85,104,117,85,79,90,91,94,93,94,92,95,98,90,93,78,106,100,96,105,99,97,149,99,79", - "endOffsets": "208,308,417,503,608,726,812,892,983,1075,1170,1264,1359,1452,1548,1647,1738,1832,1911,2018,2119,2216,2322,2422,2520,2670,2770,2850" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-fi/values-fi.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2855", - "endColumns": "100", - "endOffsets": "2951" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-fr-rCA.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-fr-rCA.json deleted file mode 100644 index 64b7203..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-fr-rCA.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-fr-rCA/values-fr-rCA.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-fr-rCA/values-fr-rCA.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2941", - "endColumns": "100", - "endOffsets": "3037" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-fr-rCA/values-fr-rCA.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,323,433,520,626,756,841,922,1013,1105,1203,1298,1399,1492,1585,1680,1771,1862,1947,2057,2168,2271,2382,2490,2597,2756,2855", - "endColumns": "110,106,109,86,105,129,84,80,90,91,97,94,100,92,92,94,90,90,84,109,110,102,110,107,106,158,98,85", - "endOffsets": "211,318,428,515,621,751,836,917,1008,1100,1198,1293,1394,1487,1580,1675,1766,1857,1942,2052,2163,2266,2377,2485,2592,2751,2850,2936" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-fr.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-fr.json deleted file mode 100644 index fd106c0..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-fr.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-fr/values-fr.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-fr/values-fr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,331,441,523,629,759,837,914,1005,1097,1195,1290,1391,1484,1577,1672,1763,1854,1939,2049,2160,2263,2374,2482,2589,2748,2847", - "endColumns": "110,114,109,81,105,129,77,76,90,91,97,94,100,92,92,94,90,90,84,109,110,102,110,107,106,158,98,85", - "endOffsets": "211,326,436,518,624,754,832,909,1000,1092,1190,1285,1386,1479,1572,1667,1758,1849,1934,2044,2155,2258,2369,2477,2584,2743,2842,2928" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-fr/values-fr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2933", - "endColumns": "100", - "endOffsets": "3029" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-gl.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-gl.json deleted file mode 100644 index 5901d36..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-gl.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-gl/values-gl.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-gl/values-gl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2935", - "endColumns": "100", - "endOffsets": "3031" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-gl/values-gl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,209,313,421,506,607,735,820,901,993,1086,1183,1277,1378,1472,1568,1663,1755,1847,1927,2035,2142,2249,2358,2463,2577,2754,2853", - "endColumns": "103,103,107,84,100,127,84,80,91,92,96,93,100,93,95,94,91,91,79,107,106,106,108,104,113,176,98,81", - "endOffsets": "204,308,416,501,602,730,815,896,988,1081,1178,1272,1373,1467,1563,1658,1750,1842,1922,2030,2137,2244,2353,2458,2572,2749,2848,2930" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-gu.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-gu.json deleted file mode 100644 index 114c652..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-gu.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-gu/values-gu.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-gu/values-gu.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,316,423,510,610,730,808,886,977,1069,1164,1258,1359,1452,1547,1641,1732,1823,1902,2008,2109,2206,2315,2415,2525,2685,2788", - "endColumns": "106,103,106,86,99,119,77,77,90,91,94,93,100,92,94,93,90,90,78,105,100,96,108,99,109,159,102,79", - "endOffsets": "207,311,418,505,605,725,803,881,972,1064,1159,1253,1354,1447,1542,1636,1727,1818,1897,2003,2104,2201,2310,2410,2520,2680,2783,2863" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-gu/values-gu.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2868", - "endColumns": "100", - "endOffsets": "2964" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-h720dp-v13.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-h720dp-v13.json deleted file mode 100644 index 5a5d69f..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-h720dp-v13.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-h720dp-v13/values-h720dp-v13.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-h720dp-v13/values-h720dp-v13.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "66", - "endOffsets": "117" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-hdpi-v4.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-hdpi-v4.json deleted file mode 100644 index f722ee1..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-hdpi-v4.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hdpi-v4/values-hdpi-v4.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-hdpi-v4/values-hdpi-v4.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endLines": "6", - "endColumns": "13", - "endOffsets": "327" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-hi.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-hi.json deleted file mode 100644 index 4cf1ad5..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-hi.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hi/values-hi.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-hi/values-hi.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,211,309,419,505,607,728,806,884,975,1067,1162,1256,1357,1450,1545,1639,1730,1821,1901,2006,2108,2206,2316,2419,2528,2686,2787", - "endColumns": "105,97,109,85,101,120,77,77,90,91,94,93,100,92,94,93,90,90,79,104,101,97,109,102,108,157,100,80", - "endOffsets": "206,304,414,500,602,723,801,879,970,1062,1157,1251,1352,1445,1540,1634,1725,1816,1896,2001,2103,2201,2311,2414,2523,2681,2782,2863" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-hi/values-hi.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2868", - "endColumns": "100", - "endOffsets": "2964" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-hr.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-hr.json deleted file mode 100644 index 7cc49bd..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-hr.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hr/values-hr.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-hr/values-hr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2900", - "endColumns": "100", - "endOffsets": "2996" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-hr/values-hr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,305,412,498,602,721,806,889,980,1072,1167,1261,1362,1455,1550,1645,1736,1827,1912,2016,2128,2229,2334,2448,2550,2719,2816", - "endColumns": "104,94,106,85,103,118,84,82,90,91,94,93,100,92,94,94,90,90,84,103,111,100,104,113,101,168,96,83", - "endOffsets": "205,300,407,493,597,716,801,884,975,1067,1162,1256,1357,1450,1545,1640,1731,1822,1907,2011,2123,2224,2329,2443,2545,2714,2811,2895" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-hu.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-hu.json deleted file mode 100644 index be3ae86..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-hu.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hu/values-hu.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-hu/values-hu.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,305,420,504,619,742,819,895,986,1078,1173,1267,1368,1461,1556,1651,1742,1833,1915,2025,2135,2235,2346,2455,2574,2756,2859", - "endColumns": "107,91,114,83,114,122,76,75,90,91,94,93,100,92,94,94,90,90,81,109,109,99,110,108,118,181,102,82", - "endOffsets": "208,300,415,499,614,737,814,890,981,1073,1168,1262,1363,1456,1551,1646,1737,1828,1910,2020,2130,2230,2341,2450,2569,2751,2854,2937" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-hu/values-hu.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2942", - "endColumns": "100", - "endOffsets": "3038" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-hy.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-hy.json deleted file mode 100644 index 186b52f..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-hy.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-hy/values-hy.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-hy/values-hy.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,313,423,512,618,735,817,898,989,1081,1176,1270,1371,1464,1559,1653,1744,1835,1917,2023,2129,2228,2338,2446,2547,2717,2814", - "endColumns": "107,99,109,88,105,116,81,80,90,91,94,93,100,92,94,93,90,90,81,105,105,98,109,107,100,169,96,81", - "endOffsets": "208,308,418,507,613,730,812,893,984,1076,1171,1265,1366,1459,1554,1648,1739,1830,1912,2018,2124,2223,2333,2441,2542,2712,2809,2891" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-hy/values-hy.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2896", - "endColumns": "100", - "endOffsets": "2992" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-in.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-in.json deleted file mode 100644 index c994a0c..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-in.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-in/values-in.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-in/values-in.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,220,324,429,516,620,736,819,898,989,1081,1176,1270,1371,1464,1559,1653,1744,1835,1920,2023,2128,2229,2333,2442,2550,2710,2809", - "endColumns": "114,103,104,86,103,115,82,78,90,91,94,93,100,92,94,93,90,90,84,102,104,100,103,108,107,159,98,83", - "endOffsets": "215,319,424,511,615,731,814,893,984,1076,1171,1265,1366,1459,1554,1648,1739,1830,1915,2018,2123,2224,2328,2437,2545,2705,2804,2888" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-in/values-in.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2893", - "endColumns": "100", - "endOffsets": "2989" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-is.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-is.json deleted file mode 100644 index 79f5478..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-is.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-is/values-is.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-is/values-is.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2859", - "endColumns": "100", - "endOffsets": "2955" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-is/values-is.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,205,302,414,499,600,714,795,875,966,1058,1151,1245,1352,1445,1540,1635,1726,1820,1900,2010,2117,2214,2323,2423,2526,2681,2779", - "endColumns": "99,96,111,84,100,113,80,79,90,91,92,93,106,92,94,94,90,93,79,109,106,96,108,99,102,154,97,79", - "endOffsets": "200,297,409,494,595,709,790,870,961,1053,1146,1240,1347,1440,1535,1630,1721,1815,1895,2005,2112,2209,2318,2418,2521,2676,2774,2854" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-it.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-it.json deleted file mode 100644 index a01664b..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-it.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-it/values-it.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-it/values-it.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,313,422,506,611,730,808,884,976,1069,1162,1256,1358,1452,1549,1644,1736,1828,1908,2014,2121,2219,2323,2429,2536,2699,2799", - "endColumns": "104,102,108,83,104,118,77,75,91,92,92,93,101,93,96,94,91,91,79,105,106,97,103,105,106,162,99,80", - "endOffsets": "205,308,417,501,606,725,803,879,971,1064,1157,1251,1353,1447,1544,1639,1731,1823,1903,2009,2116,2214,2318,2424,2531,2694,2794,2875" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-it/values-it.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2880", - "endColumns": "100", - "endOffsets": "2976" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-iw.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-iw.json deleted file mode 100644 index 0e710dc..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-iw.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-iw/values-iw.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-iw/values-iw.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,310,418,502,604,720,799,878,969,1062,1156,1250,1351,1444,1539,1632,1723,1815,1895,2000,2103,2201,2306,2408,2510,2664,2761", - "endColumns": "104,99,107,83,101,115,78,78,90,92,93,93,100,92,94,92,90,91,79,104,102,97,104,101,101,153,96,80", - "endOffsets": "205,305,413,497,599,715,794,873,964,1057,1151,1245,1346,1439,1534,1627,1718,1810,1890,1995,2098,2196,2301,2403,2505,2659,2756,2837" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-iw/values-iw.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2842", - "endColumns": "100", - "endOffsets": "2938" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ja.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ja.json deleted file mode 100644 index ba70114..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ja.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ja/values-ja.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ja/values-ja.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2769", - "endColumns": "100", - "endOffsets": "2865" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ja/values-ja.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,202,295,400,482,580,688,766,842,933,1025,1120,1214,1315,1408,1503,1597,1688,1779,1856,1958,2056,2151,2254,2350,2446,2594,2691", - "endColumns": "96,92,104,81,97,107,77,75,90,91,94,93,100,92,94,93,90,90,76,101,97,94,102,95,95,147,96,77", - "endOffsets": "197,290,395,477,575,683,761,837,928,1020,1115,1209,1310,1403,1498,1592,1683,1774,1851,1953,2051,2146,2249,2345,2441,2589,2686,2764" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ka.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ka.json deleted file mode 100644 index 9f085ae..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ka.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ka/values-ka.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ka/values-ka.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2889", - "endColumns": "100", - "endOffsets": "2985" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ka/values-ka.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,316,427,513,618,731,814,894,985,1077,1172,1266,1367,1460,1555,1650,1741,1832,1912,2025,2131,2229,2342,2447,2551,2709,2808", - "endColumns": "107,102,110,85,104,112,82,79,90,91,94,93,100,92,94,94,90,90,79,112,105,97,112,104,103,157,98,80", - "endOffsets": "208,311,422,508,613,726,809,889,980,1072,1167,1261,1362,1455,1550,1645,1736,1827,1907,2020,2126,2224,2337,2442,2546,2704,2803,2884" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-kk.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-kk.json deleted file mode 100644 index c36a5f7..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-kk.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-kk/values-kk.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-kk/values-kk.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2877", - "endColumns": "100", - "endOffsets": "2973" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-kk/values-kk.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,318,428,513,619,738,818,896,987,1079,1174,1268,1369,1462,1557,1654,1745,1836,1916,2021,2124,2222,2329,2435,2535,2701,2796", - "endColumns": "107,104,109,84,105,118,79,77,90,91,94,93,100,92,94,96,90,90,79,104,102,97,106,105,99,165,94,80", - "endOffsets": "208,313,423,508,614,733,813,891,982,1074,1169,1263,1364,1457,1552,1649,1740,1831,1911,2016,2119,2217,2324,2430,2530,2696,2791,2872" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-km.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-km.json deleted file mode 100644 index e2cb749..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-km.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-km/values-km.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-km/values-km.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,207,306,416,503,606,727,805,882,973,1065,1157,1251,1352,1445,1540,1634,1725,1816,1898,2002,2106,2206,2315,2424,2533,2695,2793", - "endColumns": "101,98,109,86,102,120,77,76,90,91,91,93,100,92,94,93,90,90,81,103,103,99,108,108,108,161,97,82", - "endOffsets": "202,301,411,498,601,722,800,877,968,1060,1152,1246,1347,1440,1535,1629,1720,1811,1893,1997,2101,2201,2310,2419,2528,2690,2788,2871" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-km/values-km.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2876", - "endColumns": "100", - "endOffsets": "2972" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-kn.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-kn.json deleted file mode 100644 index b6a4b96..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-kn.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-kn/values-kn.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-kn/values-kn.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,331,444,532,639,765,843,920,1011,1103,1198,1292,1393,1486,1581,1675,1766,1857,1938,2054,2164,2263,2376,2481,2595,2759,2859", - "endColumns": "113,111,112,87,106,125,77,76,90,91,94,93,100,92,94,93,90,90,80,115,109,98,112,104,113,163,99,81", - "endOffsets": "214,326,439,527,634,760,838,915,1006,1098,1193,1287,1388,1481,1576,1670,1761,1852,1933,2049,2159,2258,2371,2476,2590,2754,2854,2936" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-kn/values-kn.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2941", - "endColumns": "100", - "endOffsets": "3037" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ko.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ko.json deleted file mode 100644 index 56cb50e..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ko.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ko/values-ko.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ko/values-ko.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2763", - "endColumns": "100", - "endOffsets": "2859" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ko/values-ko.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,202,296,397,479,577,683,763,839,930,1022,1117,1211,1312,1405,1500,1594,1685,1776,1855,1953,2047,2142,2242,2339,2439,2591,2685", - "endColumns": "96,93,100,81,97,105,79,75,90,91,94,93,100,92,94,93,90,90,78,97,93,94,99,96,99,151,93,77", - "endOffsets": "197,291,392,474,572,678,758,834,925,1017,1112,1206,1307,1400,1495,1589,1680,1771,1850,1948,2042,2137,2237,2334,2434,2586,2680,2758" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ky.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ky.json deleted file mode 100644 index 29c3687..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ky.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ky/values-ky.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ky/values-ky.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2901", - "endColumns": "100", - "endOffsets": "2997" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ky/values-ky.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,325,437,522,627,744,823,902,993,1085,1180,1274,1375,1468,1563,1658,1749,1840,1920,2026,2131,2229,2336,2442,2557,2718,2820", - "endColumns": "110,108,111,84,104,116,78,78,90,91,94,93,100,92,94,94,90,90,79,105,104,97,106,105,114,160,101,80", - "endOffsets": "211,320,432,517,622,739,818,897,988,1080,1175,1269,1370,1463,1558,1653,1744,1835,1915,2021,2126,2224,2331,2437,2552,2713,2815,2896" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-land.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-land.json deleted file mode 100644 index a630dde..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-land.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-land/values-land.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-land/values-land.xml", - "from": { - "startLines": "2,3,4", - "startColumns": "4,4,4", - "startOffsets": "55,125,196", - "endColumns": "69,70,67", - "endOffsets": "120,191,259" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-large-v4.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-large-v4.json deleted file mode 100644 index 751d158..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-large-v4.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-large-v4/values-large-v4.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-large-v4/values-large-v4.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10", - "startColumns": "4,4,4,4,4,4,4,4,4", - "startOffsets": "55,114,185,256,326,396,464,532,636", - "endColumns": "58,70,70,69,69,67,67,103,115", - "endOffsets": "109,180,251,321,391,459,527,631,747" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ldltr-v21.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ldltr-v21.json deleted file mode 100644 index c6f2d43..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ldltr-v21.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ldltr-v21/values-ldltr-v21.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ldltr-v21/values-ldltr-v21.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "112", - "endOffsets": "163" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-lo.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-lo.json deleted file mode 100644 index 25eebc9..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-lo.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-lo/values-lo.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-lo/values-lo.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2853", - "endColumns": "100", - "endOffsets": "2949" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-lo/values-lo.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,311,424,509,613,724,802,880,971,1063,1155,1249,1350,1443,1538,1634,1725,1816,1896,2003,2107,2205,2308,2412,2516,2673,2772", - "endColumns": "102,102,112,84,103,110,77,77,90,91,91,93,100,92,94,95,90,90,79,106,103,97,102,103,103,156,98,80", - "endOffsets": "203,306,419,504,608,719,797,875,966,1058,1150,1244,1345,1438,1533,1629,1720,1811,1891,1998,2102,2200,2303,2407,2511,2668,2767,2848" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-lt.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-lt.json deleted file mode 100644 index 09e9bdc..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-lt.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-lt/values-lt.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-lt/values-lt.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,221,325,438,525,627,749,832,913,1007,1102,1199,1295,1399,1495,1593,1689,1783,1877,1959,2068,2176,2276,2386,2491,2597,2773,2874", - "endColumns": "115,103,112,86,101,121,82,80,93,94,96,95,103,95,97,95,93,93,81,108,107,99,109,104,105,175,100,82", - "endOffsets": "216,320,433,520,622,744,827,908,1002,1097,1194,1290,1394,1490,1588,1684,1778,1872,1954,2063,2171,2271,2381,2486,2592,2768,2869,2952" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-lt/values-lt.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2957", - "endColumns": "100", - "endOffsets": "3053" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-lv.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-lv.json deleted file mode 100644 index 83665e4..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-lv.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-lv/values-lv.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-lv/values-lv.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "3071", - "endColumns": "100", - "endOffsets": "3167" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-lv/values-lv.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,335,444,530,634,756,838,919,1029,1136,1242,1351,1463,1566,1678,1785,1890,1990,2074,2183,2294,2393,2504,2611,2716,2890,2989", - "endColumns": "119,109,108,85,103,121,81,80,109,106,105,108,111,102,111,106,104,99,83,108,110,98,110,106,104,173,98,81", - "endOffsets": "220,330,439,525,629,751,833,914,1024,1131,1237,1346,1458,1561,1673,1780,1885,1985,2069,2178,2289,2388,2499,2606,2711,2885,2984,3066" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-mk.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-mk.json deleted file mode 100644 index 8d39afe..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-mk.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-mk/values-mk.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-mk/values-mk.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,317,425,511,619,738,822,904,995,1087,1183,1277,1378,1471,1566,1662,1753,1844,1930,2036,2142,2243,2350,2462,2566,2722,2820", - "endColumns": "107,103,107,85,107,118,83,81,90,91,95,93,100,92,94,95,90,90,85,105,105,100,106,111,103,155,97,83", - "endOffsets": "208,312,420,506,614,733,817,899,990,1082,1178,1272,1373,1466,1561,1657,1748,1839,1925,2031,2137,2238,2345,2457,2561,2717,2815,2899" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-mk/values-mk.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2904", - "endColumns": "100", - "endOffsets": "3000" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ml.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ml.json deleted file mode 100644 index 58d26c2..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ml.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ml/values-ml.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ml/values-ml.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,318,429,520,625,747,825,901,992,1084,1185,1279,1380,1474,1569,1668,1759,1850,1931,2040,2144,2243,2355,2467,2588,2753,2854", - "endColumns": "106,105,110,90,104,121,77,75,90,91,100,93,100,93,94,98,90,90,80,108,103,98,111,111,120,164,100,81", - "endOffsets": "207,313,424,515,620,742,820,896,987,1079,1180,1274,1375,1469,1564,1663,1754,1845,1926,2035,2139,2238,2350,2462,2583,2748,2849,2931" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ml/values-ml.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2936", - "endColumns": "100", - "endOffsets": "3032" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-mn.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-mn.json deleted file mode 100644 index 5dfd3a4..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-mn.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-mn/values-mn.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-mn/values-mn.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2877", - "endColumns": "100", - "endOffsets": "2973" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-mn/values-mn.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,319,428,514,620,734,817,899,990,1082,1177,1273,1371,1464,1558,1650,1741,1831,1910,2017,2120,2217,2324,2426,2539,2698,2797", - "endColumns": "113,99,108,85,105,113,82,81,90,91,94,95,97,92,93,91,90,89,78,106,102,96,106,101,112,158,98,79", - "endOffsets": "214,314,423,509,615,729,812,894,985,1077,1172,1268,1366,1459,1553,1645,1736,1826,1905,2012,2115,2212,2319,2421,2534,2693,2792,2872" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-mr.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-mr.json deleted file mode 100644 index f6e92c5..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-mr.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-mr/values-mr.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-mr/values-mr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,322,429,519,621,733,811,889,980,1072,1165,1262,1363,1456,1551,1645,1736,1827,1906,2013,2114,2210,2319,2421,2535,2692,2795", - "endColumns": "110,105,106,89,101,111,77,77,90,91,92,96,100,92,94,93,90,90,78,106,100,95,108,101,113,156,102,78", - "endOffsets": "211,317,424,514,616,728,806,884,975,1067,1160,1257,1358,1451,1546,1640,1731,1822,1901,2008,2109,2205,2314,2416,2530,2687,2790,2869" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-mr/values-mr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2874", - "endColumns": "100", - "endOffsets": "2970" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ms.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ms.json deleted file mode 100644 index 81318e5..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ms.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ms/values-ms.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ms/values-ms.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,321,429,516,620,731,810,889,980,1072,1167,1261,1360,1453,1548,1642,1733,1824,1903,2015,2123,2220,2329,2433,2540,2699,2800", - "endColumns": "110,104,107,86,103,110,78,78,90,91,94,93,98,92,94,93,90,90,78,111,107,96,108,103,106,158,100,79", - "endOffsets": "211,316,424,511,615,726,805,884,975,1067,1162,1256,1355,1448,1543,1637,1728,1819,1898,2010,2118,2215,2324,2428,2535,2694,2795,2875" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ms/values-ms.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2880", - "endColumns": "100", - "endOffsets": "2976" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-my.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-my.json deleted file mode 100644 index daa82e6..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-my.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-my/values-my.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-my/values-my.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,218,325,441,528,637,760,842,924,1015,1107,1202,1296,1397,1490,1585,1679,1770,1861,1945,2060,2169,2268,2394,2501,2609,2769,2872", - "endColumns": "112,106,115,86,108,122,81,81,90,91,94,93,100,92,94,93,90,90,83,114,108,98,125,106,107,159,102,84", - "endOffsets": "213,320,436,523,632,755,837,919,1010,1102,1197,1291,1392,1485,1580,1674,1765,1856,1940,2055,2164,2263,2389,2496,2604,2764,2867,2952" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-my/values-my.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2957", - "endColumns": "100", - "endOffsets": "3053" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-nb.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-nb.json deleted file mode 100644 index 5651218..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-nb.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-nb/values-nb.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-nb/values-nb.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2816", - "endColumns": "100", - "endOffsets": "2912" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-nb/values-nb.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,303,417,503,603,716,793,869,960,1052,1146,1240,1341,1434,1529,1627,1718,1809,1886,1989,2087,2183,2287,2386,2487,2640,2737", - "endColumns": "102,94,113,85,99,112,76,75,90,91,93,93,100,92,94,97,90,90,76,102,97,95,103,98,100,152,96,78", - "endOffsets": "203,298,412,498,598,711,788,864,955,1047,1141,1235,1336,1429,1524,1622,1713,1804,1881,1984,2082,2178,2282,2381,2482,2635,2732,2811" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ne.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ne.json deleted file mode 100644 index a6618b2..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ne.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ne/values-ne.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ne/values-ne.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,327,435,526,633,760,844,924,1015,1107,1202,1296,1397,1490,1585,1679,1770,1861,1946,2059,2160,2256,2369,2479,2603,2777,2888", - "endColumns": "110,110,107,90,106,126,83,79,90,91,94,93,100,92,94,93,90,90,84,112,100,95,112,109,123,173,110,78", - "endOffsets": "211,322,430,521,628,755,839,919,1010,1102,1197,1291,1392,1485,1580,1674,1765,1856,1941,2054,2155,2251,2364,2474,2598,2772,2883,2962" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ne/values-ne.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2967", - "endColumns": "100", - "endOffsets": "3063" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-night-v8.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-night-v8.json deleted file mode 100644 index 2bea305..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-night-v8.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-night-v8/values-night-v8.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-night-v8/values-night-v8.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9", - "startColumns": "4,4,4,4,4,4,4,4", - "startOffsets": "55,125,209,293,389,491,593,687", - "endColumns": "69,83,83,95,101,101,93,88", - "endOffsets": "120,204,288,384,486,588,682,771" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-nl.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-nl.json deleted file mode 100644 index 8ef7d97..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-nl.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-nl/values-nl.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-nl/values-nl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2914", - "endColumns": "100", - "endOffsets": "3010" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-nl/values-nl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,223,328,435,521,629,749,827,904,996,1089,1184,1278,1379,1473,1569,1664,1756,1848,1929,2040,2143,2242,2357,2471,2574,2729,2832", - "endColumns": "117,104,106,85,107,119,77,76,91,92,94,93,100,93,95,94,91,91,80,110,102,98,114,113,102,154,102,81", - "endOffsets": "218,323,430,516,624,744,822,899,991,1084,1179,1273,1374,1468,1564,1659,1751,1843,1924,2035,2138,2237,2352,2466,2569,2724,2827,2909" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-or.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-or.json deleted file mode 100644 index d1e01ed..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-or.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-or/values-or.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-or/values-or.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,224,334,441,527,631,751,829,906,997,1089,1185,1280,1381,1474,1569,1665,1756,1846,1934,2044,2148,2254,2365,2469,2587,2750,2856", - "endColumns": "118,109,106,85,103,119,77,76,90,91,95,94,100,92,94,95,90,89,87,109,103,105,110,103,117,162,105,88", - "endOffsets": "219,329,436,522,626,746,824,901,992,1084,1180,1275,1376,1469,1564,1660,1751,1841,1929,2039,2143,2249,2360,2464,2582,2745,2851,2940" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-or/values-or.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2945", - "endColumns": "100", - "endOffsets": "3041" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-pa.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-pa.json deleted file mode 100644 index 3537348..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-pa.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-pa/values-pa.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-pa/values-pa.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,305,410,496,596,709,787,865,956,1048,1142,1236,1337,1430,1525,1619,1710,1801,1879,1989,2092,2188,2299,2401,2511,2670,2767", - "endColumns": "102,96,104,85,99,112,77,77,90,91,93,93,100,92,94,93,90,90,77,109,102,95,110,101,109,158,96,78", - "endOffsets": "203,300,405,491,591,704,782,860,951,1043,1137,1231,1332,1425,1520,1614,1705,1796,1874,1984,2087,2183,2294,2396,2506,2665,2762,2841" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-pa/values-pa.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2846", - "endColumns": "100", - "endOffsets": "2942" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-pl.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-pl.json deleted file mode 100644 index 2e1121e..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-pl.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-pl/values-pl.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-pl/values-pl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2899", - "endColumns": "100", - "endOffsets": "2995" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-pl/values-pl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,220,322,430,516,623,742,821,898,989,1081,1176,1270,1372,1465,1560,1655,1746,1837,1918,2027,2127,2226,2335,2447,2558,2721,2817", - "endColumns": "114,101,107,85,106,118,78,76,90,91,94,93,101,92,94,94,90,90,80,108,99,98,108,111,110,162,95,81", - "endOffsets": "215,317,425,511,618,737,816,893,984,1076,1171,1265,1367,1460,1555,1650,1741,1832,1913,2022,2122,2221,2330,2442,2553,2716,2812,2894" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-port.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-port.json deleted file mode 100644 index a5017ef..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-port.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-port/values-port.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-port/values-port.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "55", - "endOffsets": "106" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-pt-rBR.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-pt-rBR.json deleted file mode 100644 index cc9de70..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-pt-rBR.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-pt-rBR/values-pt-rBR.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-pt-rBR/values-pt-rBR.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2928", - "endColumns": "100", - "endOffsets": "3024" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-pt-rBR/values-pt-rBR.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,331,438,527,628,747,832,913,1004,1096,1191,1285,1386,1479,1574,1669,1760,1851,1935,2042,2153,2255,2363,2471,2581,2743,2843", - "endColumns": "119,105,106,88,100,118,84,80,90,91,94,93,100,92,94,94,90,90,83,106,110,101,107,107,109,161,99,84", - "endOffsets": "220,326,433,522,623,742,827,908,999,1091,1186,1280,1381,1474,1569,1664,1755,1846,1930,2037,2148,2250,2358,2466,2576,2738,2838,2923" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-pt-rPT.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-pt-rPT.json deleted file mode 100644 index 478c5a2..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-pt-rPT.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-pt-rPT/values-pt-rPT.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-pt-rPT/values-pt-rPT.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2933", - "endColumns": "100", - "endOffsets": "3029" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-pt-rPT/values-pt-rPT.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,319,426,515,616,740,825,906,998,1091,1188,1282,1382,1476,1572,1667,1759,1851,1935,2042,2153,2255,2363,2471,2578,2749,2848", - "endColumns": "107,105,106,88,100,123,84,80,91,92,96,93,99,93,95,94,91,91,83,106,110,101,107,107,106,170,98,84", - "endOffsets": "208,314,421,510,611,735,820,901,993,1086,1183,1277,1377,1471,1567,1662,1754,1846,1930,2037,2148,2250,2358,2466,2573,2744,2843,2928" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-pt.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-pt.json deleted file mode 100644 index 5c5d783..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-pt.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-pt/values-pt.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-pt/values-pt.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,225,331,438,527,628,747,832,913,1004,1096,1191,1285,1386,1479,1574,1669,1760,1851,1935,2042,2153,2255,2363,2471,2581,2743,2843", - "endColumns": "119,105,106,88,100,118,84,80,90,91,94,93,100,92,94,94,90,90,83,106,110,101,107,107,109,161,99,84", - "endOffsets": "220,326,433,522,623,742,827,908,999,1091,1186,1280,1381,1474,1569,1664,1755,1846,1930,2037,2148,2250,2358,2466,2576,2738,2838,2923" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-pt/values-pt.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2928", - "endColumns": "100", - "endOffsets": "3024" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ro.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ro.json deleted file mode 100644 index ca40d27..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ro.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ro/values-ro.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ro/values-ro.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2934", - "endColumns": "100", - "endOffsets": "3030" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ro/values-ro.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,226,330,443,527,631,752,837,918,1009,1101,1196,1290,1391,1484,1579,1673,1764,1856,1938,2050,2158,2258,2372,2478,2584,2748,2851", - "endColumns": "120,103,112,83,103,120,84,80,90,91,94,93,100,92,94,93,90,91,81,111,107,99,113,105,105,163,102,82", - "endOffsets": "221,325,438,522,626,747,832,913,1004,1096,1191,1285,1386,1479,1574,1668,1759,1851,1933,2045,2153,2253,2367,2473,2579,2743,2846,2929" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ru.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ru.json deleted file mode 100644 index 63b5c10..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ru.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ru/values-ru.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ru/values-ru.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2903", - "endColumns": "100", - "endOffsets": "2999" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ru/values-ru.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,220,322,421,507,612,733,812,889,981,1074,1169,1262,1358,1452,1548,1643,1735,1827,1915,2021,2128,2226,2335,2442,2556,2722,2822", - "endColumns": "114,101,98,85,104,120,78,76,91,92,94,92,95,93,95,94,91,91,87,105,106,97,108,106,113,165,99,80", - "endOffsets": "215,317,416,502,607,728,807,884,976,1069,1164,1257,1353,1447,1543,1638,1730,1822,1910,2016,2123,2221,2330,2437,2551,2717,2817,2898" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-si.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-si.json deleted file mode 100644 index f3ae4cd..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-si.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-si/values-si.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-si/values-si.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,221,328,435,518,623,739,829,916,1007,1099,1193,1287,1388,1481,1576,1670,1761,1852,1935,2044,2148,2246,2356,2456,2563,2722,2821", - "endColumns": "115,106,106,82,104,115,89,86,90,91,93,93,100,92,94,93,90,90,82,108,103,97,109,99,106,158,98,80", - "endOffsets": "216,323,430,513,618,734,824,911,1002,1094,1188,1282,1383,1476,1571,1665,1756,1847,1930,2039,2143,2241,2351,2451,2558,2717,2816,2897" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-si/values-si.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2902", - "endColumns": "100", - "endOffsets": "2998" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sk.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sk.json deleted file mode 100644 index 337e279..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sk.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-sk/values-sk.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-sk/values-sk.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2899", - "endColumns": "100", - "endOffsets": "2995" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-sk/values-sk.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,313,424,510,618,736,815,893,984,1076,1174,1268,1369,1462,1557,1655,1746,1837,1920,2025,2133,2232,2338,2450,2553,2719,2817", - "endColumns": "106,100,110,85,107,117,78,77,90,91,97,93,100,92,94,97,90,90,82,104,107,98,105,111,102,165,97,81", - "endOffsets": "207,308,419,505,613,731,810,888,979,1071,1169,1263,1364,1457,1552,1650,1741,1832,1915,2020,2128,2227,2333,2445,2548,2714,2812,2894" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sl.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sl.json deleted file mode 100644 index 4baf253..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sl.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-sl/values-sl.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-sl/values-sl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2934", - "endColumns": "100", - "endOffsets": "3030" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-sl/values-sl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,217,319,427,514,617,736,817,896,988,1081,1176,1270,1366,1460,1556,1656,1748,1840,1923,2031,2139,2239,2352,2460,2568,2751,2851", - "endColumns": "111,101,107,86,102,118,80,78,91,92,94,93,95,93,95,99,91,91,82,107,107,99,112,107,107,182,99,82", - "endOffsets": "212,314,422,509,612,731,812,891,983,1076,1171,1265,1361,1455,1551,1651,1743,1835,1918,2026,2134,2234,2347,2455,2563,2746,2846,2929" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sq.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sq.json deleted file mode 100644 index b9b8c92..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sq.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-sq/values-sq.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-sq/values-sq.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,319,431,517,623,746,828,907,998,1090,1185,1279,1381,1474,1569,1666,1757,1850,1930,2036,2140,2238,2344,2448,2550,2704,2801", - "endColumns": "113,99,111,85,105,122,81,78,90,91,94,93,101,92,94,96,90,92,79,105,103,97,105,103,101,153,96,80", - "endOffsets": "214,314,426,512,618,741,823,902,993,1085,1180,1274,1376,1469,1564,1661,1752,1845,1925,2031,2135,2233,2339,2443,2545,2699,2796,2877" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-sq/values-sq.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2882", - "endColumns": "100", - "endOffsets": "2978" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sr.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sr.json deleted file mode 100644 index 8c4cecd..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sr.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-sr/values-sr.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-sr/values-sr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2919", - "endColumns": "100", - "endOffsets": "3015" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-sr/values-sr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,313,419,505,609,731,815,897,988,1080,1175,1269,1370,1463,1558,1663,1754,1845,1930,2035,2141,2244,2350,2459,2566,2736,2833", - "endColumns": "106,100,105,85,103,121,83,81,90,91,94,93,100,92,94,104,90,90,84,104,105,102,105,108,106,169,96,85", - "endOffsets": "207,308,414,500,604,726,810,892,983,1075,1170,1264,1365,1458,1553,1658,1749,1840,1925,2030,2136,2239,2345,2454,2561,2731,2828,2914" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sv.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sv.json deleted file mode 100644 index 8988afe..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sv.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-sv/values-sv.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-sv/values-sv.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2857", - "endColumns": "100", - "endOffsets": "2953" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-sv/values-sv.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,311,422,506,608,721,798,874,967,1061,1156,1250,1353,1448,1545,1643,1739,1832,1911,2017,2116,2212,2317,2420,2522,2676,2778", - "endColumns": "102,102,110,83,101,112,76,75,92,93,94,93,102,94,96,97,95,92,78,105,98,95,104,102,101,153,101,78", - "endOffsets": "203,306,417,501,603,716,793,869,962,1056,1151,1245,1348,1443,1540,1638,1734,1827,1906,2012,2111,2207,2312,2415,2517,2671,2773,2852" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sw.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sw.json deleted file mode 100644 index 462cacf..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sw.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-sw/values-sw.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-sw/values-sw.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,208,307,415,505,610,727,810,893,984,1076,1171,1265,1366,1459,1554,1648,1739,1830,1911,2012,2120,2219,2326,2438,2542,2704,2801", - "endColumns": "102,98,107,89,104,116,82,82,90,91,94,93,100,92,94,93,90,90,80,100,107,98,106,111,103,161,96,81", - "endOffsets": "203,302,410,500,605,722,805,888,979,1071,1166,1260,1361,1454,1549,1643,1734,1825,1906,2007,2115,2214,2321,2433,2537,2699,2796,2878" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-sw/values-sw.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2883", - "endColumns": "100", - "endOffsets": "2979" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sw600dp-v13.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sw600dp-v13.json deleted file mode 100644 index f5cab41..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-sw600dp-v13.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-sw600dp-v13/values-sw600dp-v13.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-sw600dp-v13/values-sw600dp-v13.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9", - "startColumns": "4,4,4,4,4,4,4,4", - "startOffsets": "55,124,193,263,337,413,472,543", - "endColumns": "68,68,69,73,75,58,70,67", - "endOffsets": "119,188,258,332,408,467,538,606" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ta.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ta.json deleted file mode 100644 index 7e5cce5..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ta.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ta/values-ta.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ta/values-ta.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2952", - "endColumns": "100", - "endOffsets": "3048" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ta/values-ta.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,218,320,435,524,635,756,835,912,1010,1109,1204,1298,1406,1506,1608,1702,1800,1898,1978,2086,2189,2288,2404,2507,2612,2769,2871", - "endColumns": "112,101,114,88,110,120,78,76,97,98,94,93,107,99,101,93,97,97,79,107,102,98,115,102,104,156,101,80", - "endOffsets": "213,315,430,519,630,751,830,907,1005,1104,1199,1293,1401,1501,1603,1697,1795,1893,1973,2081,2184,2283,2399,2502,2607,2764,2866,2947" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-te.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-te.json deleted file mode 100644 index 6ea28d6..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-te.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-te/values-te.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-te/values-te.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2925", - "endColumns": "100", - "endOffsets": "3021" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-te/values-te.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,222,334,445,535,640,759,837,914,1005,1097,1192,1286,1387,1480,1575,1670,1761,1852,1934,2048,2150,2247,2362,2465,2580,2742,2845", - "endColumns": "116,111,110,89,104,118,77,76,90,91,94,93,100,92,94,94,90,90,81,113,101,96,114,102,114,161,102,79", - "endOffsets": "217,329,440,530,635,754,832,909,1000,1092,1187,1281,1382,1475,1570,1665,1756,1847,1929,2043,2145,2242,2357,2460,2575,2737,2840,2920" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-th.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-th.json deleted file mode 100644 index c402a18..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-th.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-th/values-th.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-th/values-th.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,303,411,496,598,708,786,864,955,1047,1138,1232,1333,1426,1521,1615,1706,1797,1877,1980,2078,2176,2279,2385,2486,2639,2734", - "endColumns": "104,92,107,84,101,109,77,77,90,91,90,93,100,92,94,93,90,90,79,102,97,97,102,105,100,152,94,80", - "endOffsets": "205,298,406,491,593,703,781,859,950,1042,1133,1227,1328,1421,1516,1610,1701,1792,1872,1975,2073,2171,2274,2380,2481,2634,2729,2810" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-th/values-th.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2815", - "endColumns": "100", - "endOffsets": "2911" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-tl.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-tl.json deleted file mode 100644 index 162788c..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-tl.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-tl/values-tl.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-tl/values-tl.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,216,324,437,525,631,746,826,904,995,1087,1182,1276,1377,1470,1565,1659,1750,1841,1924,2033,2143,2244,2354,2472,2580,2743,2845", - "endColumns": "110,107,112,87,105,114,79,77,90,91,94,93,100,92,94,93,90,90,82,108,109,100,109,117,107,162,101,83", - "endOffsets": "211,319,432,520,626,741,821,899,990,1082,1177,1271,1372,1465,1560,1654,1745,1836,1919,2028,2138,2239,2349,2467,2575,2738,2840,2924" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-tl/values-tl.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2929", - "endColumns": "100", - "endOffsets": "3025" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-tr.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-tr.json deleted file mode 100644 index 6a00d1e..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-tr.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-tr/values-tr.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-tr/values-tr.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2876", - "endColumns": "100", - "endOffsets": "2972" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-tr/values-tr.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,318,430,515,621,741,821,897,988,1080,1172,1266,1367,1460,1562,1657,1748,1839,1917,2024,2128,2224,2331,2434,2543,2699,2797", - "endColumns": "113,98,111,84,105,119,79,75,90,91,91,93,100,92,101,94,90,90,77,106,103,95,106,102,108,155,97,78", - "endOffsets": "214,313,425,510,616,736,816,892,983,1075,1167,1261,1362,1455,1557,1652,1743,1834,1912,2019,2123,2219,2326,2429,2538,2694,2792,2871" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-uk.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-uk.json deleted file mode 100644 index f2cb776..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-uk.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-uk/values-uk.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-uk/values-uk.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,214,316,424,510,615,733,814,894,985,1077,1172,1266,1367,1460,1555,1650,1741,1832,1930,2036,2142,2240,2347,2454,2559,2729,2829", - "endColumns": "108,101,107,85,104,117,80,79,90,91,94,93,100,92,94,94,90,90,97,105,105,97,106,106,104,169,99,80", - "endOffsets": "209,311,419,505,610,728,809,889,980,1072,1167,1261,1362,1455,1550,1645,1736,1827,1925,2031,2137,2235,2342,2449,2554,2724,2824,2905" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-uk/values-uk.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2910", - "endColumns": "100", - "endOffsets": "3006" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ur.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ur.json deleted file mode 100644 index b82fc48..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-ur.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-ur/values-ur.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-ur/values-ur.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2917", - "endColumns": "100", - "endOffsets": "3013" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-ur/values-ur.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,219,325,434,520,624,744,821,897,989,1082,1177,1271,1373,1467,1563,1657,1749,1841,1925,2033,2139,2241,2352,2453,2569,2734,2832", - "endColumns": "113,105,108,85,103,119,76,75,91,92,94,93,101,93,95,93,91,91,83,107,105,101,110,100,115,164,97,84", - "endOffsets": "214,320,429,515,619,739,816,892,984,1077,1172,1266,1368,1462,1558,1652,1744,1836,1920,2028,2134,2236,2347,2448,2564,2729,2827,2912" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-uz.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-uz.json deleted file mode 100644 index 4be9060..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-uz.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-uz/values-uz.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-uz/values-uz.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,210,305,405,487,587,704,789,868,959,1051,1146,1240,1335,1428,1523,1618,1709,1801,1884,1994,2100,2200,2308,2414,2516,2677,2776", - "endColumns": "104,94,99,81,99,116,84,78,90,91,94,93,94,92,94,94,90,91,82,109,105,99,107,105,101,160,98,82", - "endOffsets": "205,300,400,482,582,699,784,863,954,1046,1141,1235,1330,1423,1518,1613,1704,1796,1879,1989,2095,2195,2303,2409,2511,2672,2771,2854" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-uz/values-uz.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2859", - "endColumns": "100", - "endOffsets": "2955" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v16.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v16.json deleted file mode 100644 index 72b9c70..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v16.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v16/values-v16.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v16/values-v16.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endLines": "5", - "endColumns": "12", - "endOffsets": "223" - }, - "to": { - "startLines": "3", - "startColumns": "4", - "startOffsets": "121", - "endLines": "6", - "endColumns": "12", - "endOffsets": "289" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-v16/values-v16.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "65", - "endOffsets": "116" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v17.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v17.json deleted file mode 100644 index 27f76b5..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v17.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v17/values-v17.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v17/values-v17.xml", - "from": { - "startLines": "2,5,9,12,15,18,22,25,29,33,37,40,43,46,50,53,57", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,228,456,614,764,936,1161,1331,1559,1783,2025,2196,2370,2539,2812,3012,3216", - "endLines": "4,8,11,14,17,21,24,28,32,36,39,42,45,49,52,56,60", - "endColumns": "12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12", - "endOffsets": "223,451,609,759,931,1156,1326,1554,1778,2020,2191,2365,2534,2807,3007,3211,3540" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v18.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v18.json deleted file mode 100644 index e5e4233..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v18.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v18/values-v18.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v18/values-v18.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "48", - "endOffsets": "99" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v21.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v21.json deleted file mode 100644 index 052c269..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v21.json +++ /dev/null @@ -1,47 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v21/values-v21.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v21/values-v21.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,17,19,20,21,22,24,26,27,28,29,30,32,34,36,38,40,42,43,48,50,52,53,54,56,58,59,60,61,62,63,106,109,152,155,158,160,162,164,167,171,174,175,176,179,180,181,182,183,184,187,188,190,192,194,196,200,202,203,204,205,207,211,213,215,216,217,218,219,220,222,223,224,234,235,236,248", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,146,249,352,457,564,673,782,891,1000,1109,1216,1319,1438,1593,1748,1853,1974,2075,2222,2363,2466,2585,2692,2795,2950,3121,3270,3435,3592,3743,3862,4213,4362,4511,4623,4770,4923,5070,5145,5234,5321,5422,5525,8499,8684,11670,11867,12066,12189,12312,12425,12608,12863,13064,13153,13264,13497,13598,13693,13816,13945,14062,14239,14338,14473,14616,14751,14870,15071,15190,15283,15394,15450,15557,15752,15863,15996,16091,16182,16273,16366,16483,16622,16693,16776,17456,17513,17571,18265", - "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,16,18,19,20,21,23,25,26,27,28,29,31,33,35,37,39,41,42,47,49,51,52,53,55,57,58,59,60,61,62,105,108,151,154,157,159,161,163,166,170,173,174,175,178,179,180,181,182,183,186,187,189,191,193,195,199,201,202,203,204,206,210,212,214,215,216,217,218,219,221,222,223,233,234,235,247,259", - "endColumns": "90,102,102,104,106,108,108,108,108,108,106,102,118,12,12,104,120,100,12,12,102,118,106,102,12,12,12,12,12,12,118,12,12,12,111,146,12,12,74,88,86,100,102,12,12,12,12,12,12,12,12,12,12,12,88,110,12,100,94,122,128,116,12,98,12,12,12,12,12,12,92,110,55,12,12,12,12,94,90,90,92,116,12,70,82,12,56,57,12,12", - "endOffsets": "141,244,347,452,559,668,777,886,995,1104,1211,1314,1433,1588,1743,1848,1969,2070,2217,2358,2461,2580,2687,2790,2945,3116,3265,3430,3587,3738,3857,4208,4357,4506,4618,4765,4918,5065,5140,5229,5316,5417,5520,8494,8679,11665,11862,12061,12184,12307,12420,12603,12858,13059,13148,13259,13492,13593,13688,13811,13940,14057,14234,14333,14468,14611,14746,14865,15066,15185,15278,15389,15445,15552,15747,15858,15991,16086,16177,16268,16361,16478,16617,16688,16771,17451,17508,17566,18260,18966" - }, - "to": { - "startLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,19,21,23,24,25,26,28,30,31,32,33,34,36,38,40,42,44,46,47,52,54,56,57,58,60,62,63,64,65,66,67,110,113,156,159,162,164,166,168,171,175,178,179,180,183,184,185,186,187,188,191,192,194,196,198,200,204,206,207,208,209,211,215,217,219,220,221,222,223,224,226,227,228,238,239,240,252", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "354,445,548,651,756,863,972,1081,1190,1299,1408,1515,1618,1737,1892,2047,2152,2273,2374,2521,2662,2765,2884,2991,3094,3249,3420,3569,3734,3891,4042,4161,4512,4661,4810,4922,5069,5222,5369,5444,5533,5620,5721,5824,8798,8983,11969,12166,12365,12488,12611,12724,12907,13162,13363,13452,13563,13796,13897,13992,14115,14244,14361,14538,14637,14772,14915,15050,15169,15370,15489,15582,15693,15749,15856,16051,16162,16295,16390,16481,16572,16665,16782,16921,16992,17075,17755,17812,17870,18564", - "endLines": "6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,23,24,25,27,29,30,31,32,33,35,37,39,41,43,45,46,51,53,55,56,57,59,61,62,63,64,65,66,109,112,155,158,161,163,165,167,170,174,177,178,179,182,183,184,185,186,187,190,191,193,195,197,199,203,205,206,207,208,210,214,216,218,219,220,221,222,223,225,226,227,237,238,239,251,263", - "endColumns": "90,102,102,104,106,108,108,108,108,108,106,102,118,12,12,104,120,100,12,12,102,118,106,102,12,12,12,12,12,12,118,12,12,12,111,146,12,12,74,88,86,100,102,12,12,12,12,12,12,12,12,12,12,12,88,110,12,100,94,122,128,116,12,98,12,12,12,12,12,12,92,110,55,12,12,12,12,94,90,90,92,116,12,70,82,12,56,57,12,12", - "endOffsets": "440,543,646,751,858,967,1076,1185,1294,1403,1510,1613,1732,1887,2042,2147,2268,2369,2516,2657,2760,2879,2986,3089,3244,3415,3564,3729,3886,4037,4156,4507,4656,4805,4917,5064,5217,5364,5439,5528,5615,5716,5819,8793,8978,11964,12161,12360,12483,12606,12719,12902,13157,13358,13447,13558,13791,13892,13987,14110,14239,14356,14533,14632,14767,14910,15045,15164,15365,15484,15577,15688,15744,15851,16046,16157,16290,16385,16476,16567,16660,16777,16916,16987,17070,17750,17807,17865,18559,19265" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-v21/values-v21.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,13", - "startColumns": "4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,159,223,290,354,470,596,722,850,1022", - "endLines": "2,3,4,5,6,7,8,9,12,17", - "endColumns": "103,63,66,63,115,125,125,127,12,12", - "endOffsets": "154,218,285,349,465,591,717,845,1017,1355" - }, - "to": { - "startLines": "2,3,4,5,264,265,266,267,268,271", - "startColumns": "4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,159,223,290,19270,19386,19512,19638,19766,19938", - "endLines": "2,3,4,5,264,265,266,267,270,275", - "endColumns": "103,63,66,63,115,125,125,127,12,12", - "endOffsets": "154,218,285,349,19381,19507,19633,19761,19933,20271" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v22.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v22.json deleted file mode 100644 index 8d1b76d..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v22.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v22/values-v22.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v22/values-v22.xml", - "from": { - "startLines": "2,3,4,9", - "startColumns": "4,4,4,4", - "startOffsets": "55,130,217,553", - "endLines": "2,3,8,13", - "endColumns": "74,86,12,12", - "endOffsets": "125,212,548,896" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v23.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v23.json deleted file mode 100644 index 81cef2a..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v23.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v23/values-v23.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v23/values-v23.xml", - "from": { - "startLines": "2,3,4,5,6,20,34,35,36,37,41,42,43,44", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "55,190,325,400,487,1371,2267,2386,2513,2618,2842,2957,3064,3177", - "endLines": "2,3,4,5,19,33,34,35,36,40,41,42,43,47", - "endColumns": "134,134,74,86,12,12,118,126,104,12,114,106,112,12", - "endOffsets": "185,320,395,482,1366,2262,2381,2508,2613,2837,2952,3059,3172,3402" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v24.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v24.json deleted file mode 100644 index 592acf1..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v24.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v24/values-v24.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v24/values-v24.xml", - "from": { - "startLines": "2,3", - "startColumns": "4,4", - "startOffsets": "55,212", - "endColumns": "156,134", - "endOffsets": "207,342" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v25.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v25.json deleted file mode 100644 index 8ee7494..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v25.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v25/values-v25.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v25/values-v25.xml", - "from": { - "startLines": "2,3,4,6", - "startColumns": "4,4,4,4", - "startOffsets": "55,126,209,308", - "endLines": "2,3,5,7", - "endColumns": "70,82,12,12", - "endOffsets": "121,204,303,414" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v26.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v26.json deleted file mode 100644 index 715082b..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v26.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v26/values-v26.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v26/values-v26.xml", - "from": { - "startLines": "2,3,4,8,12,16", - "startColumns": "4,4,4,4,4,4", - "startOffsets": "55,130,217,431,657,896", - "endLines": "2,3,7,11,15,16", - "endColumns": "74,86,12,12,12,92", - "endOffsets": "125,212,426,652,891,984" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v28.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v28.json deleted file mode 100644 index bdcacba..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-v28.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v28/values-v28.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-v28/values-v28.xml", - "from": { - "startLines": "2,3,4,8", - "startColumns": "4,4,4,4", - "startOffsets": "55,130,217,447", - "endLines": "2,3,7,11", - "endColumns": "74,86,12,12", - "endOffsets": "125,212,442,684" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-vi.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-vi.json deleted file mode 100644 index 95a1c0e..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-vi.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-vi/values-vi.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-vi/values-vi.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2882", - "endColumns": "100", - "endOffsets": "2978" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-vi/values-vi.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,212,314,423,507,610,729,807,884,975,1067,1162,1256,1357,1450,1545,1639,1730,1821,1904,2008,2116,2217,2322,2437,2542,2699,2798", - "endColumns": "106,101,108,83,102,118,77,76,90,91,94,93,100,92,94,93,90,90,82,103,107,100,104,114,104,156,98,83", - "endOffsets": "207,309,418,502,605,724,802,879,970,1062,1157,1251,1352,1445,1540,1634,1725,1816,1899,2003,2111,2212,2317,2432,2537,2694,2793,2877" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-watch-v20.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-watch-v20.json deleted file mode 100644 index bef193d..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-watch-v20.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-watch-v20/values-watch-v20.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-watch-v20/values-watch-v20.xml", - "from": { - "startLines": "2,5,8", - "startColumns": "4,4,4", - "startOffsets": "55,214,385", - "endLines": "4,7,10", - "endColumns": "12,12,12", - "endOffsets": "209,380,553" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-watch-v21.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-watch-v21.json deleted file mode 100644 index 3c8ad1d..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-watch-v21.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-watch-v21/values-watch-v21.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-watch-v21/values-watch-v21.xml", - "from": { - "startLines": "2,6,10", - "startColumns": "4,4,4", - "startOffsets": "55,271,499", - "endLines": "5,9,13", - "endColumns": "12,12,12", - "endOffsets": "266,494,724" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-xlarge-v4.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-xlarge-v4.json deleted file mode 100644 index 5352372..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-xlarge-v4.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-xlarge-v4/values-xlarge-v4.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-xlarge-v4/values-xlarge-v4.xml", - "from": { - "startLines": "2,3,4,5,6,7", - "startColumns": "4,4,4,4,4,4", - "startOffsets": "55,126,197,267,337,405", - "endColumns": "70,70,69,69,67,67", - "endOffsets": "121,192,262,332,400,468" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zh-rCN.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zh-rCN.json deleted file mode 100644 index ef80e17..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zh-rCN.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-zh-rCN/values-zh-rCN.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-zh-rCN/values-zh-rCN.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,200,295,395,477,574,680,757,833,924,1016,1113,1209,1304,1397,1492,1584,1675,1766,1843,1939,2034,2129,2226,2322,2420,2568,2662", - "endColumns": "94,94,99,81,96,105,76,75,90,91,96,95,94,92,94,91,90,90,76,95,94,94,96,95,97,147,93,77", - "endOffsets": "195,290,390,472,569,675,752,828,919,1011,1108,1204,1299,1392,1487,1579,1670,1761,1838,1934,2029,2124,2221,2317,2415,2563,2657,2735" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-zh-rCN/values-zh-rCN.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2740", - "endColumns": "100", - "endOffsets": "2836" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zh-rHK.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zh-rHK.json deleted file mode 100644 index 5bee899..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zh-rHK.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-zh-rHK/values-zh-rHK.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-zh-rHK/values-zh-rHK.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,200,293,393,475,572,680,757,833,925,1018,1109,1205,1301,1395,1491,1583,1675,1767,1844,1940,2035,2130,2227,2323,2421,2572,2666", - "endColumns": "94,92,99,81,96,107,76,75,91,92,90,95,95,93,95,91,91,91,76,95,94,94,96,95,97,150,93,77", - "endOffsets": "195,288,388,470,567,675,752,828,920,1013,1104,1200,1296,1390,1486,1578,1670,1762,1839,1935,2030,2125,2222,2318,2416,2567,2661,2739" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-zh-rHK/values-zh-rHK.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2744", - "endColumns": "100", - "endOffsets": "2840" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zh-rTW.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zh-rTW.json deleted file mode 100644 index 38d4413..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zh-rTW.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-zh-rTW/values-zh-rTW.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-zh-rTW/values-zh-rTW.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2749", - "endColumns": "100", - "endOffsets": "2845" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-zh-rTW/values-zh-rTW.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,200,293,393,475,572,680,757,833,925,1018,1115,1211,1307,1401,1497,1589,1681,1773,1850,1946,2041,2136,2233,2329,2427,2577,2671", - "endColumns": "94,92,99,81,96,107,76,75,91,92,96,95,95,93,95,91,91,91,76,95,94,94,96,95,97,149,93,77", - "endOffsets": "195,288,388,470,567,675,752,828,920,1013,1110,1206,1302,1396,1492,1584,1676,1768,1845,1941,2036,2131,2228,2324,2422,2572,2666,2744" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zu.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zu.json deleted file mode 100644 index b0c3225..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values-zu.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-zu/values-zu.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values-zu/values-zu.xml", - "from": { - "startLines": "2", - "startColumns": "4", - "startOffsets": "55", - "endColumns": "100", - "endOffsets": "151" - }, - "to": { - "startLines": "30", - "startColumns": "4", - "startOffsets": "2872", - "endColumns": "100", - "endOffsets": "2968" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values-zu/values-zu.xml", - "from": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "105,213,320,432,520,623,738,817,895,986,1078,1173,1267,1368,1461,1556,1650,1741,1834,1914,2018,2121,2219,2326,2433,2538,2695,2791", - "endColumns": "107,106,111,87,102,114,78,77,90,91,94,93,100,92,94,93,90,92,79,103,102,97,106,106,104,156,95,80", - "endOffsets": "208,315,427,515,618,733,812,890,981,1073,1168,1262,1363,1456,1551,1645,1736,1829,1909,2013,2116,2214,2321,2428,2533,2690,2786,2867" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values.json deleted file mode 100644 index 101475a..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/multi-v2/values.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "logs": [ - { - "outputFile": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values/values.xml", - "map": [ - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/res/values/values.xml", - "from": { - "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", - "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", - "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" - }, - "to": { - "startLines": "51,52,151,152,153,154,155,156,157,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,190,191,192,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,238,239,244,245,246,247,248,249,250,251,252,253,254,264,345,1725,1726,1730,1731,1735,1918,1919", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "3403,3472,10253,10323,10391,10463,10533,10594,10668,11525,11586,11647,11709,11773,11835,11896,11964,12064,12124,12190,12263,12332,12389,12441,12956,13028,13104,13220,13279,13338,13398,13458,13518,13578,13638,13698,13758,13818,13878,13938,13997,14057,14117,14177,14237,14297,14357,14417,14477,14537,14597,14656,14716,14776,14835,14894,14953,15012,15071,15738,15773,15993,16048,16111,16166,16224,16281,16331,16392,16449,16483,16518,17063,24214,115506,115623,115824,115934,116135,129806,129878", - "endLines": "51,52,151,152,153,154,155,156,157,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,190,191,192,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,238,239,244,245,246,247,248,249,250,251,252,253,254,264,345,1725,1729,1730,1734,1735,1918,1919", - "endColumns": "68,62,69,67,71,69,60,73,72,60,60,61,63,61,60,67,99,59,65,72,68,56,51,61,71,75,64,58,58,59,59,59,59,59,59,59,59,59,59,58,59,59,59,59,59,59,59,59,59,59,58,59,59,58,58,58,58,58,58,34,34,54,62,54,57,56,49,60,56,33,34,34,69,70,116,12,109,12,128,71,66", - "endOffsets": "3467,3530,10318,10386,10458,10528,10589,10663,10736,11581,11642,11704,11768,11830,11891,11959,12059,12119,12185,12258,12327,12384,12436,12498,13023,13099,13164,13274,13333,13393,13453,13513,13573,13633,13693,13753,13813,13873,13933,13992,14052,14112,14172,14232,14292,14352,14412,14472,14532,14592,14651,14711,14771,14830,14889,14948,15007,15066,15125,15768,15803,16043,16106,16161,16219,16276,16326,16387,16444,16478,16513,16548,17128,24280,115618,115819,115929,116130,116259,129873,129940" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a56511b037fb04f244c71df782e66ef7/jetified-react-native-0.64.0/res/values/values.xml", - "from": { - "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", - "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", - "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" - }, - "to": { - "startLines": "27,28,193,226,227,228,229,230,242,256,257,292,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,340,341,342,343,344,346,347,348,349,355,359,1434,1437,1440,1444,1663,1666,1742,1772,1773,1782,1789,1796,1799,1802,1805,1920", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "1924,1987,13169,15130,15178,15227,15275,15324,15904,16585,16639,18999,19124,19199,19322,19418,19507,19615,19732,19852,19972,20074,20177,20288,20395,20498,20609,20778,20946,21063,21167,21280,21436,21544,21657,21748,21859,22028,22126,22253,22378,22473,22580,22660,22736,22809,22896,22967,23038,23116,23196,23282,23366,23438,23520,23654,23738,23815,23902,23987,24066,24141,24285,24362,24440,24513,25033,25281,93395,93598,93789,93991,109402,109603,116692,118874,118909,119447,119865,120243,120420,120599,120782,129945", - "endLines": "27,28,193,226,227,228,229,230,242,256,257,292,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,340,341,342,343,344,346,347,348,349,358,362,1436,1439,1443,1447,1665,1668,1742,1772,1781,1788,1795,1798,1801,1804,1810,1929", - "endColumns": "62,62,50,47,48,47,48,48,42,53,47,72,74,122,95,88,107,116,119,119,101,102,110,106,102,110,168,167,116,103,112,155,107,112,90,110,168,97,126,124,94,106,79,75,72,86,70,70,77,79,85,83,71,81,80,83,76,86,84,78,74,72,76,77,72,77,10,10,12,12,10,10,12,12,25,34,10,10,10,10,10,12,12,10", - "endOffsets": "1982,2045,13215,15173,15222,15270,15319,15368,15942,16634,16682,19067,19194,19317,19413,19502,19610,19727,19847,19967,20069,20172,20283,20390,20493,20604,20773,20941,21058,21162,21275,21431,21539,21652,21743,21854,22023,22121,22248,22373,22468,22575,22655,22731,22804,22891,22962,23033,23111,23191,23277,23361,23433,23515,23596,23733,23810,23897,23982,24061,24136,24209,24357,24435,24508,24586,25276,25524,93593,93784,93986,94192,109598,109787,116713,118904,119442,119860,120238,120415,120594,120777,121142,130381" - } - }, - { - "source": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/generated/res/resValues/debug/values/gradleResValues.xml", - "from": { - "startLines": "-1,-1", - "startColumns": "-1,-1", - "startOffsets": "-1,-1" - }, - "to": { - "startLines": "262,263", - "startColumns": "4,4", - "startOffsets": "16930,16994", - "endColumns": "63,68", - "endOffsets": "16989,17058" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a8f6015f96666ab8d93bfe5b64998bc8/jetified-flipper-0.75.1/res/values/values.xml", - "from": { - "startLines": "-1,-1", - "startColumns": "-1,-1", - "startOffsets": "-1,-1" - }, - "to": { - "startLines": "235,236", - "startColumns": "4,4", - "startOffsets": "15578,15647", - "endColumns": "68,56", - "endOffsets": "15642,15699" - } - }, - { - "source": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/res/values/styles.xml", - "from": { - "startLines": "-1", - "startColumns": "-1", - "startOffsets": "-1" - }, - "to": { - "startLines": "363", - "startColumns": "4", - "startOffsets": "25529", - "endLines": "366", - "endColumns": "12", - "endOffsets": "25674" - } - }, - { - "source": "/Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/res/values/values.xml", - "from": { - "startLines": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", - "startColumns": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1", - "startOffsets": "-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1" - }, - "to": { - "startLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,158,159,160,161,162,163,164,165,166,182,183,184,185,186,187,188,189,231,232,233,234,237,240,241,243,255,258,259,260,261,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,337,350,351,352,353,354,367,375,376,380,384,388,393,399,406,410,414,419,423,427,431,435,439,443,449,453,459,463,469,473,478,482,485,489,495,499,505,509,515,518,522,526,530,534,538,539,540,541,544,547,550,553,557,558,559,560,561,564,566,568,570,575,576,580,586,590,591,593,604,605,609,615,619,620,621,625,652,656,657,661,689,859,885,1056,1082,1113,1121,1127,1141,1163,1168,1173,1183,1192,1201,1205,1212,1220,1227,1228,1237,1240,1243,1247,1251,1255,1258,1259,1264,1269,1279,1284,1291,1297,1298,1301,1305,1310,1312,1314,1317,1320,1322,1326,1329,1336,1339,1342,1346,1348,1352,1354,1356,1358,1362,1370,1378,1390,1396,1405,1408,1419,1422,1423,1428,1429,1448,1517,1587,1588,1598,1607,1608,1610,1614,1617,1620,1623,1626,1629,1632,1635,1639,1642,1645,1648,1652,1655,1659,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1691,1693,1694,1695,1696,1697,1698,1699,1700,1702,1703,1705,1706,1708,1710,1711,1713,1714,1715,1716,1717,1718,1720,1721,1722,1723,1724,1736,1738,1740,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1755,1757,1758,1759,1760,1761,1762,1764,1768,1811,1812,1813,1814,1815,1816,1820,1821,1822,1823,1825,1827,1829,1831,1833,1834,1835,1836,1838,1840,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1853,1856,1857,1858,1859,1861,1863,1864,1866,1867,1869,1871,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1886,1887,1888,1889,1891,1892,1893,1894,1895,1897,1899,1901,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917", - "startColumns": "4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4", - "startOffsets": "150,205,250,299,340,395,454,516,597,658,733,809,886,964,1049,1131,1207,1283,1360,1438,1544,1650,1729,1809,1866,2050,2124,2199,2264,2330,2390,2451,2523,2596,2663,2731,2790,2849,2908,2967,3026,3080,3134,3187,3241,3295,3349,3535,3609,3688,3761,3835,3906,3978,4050,4123,4180,4238,4311,4385,4459,4534,4606,4679,4749,4820,4880,4941,5010,5079,5149,5223,5299,5363,5440,5516,5593,5658,5727,5804,5879,5948,6016,6093,6159,6220,6317,6382,6451,6550,6621,6680,6738,6795,6854,6918,6989,7061,7133,7205,7277,7344,7412,7480,7539,7602,7666,7756,7847,7907,7973,8040,8106,8176,8240,8293,8360,8421,8488,8601,8659,8722,8787,8852,8927,9000,9072,9121,9182,9243,9304,9366,9430,9494,9558,9623,9686,9746,9807,9873,9932,9992,10054,10125,10185,10741,10827,10914,11004,11091,11179,11261,11344,11434,12503,12555,12613,12658,12724,12788,12845,12902,15373,15430,15478,15527,15704,15808,15855,15947,16553,16687,16751,16813,16873,17133,17207,17277,17355,17409,17479,17564,17612,17658,17719,17782,17848,17912,17983,18046,18111,18175,18236,18297,18349,18422,18496,18565,18640,18714,18788,18929,23601,24591,24669,24759,24847,24943,25679,26261,26350,26597,26878,27130,27415,27808,28285,28507,28729,29005,29232,29462,29692,29922,30152,30379,30798,31024,31449,31679,32107,32326,32609,32817,32948,33175,33601,33826,34253,34474,34899,35019,35295,35596,35920,36211,36525,36662,36793,36898,37140,37307,37511,37719,37990,38102,38214,38319,38436,38650,38796,38936,39022,39370,39458,39704,40122,40371,40453,40551,41143,41243,41495,41919,42174,42268,42357,42594,44618,44860,44962,45215,47371,57903,59419,70050,71578,73335,73961,74381,75442,76707,76963,77199,77746,78240,78845,79043,79623,80187,80562,80680,81218,81375,81571,81844,82100,82270,82411,82475,82840,83207,83883,84147,84485,84838,84932,85118,85424,85686,85811,85938,86177,86388,86507,86700,86877,87332,87513,87635,87894,88007,88194,88296,88403,88532,88807,89315,89811,90688,90982,91552,91701,92433,92605,92689,93025,93117,94197,99443,104832,104894,105472,106056,106147,106260,106489,106649,106801,106972,107138,107307,107474,107637,107880,108050,108223,108394,108668,108867,109072,109792,109876,109972,110068,110166,110266,110368,110470,110572,110674,110776,110876,110972,111084,111213,111336,111467,111598,111696,111810,111904,112044,112178,112274,112386,112486,112602,112698,112810,112910,113050,113186,113350,113480,113638,113788,113929,114073,114208,114320,114470,114598,114726,114862,114994,115124,115254,115366,116264,116410,116554,116718,116784,116874,116950,117054,117144,117246,117354,117462,117562,117642,117734,117832,117942,118020,118126,118218,118322,118432,118554,118717,121147,121227,121327,121417,121527,121617,121858,121952,122058,122150,122250,122362,122476,122592,122708,122802,122916,123028,123130,123250,123372,123454,123558,123678,123804,123902,123996,124084,124196,124312,124434,124546,124721,124837,124923,125015,125127,125251,125318,125444,125512,125640,125784,125912,125981,126076,126191,126304,126403,126512,126623,126734,126835,126940,127040,127170,127261,127384,127478,127590,127676,127780,127876,127964,128082,128186,128290,128416,128504,128612,128712,128802,128912,128996,129098,129182,129236,129300,129406,129492,129602,129686", - "endLines": "2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,158,159,160,161,162,163,164,165,166,182,183,184,185,186,187,188,189,231,232,233,234,237,240,241,243,255,258,259,260,261,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,337,350,351,352,353,354,374,375,379,383,387,392,398,405,409,413,418,422,426,430,434,438,442,448,452,458,462,468,472,477,481,484,488,494,498,504,508,514,517,521,525,529,533,537,538,539,540,543,546,549,552,556,557,558,559,560,563,565,567,569,574,575,579,585,589,590,592,603,604,608,614,618,619,620,624,651,655,656,660,688,858,884,1055,1081,1112,1120,1126,1140,1162,1167,1172,1182,1191,1200,1204,1211,1219,1226,1227,1236,1239,1242,1246,1250,1254,1257,1258,1263,1268,1278,1283,1290,1296,1297,1300,1304,1309,1311,1313,1316,1319,1321,1325,1328,1335,1338,1341,1345,1347,1351,1353,1355,1357,1361,1369,1377,1389,1395,1404,1407,1418,1421,1422,1427,1428,1433,1516,1586,1587,1597,1606,1607,1609,1613,1616,1619,1622,1625,1628,1631,1634,1638,1641,1644,1647,1651,1654,1658,1662,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1690,1692,1693,1694,1695,1696,1697,1698,1699,1701,1702,1704,1705,1707,1709,1710,1712,1713,1714,1715,1716,1717,1719,1720,1721,1722,1723,1724,1737,1739,1741,1743,1744,1745,1746,1747,1748,1749,1750,1751,1752,1753,1754,1756,1757,1758,1759,1760,1761,1763,1767,1771,1811,1812,1813,1814,1815,1819,1820,1821,1822,1824,1826,1828,1830,1832,1833,1834,1835,1837,1839,1841,1842,1843,1844,1845,1846,1847,1848,1849,1850,1851,1852,1855,1856,1857,1858,1860,1862,1863,1865,1866,1868,1870,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1885,1886,1887,1888,1890,1891,1892,1893,1894,1896,1898,1900,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917", - "endColumns": "54,44,48,40,54,58,61,80,60,74,75,76,77,84,81,75,75,76,77,105,105,78,79,56,57,73,74,64,65,59,60,71,72,66,67,58,58,58,58,58,53,53,52,53,53,53,53,73,78,72,73,70,71,71,72,56,57,72,73,73,74,71,72,69,70,59,60,68,68,69,73,75,63,76,75,76,64,68,76,74,68,67,76,65,60,96,64,68,98,70,58,57,56,58,63,70,71,71,71,71,66,67,67,58,62,63,89,90,59,65,66,65,69,63,52,66,60,66,112,57,62,64,64,74,72,71,48,60,60,60,61,63,63,63,64,62,59,60,65,58,59,61,70,59,67,85,86,89,86,87,81,82,89,90,51,57,44,65,63,56,56,53,56,47,48,50,33,46,48,45,31,63,61,59,56,73,69,77,53,69,84,47,45,60,62,65,63,70,62,64,63,60,60,51,72,73,68,74,73,73,140,69,52,77,89,87,95,89,12,88,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,136,130,104,12,12,12,12,12,111,111,104,116,12,12,12,12,12,87,12,12,12,81,12,12,99,12,12,12,93,88,12,12,12,101,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,117,12,12,12,12,12,12,12,63,12,12,12,12,12,12,93,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,12,91,12,12,12,61,12,12,90,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,83,95,95,97,99,101,101,101,101,101,99,95,111,128,122,130,130,97,113,93,12,12,95,111,99,115,95,111,99,12,135,12,129,12,12,140,12,134,111,149,127,127,12,131,129,129,111,139,12,12,12,65,89,75,103,89,101,107,107,99,79,91,97,12,77,105,91,103,109,12,12,12,79,99,89,109,89,12,93,105,91,12,12,12,12,12,93,113,111,12,12,12,81,103,119,125,97,93,87,111,115,121,111,12,115,85,91,12,12,66,12,67,12,12,12,68,94,114,112,98,108,110,110,100,104,99,12,90,122,93,12,85,103,95,87,12,12,12,12,87,107,99,89,109,83,101,83,53,63,105,85,109,83,119", - "endOffsets": "200,245,294,335,390,449,511,592,653,728,804,881,959,1044,1126,1202,1278,1355,1433,1539,1645,1724,1804,1861,1919,2119,2194,2259,2325,2385,2446,2518,2591,2658,2726,2785,2844,2903,2962,3021,3075,3129,3182,3236,3290,3344,3398,3604,3683,3756,3830,3901,3973,4045,4118,4175,4233,4306,4380,4454,4529,4601,4674,4744,4815,4875,4936,5005,5074,5144,5218,5294,5358,5435,5511,5588,5653,5722,5799,5874,5943,6011,6088,6154,6215,6312,6377,6446,6545,6616,6675,6733,6790,6849,6913,6984,7056,7128,7200,7272,7339,7407,7475,7534,7597,7661,7751,7842,7902,7968,8035,8101,8171,8235,8288,8355,8416,8483,8596,8654,8717,8782,8847,8922,8995,9067,9116,9177,9238,9299,9361,9425,9489,9553,9618,9681,9741,9802,9868,9927,9987,10049,10120,10180,10248,10822,10909,10999,11086,11174,11256,11339,11429,11520,12550,12608,12653,12719,12783,12840,12897,12951,15425,15473,15522,15573,15733,15850,15899,15988,16580,16746,16808,16868,16925,17202,17272,17350,17404,17474,17559,17607,17653,17714,17777,17843,17907,17978,18041,18106,18170,18231,18292,18344,18417,18491,18560,18635,18709,18783,18924,18994,23649,24664,24754,24842,24938,25028,26256,26345,26592,26873,27125,27410,27803,28280,28502,28724,29000,29227,29457,29687,29917,30147,30374,30793,31019,31444,31674,32102,32321,32604,32812,32943,33170,33596,33821,34248,34469,34894,35014,35290,35591,35915,36206,36520,36657,36788,36893,37135,37302,37506,37714,37985,38097,38209,38314,38431,38645,38791,38931,39017,39365,39453,39699,40117,40366,40448,40546,41138,41238,41490,41914,42169,42263,42352,42589,44613,44855,44957,45210,47366,57898,59414,70045,71573,73330,73956,74376,75437,76702,76958,77194,77741,78235,78840,79038,79618,80182,80557,80675,81213,81370,81566,81839,82095,82265,82406,82470,82835,83202,83878,84142,84480,84833,84927,85113,85419,85681,85806,85933,86172,86383,86502,86695,86872,87327,87508,87630,87889,88002,88189,88291,88398,88527,88802,89310,89806,90683,90977,91547,91696,92428,92600,92684,93020,93112,93390,99438,104827,104889,105467,106051,106142,106255,106484,106644,106796,106967,107133,107302,107469,107632,107875,108045,108218,108389,108663,108862,109067,109397,109871,109967,110063,110161,110261,110363,110465,110567,110669,110771,110871,110967,111079,111208,111331,111462,111593,111691,111805,111899,112039,112173,112269,112381,112481,112597,112693,112805,112905,113045,113181,113345,113475,113633,113783,113924,114068,114203,114315,114465,114593,114721,114857,114989,115119,115249,115361,115501,116405,116549,116687,116779,116869,116945,117049,117139,117241,117349,117457,117557,117637,117729,117827,117937,118015,118121,118213,118317,118427,118549,118712,118869,121222,121322,121412,121522,121612,121853,121947,122053,122145,122245,122357,122471,122587,122703,122797,122911,123023,123125,123245,123367,123449,123553,123673,123799,123897,123991,124079,124191,124307,124429,124541,124716,124832,124918,125010,125122,125246,125313,125439,125507,125635,125779,125907,125976,126071,126186,126299,126398,126507,126618,126729,126830,126935,127035,127165,127256,127379,127473,127585,127671,127775,127871,127959,128077,128181,128285,128411,128499,128607,128707,128797,128907,128991,129093,129177,129231,129295,129401,129487,129597,129681,129801" - } - }, - { - "source": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/res/values/strings.xml", - "from": { - "startLines": "1", - "startColumns": "4", - "startOffsets": "16", - "endColumns": "51", - "endOffsets": "63" - }, - "to": { - "startLines": "293", - "startColumns": "4", - "startOffsets": "19072", - "endColumns": "51", - "endOffsets": "19119" - } - } - ] - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/merged_res_blame_folder/debug/out/single/debug.json b/android/app/build/intermediates/merged_res_blame_folder/debug/out/single/debug.json deleted file mode 100644 index f1e17e7..0000000 --- a/android/app/build/intermediates/merged_res_blame_folder/debug/out/single/debug.json +++ /dev/null @@ -1,42 +0,0 @@ -[ - { - "merged": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-mdpi_ic_launcher_round.png.flat", - "source": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png" - }, - { - "merged": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-hdpi_ic_launcher.png.flat", - "source": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/res/mipmap-hdpi/ic_launcher.png" - }, - { - "merged": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-xxhdpi_ic_launcher.png.flat", - "source": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png" - }, - { - "merged": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-xhdpi_ic_launcher.png.flat", - "source": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png" - }, - { - "merged": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-xxhdpi_ic_launcher_round.png.flat", - "source": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png" - }, - { - "merged": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-hdpi_ic_launcher_round.png.flat", - "source": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png" - }, - { - "merged": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-xhdpi_ic_launcher_round.png.flat", - "source": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png" - }, - { - "merged": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-xxxhdpi_ic_launcher.png.flat", - "source": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png" - }, - { - "merged": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-xxxhdpi_ic_launcher_round.png.flat", - "source": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png" - }, - { - "merged": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/build/intermediates/res/merged/debug/mipmap-mdpi_ic_launcher.png.flat", - "source": "/Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/res/mipmap-mdpi/ic_launcher.png" - } -] \ No newline at end of file diff --git a/android/app/build/intermediates/navigation_json/debug/navigation.json b/android/app/build/intermediates/navigation_json/debug/navigation.json deleted file mode 100644 index 0637a08..0000000 --- a/android/app/build/intermediates/navigation_json/debug/navigation.json +++ /dev/null @@ -1 +0,0 @@ -[] \ No newline at end of file diff --git a/android/app/build/intermediates/packaged_manifests/debug/AndroidManifest.xml b/android/app/build/intermediates/packaged_manifests/debug/AndroidManifest.xml deleted file mode 100644 index 0a9a789..0000000 --- a/android/app/build/intermediates/packaged_manifests/debug/AndroidManifest.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/android/app/build/intermediates/packaged_manifests/debug/output-metadata.json b/android/app/build/intermediates/packaged_manifests/debug/output-metadata.json deleted file mode 100644 index ad5f3eb..0000000 --- a/android/app/build/intermediates/packaged_manifests/debug/output-metadata.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": 2, - "artifactType": { - "type": "PACKAGED_MANIFESTS", - "kind": "Directory" - }, - "applicationId": "com.reactnativeapp", - "variantName": "debug", - "elements": [ - { - "type": "SINGLE", - "filters": [], - "versionCode": 1, - "versionName": "1.0", - "outputFile": "AndroidManifest.xml" - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/processed_res/debug/out/output-metadata.json b/android/app/build/intermediates/processed_res/debug/out/output-metadata.json deleted file mode 100644 index 82968b7..0000000 --- a/android/app/build/intermediates/processed_res/debug/out/output-metadata.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": 2, - "artifactType": { - "type": "PROCESSED_RES", - "kind": "Directory" - }, - "applicationId": "com.reactnativeapp", - "variantName": "processDebugResources", - "elements": [ - { - "type": "SINGLE", - "filters": [], - "versionCode": 1, - "versionName": "1.0", - "outputFile": "resources-debug.ap_" - } - ] -} \ No newline at end of file diff --git a/android/app/build/intermediates/processed_res/debug/out/resources-debug.ap_ b/android/app/build/intermediates/processed_res/debug/out/resources-debug.ap_ deleted file mode 100644 index 8128e60..0000000 Binary files a/android/app/build/intermediates/processed_res/debug/out/resources-debug.ap_ and /dev/null differ diff --git a/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_0.jar b/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_0.jar deleted file mode 100644 index aad98a1..0000000 Binary files a/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_0.jar and /dev/null differ diff --git a/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_1.jar b/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_1.jar deleted file mode 100644 index 793bb9c..0000000 Binary files a/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_1.jar and /dev/null differ diff --git a/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_2.jar b/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_2.jar deleted file mode 100644 index 4812de4..0000000 Binary files a/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_2.jar and /dev/null differ diff --git a/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_3.jar b/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_3.jar deleted file mode 100644 index ed067f0..0000000 Binary files a/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_3.jar and /dev/null differ diff --git a/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_4.jar b/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_4.jar deleted file mode 100644 index 20c8076..0000000 Binary files a/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_4.jar and /dev/null differ diff --git a/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_5.jar b/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_5.jar deleted file mode 100644 index a10c22b..0000000 Binary files a/android/app/build/intermediates/project_dex_archive/debug/out/0a08fbafc43a6385659c43e7677f93e08f8836b44b29545c8ef75eb83984aa97_5.jar and /dev/null differ diff --git a/android/app/build/intermediates/project_dex_archive/debug/out/com/facebook/react/PackageList.dex b/android/app/build/intermediates/project_dex_archive/debug/out/com/facebook/react/PackageList.dex deleted file mode 100644 index 5eb7b51..0000000 Binary files a/android/app/build/intermediates/project_dex_archive/debug/out/com/facebook/react/PackageList.dex and /dev/null differ diff --git a/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/BuildConfig.dex b/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/BuildConfig.dex deleted file mode 100644 index cf743d3..0000000 Binary files a/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/BuildConfig.dex and /dev/null differ diff --git a/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/MainActivity.dex b/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/MainActivity.dex deleted file mode 100644 index 853083b..0000000 Binary files a/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/MainActivity.dex and /dev/null differ diff --git a/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/MainApplication$1.dex b/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/MainApplication$1.dex deleted file mode 100644 index 9e798c0..0000000 Binary files a/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/MainApplication$1.dex and /dev/null differ diff --git a/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/MainApplication.dex b/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/MainApplication.dex deleted file mode 100644 index d02f3a5..0000000 Binary files a/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/MainApplication.dex and /dev/null differ diff --git a/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/ReactNativeFlipper$1.dex b/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/ReactNativeFlipper$1.dex deleted file mode 100644 index 77cef81..0000000 Binary files a/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/ReactNativeFlipper$1.dex and /dev/null differ diff --git a/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/ReactNativeFlipper$2$1.dex b/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/ReactNativeFlipper$2$1.dex deleted file mode 100644 index e7a1137..0000000 Binary files a/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/ReactNativeFlipper$2$1.dex and /dev/null differ diff --git a/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/ReactNativeFlipper$2.dex b/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/ReactNativeFlipper$2.dex deleted file mode 100644 index 5b02034..0000000 Binary files a/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/ReactNativeFlipper$2.dex and /dev/null differ diff --git a/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/ReactNativeFlipper.dex b/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/ReactNativeFlipper.dex deleted file mode 100644 index 1a63631..0000000 Binary files a/android/app/build/intermediates/project_dex_archive/debug/out/com/reactnativeapp/ReactNativeFlipper.dex and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/mipmap-hdpi_ic_launcher.png.flat b/android/app/build/intermediates/res/merged/debug/mipmap-hdpi_ic_launcher.png.flat deleted file mode 100644 index 96bb9fb..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/mipmap-hdpi_ic_launcher.png.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/mipmap-hdpi_ic_launcher_round.png.flat b/android/app/build/intermediates/res/merged/debug/mipmap-hdpi_ic_launcher_round.png.flat deleted file mode 100644 index 5ba2f22..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/mipmap-hdpi_ic_launcher_round.png.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/mipmap-mdpi_ic_launcher.png.flat b/android/app/build/intermediates/res/merged/debug/mipmap-mdpi_ic_launcher.png.flat deleted file mode 100644 index 2f0b7fa..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/mipmap-mdpi_ic_launcher.png.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/mipmap-mdpi_ic_launcher_round.png.flat b/android/app/build/intermediates/res/merged/debug/mipmap-mdpi_ic_launcher_round.png.flat deleted file mode 100644 index 29d5696..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/mipmap-mdpi_ic_launcher_round.png.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/mipmap-xhdpi_ic_launcher.png.flat b/android/app/build/intermediates/res/merged/debug/mipmap-xhdpi_ic_launcher.png.flat deleted file mode 100644 index e2bd59a..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/mipmap-xhdpi_ic_launcher.png.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/mipmap-xhdpi_ic_launcher_round.png.flat b/android/app/build/intermediates/res/merged/debug/mipmap-xhdpi_ic_launcher_round.png.flat deleted file mode 100644 index 42c1559..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/mipmap-xhdpi_ic_launcher_round.png.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/mipmap-xxhdpi_ic_launcher.png.flat b/android/app/build/intermediates/res/merged/debug/mipmap-xxhdpi_ic_launcher.png.flat deleted file mode 100644 index 5ccb1d4..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/mipmap-xxhdpi_ic_launcher.png.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/mipmap-xxhdpi_ic_launcher_round.png.flat b/android/app/build/intermediates/res/merged/debug/mipmap-xxhdpi_ic_launcher_round.png.flat deleted file mode 100644 index 610a547..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/mipmap-xxhdpi_ic_launcher_round.png.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/mipmap-xxxhdpi_ic_launcher.png.flat b/android/app/build/intermediates/res/merged/debug/mipmap-xxxhdpi_ic_launcher.png.flat deleted file mode 100644 index 9fc579d..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/mipmap-xxxhdpi_ic_launcher.png.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/mipmap-xxxhdpi_ic_launcher_round.png.flat b/android/app/build/intermediates/res/merged/debug/mipmap-xxxhdpi_ic_launcher_round.png.flat deleted file mode 100644 index 63f75f9..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/mipmap-xxxhdpi_ic_launcher_round.png.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-af_values-af.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-af_values-af.arsc.flat deleted file mode 100644 index 465371a..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-af_values-af.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-am_values-am.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-am_values-am.arsc.flat deleted file mode 100644 index 4d64714..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-am_values-am.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-ar_values-ar.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-ar_values-ar.arsc.flat deleted file mode 100644 index 5c8134d..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-ar_values-ar.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-as_values-as.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-as_values-as.arsc.flat deleted file mode 100644 index 5733d8f..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-as_values-as.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-az_values-az.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-az_values-az.arsc.flat deleted file mode 100644 index c8fe36b..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-az_values-az.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-b+sr+Latn_values-b+sr+Latn.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-b+sr+Latn_values-b+sr+Latn.arsc.flat deleted file mode 100644 index 96fcd77..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-b+sr+Latn_values-b+sr+Latn.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-be_values-be.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-be_values-be.arsc.flat deleted file mode 100644 index 22cddc3..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-be_values-be.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-bg_values-bg.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-bg_values-bg.arsc.flat deleted file mode 100644 index 0bc1fa2..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-bg_values-bg.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-bn_values-bn.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-bn_values-bn.arsc.flat deleted file mode 100644 index 4fd0a20..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-bn_values-bn.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-bs_values-bs.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-bs_values-bs.arsc.flat deleted file mode 100644 index d5fa00d..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-bs_values-bs.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-ca_values-ca.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-ca_values-ca.arsc.flat deleted file mode 100644 index d2e6f5a..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-ca_values-ca.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-cs_values-cs.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-cs_values-cs.arsc.flat deleted file mode 100644 index 85d1f40..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-cs_values-cs.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-da_values-da.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-da_values-da.arsc.flat deleted file mode 100644 index 9320691..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-da_values-da.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-de_values-de.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-de_values-de.arsc.flat deleted file mode 100644 index 86f890c..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-de_values-de.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-el_values-el.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-el_values-el.arsc.flat deleted file mode 100644 index c51d6e3..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-el_values-el.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-en-rAU_values-en-rAU.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-en-rAU_values-en-rAU.arsc.flat deleted file mode 100644 index 3a25910..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-en-rAU_values-en-rAU.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-en-rCA_values-en-rCA.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-en-rCA_values-en-rCA.arsc.flat deleted file mode 100644 index f0ed31c..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-en-rCA_values-en-rCA.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-en-rGB_values-en-rGB.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-en-rGB_values-en-rGB.arsc.flat deleted file mode 100644 index 0028f12..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-en-rGB_values-en-rGB.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-en-rIN_values-en-rIN.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-en-rIN_values-en-rIN.arsc.flat deleted file mode 100644 index fd58823..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-en-rIN_values-en-rIN.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-en-rXC_values-en-rXC.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-en-rXC_values-en-rXC.arsc.flat deleted file mode 100644 index 8413148..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-en-rXC_values-en-rXC.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-es-rUS_values-es-rUS.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-es-rUS_values-es-rUS.arsc.flat deleted file mode 100644 index 0fc3f72..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-es-rUS_values-es-rUS.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-es_values-es.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-es_values-es.arsc.flat deleted file mode 100644 index 3e0ff8e..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-es_values-es.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-et_values-et.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-et_values-et.arsc.flat deleted file mode 100644 index cd1071b..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-et_values-et.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-eu_values-eu.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-eu_values-eu.arsc.flat deleted file mode 100644 index 4de6b78..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-eu_values-eu.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-fa_values-fa.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-fa_values-fa.arsc.flat deleted file mode 100644 index ddbf03d..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-fa_values-fa.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-fi_values-fi.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-fi_values-fi.arsc.flat deleted file mode 100644 index fc5c67d..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-fi_values-fi.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-fr-rCA_values-fr-rCA.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-fr-rCA_values-fr-rCA.arsc.flat deleted file mode 100644 index 351793f..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-fr-rCA_values-fr-rCA.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-fr_values-fr.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-fr_values-fr.arsc.flat deleted file mode 100644 index 815239f..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-fr_values-fr.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-gl_values-gl.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-gl_values-gl.arsc.flat deleted file mode 100644 index 43fc8df..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-gl_values-gl.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-gu_values-gu.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-gu_values-gu.arsc.flat deleted file mode 100644 index 29ea6f0..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-gu_values-gu.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-h720dp-v13_values-h720dp-v13.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-h720dp-v13_values-h720dp-v13.arsc.flat deleted file mode 100644 index 82bb12e..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-h720dp-v13_values-h720dp-v13.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-hdpi-v4_values-hdpi-v4.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-hdpi-v4_values-hdpi-v4.arsc.flat deleted file mode 100644 index 5366bc8..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-hdpi-v4_values-hdpi-v4.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-hi_values-hi.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-hi_values-hi.arsc.flat deleted file mode 100644 index 4eb05a2..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-hi_values-hi.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-hr_values-hr.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-hr_values-hr.arsc.flat deleted file mode 100644 index b480de7..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-hr_values-hr.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-hu_values-hu.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-hu_values-hu.arsc.flat deleted file mode 100644 index 2fe8c18..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-hu_values-hu.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-hy_values-hy.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-hy_values-hy.arsc.flat deleted file mode 100644 index 1fb0d8c..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-hy_values-hy.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-in_values-in.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-in_values-in.arsc.flat deleted file mode 100644 index 9d191cb..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-in_values-in.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-is_values-is.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-is_values-is.arsc.flat deleted file mode 100644 index 87fe1fe..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-is_values-is.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-it_values-it.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-it_values-it.arsc.flat deleted file mode 100644 index a92ece7..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-it_values-it.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-iw_values-iw.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-iw_values-iw.arsc.flat deleted file mode 100644 index 3601e2d..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-iw_values-iw.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-ja_values-ja.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-ja_values-ja.arsc.flat deleted file mode 100644 index 6785b65..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-ja_values-ja.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-ka_values-ka.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-ka_values-ka.arsc.flat deleted file mode 100644 index f1ec94d..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-ka_values-ka.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-kk_values-kk.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-kk_values-kk.arsc.flat deleted file mode 100644 index dbf269b..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-kk_values-kk.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-km_values-km.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-km_values-km.arsc.flat deleted file mode 100644 index 306d560..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-km_values-km.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-kn_values-kn.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-kn_values-kn.arsc.flat deleted file mode 100644 index e3d1e3a..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-kn_values-kn.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-ko_values-ko.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-ko_values-ko.arsc.flat deleted file mode 100644 index 94be7d5..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-ko_values-ko.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-ky_values-ky.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-ky_values-ky.arsc.flat deleted file mode 100644 index 50d0669..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-ky_values-ky.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-land_values-land.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-land_values-land.arsc.flat deleted file mode 100644 index 5f6044e..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-land_values-land.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-large-v4_values-large-v4.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-large-v4_values-large-v4.arsc.flat deleted file mode 100644 index aaaa109..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-large-v4_values-large-v4.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-ldltr-v21_values-ldltr-v21.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-ldltr-v21_values-ldltr-v21.arsc.flat deleted file mode 100644 index 6b0df1c..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-ldltr-v21_values-ldltr-v21.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-lo_values-lo.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-lo_values-lo.arsc.flat deleted file mode 100644 index 405d0b2..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-lo_values-lo.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-lt_values-lt.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-lt_values-lt.arsc.flat deleted file mode 100644 index 57a234f..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-lt_values-lt.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-lv_values-lv.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-lv_values-lv.arsc.flat deleted file mode 100644 index 8c26cdb..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-lv_values-lv.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-mk_values-mk.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-mk_values-mk.arsc.flat deleted file mode 100644 index e3cbdf4..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-mk_values-mk.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-ml_values-ml.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-ml_values-ml.arsc.flat deleted file mode 100644 index be22fad..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-ml_values-ml.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-mn_values-mn.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-mn_values-mn.arsc.flat deleted file mode 100644 index be44ef6..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-mn_values-mn.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-mr_values-mr.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-mr_values-mr.arsc.flat deleted file mode 100644 index 9842e8b..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-mr_values-mr.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-ms_values-ms.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-ms_values-ms.arsc.flat deleted file mode 100644 index 877b9e4..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-ms_values-ms.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-my_values-my.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-my_values-my.arsc.flat deleted file mode 100644 index b7ad23c..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-my_values-my.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-nb_values-nb.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-nb_values-nb.arsc.flat deleted file mode 100644 index b4e4441..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-nb_values-nb.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-ne_values-ne.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-ne_values-ne.arsc.flat deleted file mode 100644 index 80cee57..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-ne_values-ne.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-night-v8_values-night-v8.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-night-v8_values-night-v8.arsc.flat deleted file mode 100644 index a9bd7bf..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-night-v8_values-night-v8.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-nl_values-nl.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-nl_values-nl.arsc.flat deleted file mode 100644 index 9da7ac3..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-nl_values-nl.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-or_values-or.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-or_values-or.arsc.flat deleted file mode 100644 index 485cf1a..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-or_values-or.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-pa_values-pa.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-pa_values-pa.arsc.flat deleted file mode 100644 index b98b154..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-pa_values-pa.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-pl_values-pl.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-pl_values-pl.arsc.flat deleted file mode 100644 index 5d4c0ab..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-pl_values-pl.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-port_values-port.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-port_values-port.arsc.flat deleted file mode 100644 index aa129cf..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-port_values-port.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-pt-rBR_values-pt-rBR.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-pt-rBR_values-pt-rBR.arsc.flat deleted file mode 100644 index bf1887d..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-pt-rBR_values-pt-rBR.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-pt-rPT_values-pt-rPT.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-pt-rPT_values-pt-rPT.arsc.flat deleted file mode 100644 index 0848933..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-pt-rPT_values-pt-rPT.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-pt_values-pt.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-pt_values-pt.arsc.flat deleted file mode 100644 index d67543c..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-pt_values-pt.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-ro_values-ro.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-ro_values-ro.arsc.flat deleted file mode 100644 index 26e8103..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-ro_values-ro.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-ru_values-ru.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-ru_values-ru.arsc.flat deleted file mode 100644 index 179ce63..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-ru_values-ru.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-si_values-si.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-si_values-si.arsc.flat deleted file mode 100644 index 8121fdf..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-si_values-si.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-sk_values-sk.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-sk_values-sk.arsc.flat deleted file mode 100644 index 73e23a0..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-sk_values-sk.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-sl_values-sl.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-sl_values-sl.arsc.flat deleted file mode 100644 index 98e6d23..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-sl_values-sl.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-sq_values-sq.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-sq_values-sq.arsc.flat deleted file mode 100644 index 701472b..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-sq_values-sq.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-sr_values-sr.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-sr_values-sr.arsc.flat deleted file mode 100644 index 0ebcc89..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-sr_values-sr.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-sv_values-sv.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-sv_values-sv.arsc.flat deleted file mode 100644 index 5bff8e6..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-sv_values-sv.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-sw600dp-v13_values-sw600dp-v13.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-sw600dp-v13_values-sw600dp-v13.arsc.flat deleted file mode 100644 index 448f99b..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-sw600dp-v13_values-sw600dp-v13.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-sw_values-sw.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-sw_values-sw.arsc.flat deleted file mode 100644 index 69d8410..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-sw_values-sw.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-ta_values-ta.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-ta_values-ta.arsc.flat deleted file mode 100644 index caf1f55..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-ta_values-ta.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-te_values-te.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-te_values-te.arsc.flat deleted file mode 100644 index aae3500..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-te_values-te.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-th_values-th.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-th_values-th.arsc.flat deleted file mode 100644 index 5cd44da..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-th_values-th.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-tl_values-tl.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-tl_values-tl.arsc.flat deleted file mode 100644 index 0dafc4f..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-tl_values-tl.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-tr_values-tr.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-tr_values-tr.arsc.flat deleted file mode 100644 index 82e34d0..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-tr_values-tr.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-uk_values-uk.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-uk_values-uk.arsc.flat deleted file mode 100644 index b7667ab..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-uk_values-uk.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-ur_values-ur.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-ur_values-ur.arsc.flat deleted file mode 100644 index b67c2fd..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-ur_values-ur.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-uz_values-uz.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-uz_values-uz.arsc.flat deleted file mode 100644 index b845091..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-uz_values-uz.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-v16_values-v16.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-v16_values-v16.arsc.flat deleted file mode 100644 index 854a1da..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-v16_values-v16.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-v17_values-v17.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-v17_values-v17.arsc.flat deleted file mode 100644 index 95e8c80..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-v17_values-v17.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-v18_values-v18.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-v18_values-v18.arsc.flat deleted file mode 100644 index f07d1d6..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-v18_values-v18.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-v21_values-v21.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-v21_values-v21.arsc.flat deleted file mode 100644 index d6adb7a..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-v21_values-v21.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-v22_values-v22.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-v22_values-v22.arsc.flat deleted file mode 100644 index f2c65c6..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-v22_values-v22.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-v23_values-v23.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-v23_values-v23.arsc.flat deleted file mode 100644 index 7e75d58..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-v23_values-v23.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-v24_values-v24.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-v24_values-v24.arsc.flat deleted file mode 100644 index d844184..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-v24_values-v24.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-v25_values-v25.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-v25_values-v25.arsc.flat deleted file mode 100644 index ffd8744..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-v25_values-v25.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-v26_values-v26.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-v26_values-v26.arsc.flat deleted file mode 100644 index 2a53d3c..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-v26_values-v26.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-v28_values-v28.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-v28_values-v28.arsc.flat deleted file mode 100644 index a477efa..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-v28_values-v28.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-vi_values-vi.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-vi_values-vi.arsc.flat deleted file mode 100644 index 7395db4..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-vi_values-vi.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-watch-v20_values-watch-v20.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-watch-v20_values-watch-v20.arsc.flat deleted file mode 100644 index 4765278..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-watch-v20_values-watch-v20.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-watch-v21_values-watch-v21.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-watch-v21_values-watch-v21.arsc.flat deleted file mode 100644 index 30cda20..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-watch-v21_values-watch-v21.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-xlarge-v4_values-xlarge-v4.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-xlarge-v4_values-xlarge-v4.arsc.flat deleted file mode 100644 index a1b029d..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-xlarge-v4_values-xlarge-v4.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-zh-rCN_values-zh-rCN.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-zh-rCN_values-zh-rCN.arsc.flat deleted file mode 100644 index d5734d7..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-zh-rCN_values-zh-rCN.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-zh-rHK_values-zh-rHK.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-zh-rHK_values-zh-rHK.arsc.flat deleted file mode 100644 index 80295db..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-zh-rHK_values-zh-rHK.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-zh-rTW_values-zh-rTW.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-zh-rTW_values-zh-rTW.arsc.flat deleted file mode 100644 index cb553e7..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-zh-rTW_values-zh-rTW.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values-zu_values-zu.arsc.flat b/android/app/build/intermediates/res/merged/debug/values-zu_values-zu.arsc.flat deleted file mode 100644 index 2ea1d5b..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values-zu_values-zu.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/res/merged/debug/values_values.arsc.flat b/android/app/build/intermediates/res/merged/debug/values_values.arsc.flat deleted file mode 100644 index f87b53e..0000000 Binary files a/android/app/build/intermediates/res/merged/debug/values_values.arsc.flat and /dev/null differ diff --git a/android/app/build/intermediates/runtime_symbol_list/debug/R.txt b/android/app/build/intermediates/runtime_symbol_list/debug/R.txt deleted file mode 100644 index f9d2e1e..0000000 --- a/android/app/build/intermediates/runtime_symbol_list/debug/R.txt +++ /dev/null @@ -1,1893 +0,0 @@ -int anim abc_fade_in 0x7f010000 -int anim abc_fade_out 0x7f010001 -int anim abc_grow_fade_in_from_bottom 0x7f010002 -int anim abc_popup_enter 0x7f010003 -int anim abc_popup_exit 0x7f010004 -int anim abc_shrink_fade_out_from_bottom 0x7f010005 -int anim abc_slide_in_bottom 0x7f010006 -int anim abc_slide_in_top 0x7f010007 -int anim abc_slide_out_bottom 0x7f010008 -int anim abc_slide_out_top 0x7f010009 -int anim abc_tooltip_enter 0x7f01000a -int anim abc_tooltip_exit 0x7f01000b -int anim btn_checkbox_to_checked_box_inner_merged_animation 0x7f01000c -int anim btn_checkbox_to_checked_box_outer_merged_animation 0x7f01000d -int anim btn_checkbox_to_checked_icon_null_animation 0x7f01000e -int anim btn_checkbox_to_unchecked_box_inner_merged_animation 0x7f01000f -int anim btn_checkbox_to_unchecked_check_path_merged_animation 0x7f010010 -int anim btn_checkbox_to_unchecked_icon_null_animation 0x7f010011 -int anim btn_radio_to_off_mtrl_dot_group_animation 0x7f010012 -int anim btn_radio_to_off_mtrl_ring_outer_animation 0x7f010013 -int anim btn_radio_to_off_mtrl_ring_outer_path_animation 0x7f010014 -int anim btn_radio_to_on_mtrl_dot_group_animation 0x7f010015 -int anim btn_radio_to_on_mtrl_ring_outer_animation 0x7f010016 -int anim btn_radio_to_on_mtrl_ring_outer_path_animation 0x7f010017 -int anim catalyst_fade_in 0x7f010018 -int anim catalyst_fade_out 0x7f010019 -int anim catalyst_push_up_in 0x7f01001a -int anim catalyst_push_up_out 0x7f01001b -int anim catalyst_slide_down 0x7f01001c -int anim catalyst_slide_up 0x7f01001d -int attr actionBarDivider 0x7f020000 -int attr actionBarItemBackground 0x7f020001 -int attr actionBarPopupTheme 0x7f020002 -int attr actionBarSize 0x7f020003 -int attr actionBarSplitStyle 0x7f020004 -int attr actionBarStyle 0x7f020005 -int attr actionBarTabBarStyle 0x7f020006 -int attr actionBarTabStyle 0x7f020007 -int attr actionBarTabTextStyle 0x7f020008 -int attr actionBarTheme 0x7f020009 -int attr actionBarWidgetTheme 0x7f02000a -int attr actionButtonStyle 0x7f02000b -int attr actionDropDownStyle 0x7f02000c -int attr actionLayout 0x7f02000d -int attr actionMenuTextAppearance 0x7f02000e -int attr actionMenuTextColor 0x7f02000f -int attr actionModeBackground 0x7f020010 -int attr actionModeCloseButtonStyle 0x7f020011 -int attr actionModeCloseDrawable 0x7f020012 -int attr actionModeCopyDrawable 0x7f020013 -int attr actionModeCutDrawable 0x7f020014 -int attr actionModeFindDrawable 0x7f020015 -int attr actionModePasteDrawable 0x7f020016 -int attr actionModePopupWindowStyle 0x7f020017 -int attr actionModeSelectAllDrawable 0x7f020018 -int attr actionModeShareDrawable 0x7f020019 -int attr actionModeSplitBackground 0x7f02001a -int attr actionModeStyle 0x7f02001b -int attr actionModeWebSearchDrawable 0x7f02001c -int attr actionOverflowButtonStyle 0x7f02001d -int attr actionOverflowMenuStyle 0x7f02001e -int attr actionProviderClass 0x7f02001f -int attr actionViewClass 0x7f020020 -int attr activityChooserViewStyle 0x7f020021 -int attr actualImageResource 0x7f020022 -int attr actualImageScaleType 0x7f020023 -int attr actualImageUri 0x7f020024 -int attr alertDialogButtonGroupStyle 0x7f020025 -int attr alertDialogCenterButtons 0x7f020026 -int attr alertDialogStyle 0x7f020027 -int attr alertDialogTheme 0x7f020028 -int attr allowStacking 0x7f020029 -int attr alpha 0x7f02002a -int attr alphabeticModifiers 0x7f02002b -int attr arrowHeadLength 0x7f02002c -int attr arrowShaftLength 0x7f02002d -int attr autoCompleteTextViewStyle 0x7f02002e -int attr autoSizeMaxTextSize 0x7f02002f -int attr autoSizeMinTextSize 0x7f020030 -int attr autoSizePresetSizes 0x7f020031 -int attr autoSizeStepGranularity 0x7f020032 -int attr autoSizeTextType 0x7f020033 -int attr background 0x7f020034 -int attr backgroundImage 0x7f020035 -int attr backgroundSplit 0x7f020036 -int attr backgroundStacked 0x7f020037 -int attr backgroundTint 0x7f020038 -int attr backgroundTintMode 0x7f020039 -int attr barLength 0x7f02003a -int attr borderlessButtonStyle 0x7f02003b -int attr buttonBarButtonStyle 0x7f02003c -int attr buttonBarNegativeButtonStyle 0x7f02003d -int attr buttonBarNeutralButtonStyle 0x7f02003e -int attr buttonBarPositiveButtonStyle 0x7f02003f -int attr buttonBarStyle 0x7f020040 -int attr buttonCompat 0x7f020041 -int attr buttonGravity 0x7f020042 -int attr buttonIconDimen 0x7f020043 -int attr buttonPanelSideLayout 0x7f020044 -int attr buttonStyle 0x7f020045 -int attr buttonStyleSmall 0x7f020046 -int attr buttonTint 0x7f020047 -int attr buttonTintMode 0x7f020048 -int attr checkboxStyle 0x7f020049 -int attr checkedTextViewStyle 0x7f02004a -int attr closeIcon 0x7f02004b -int attr closeItemLayout 0x7f02004c -int attr collapseContentDescription 0x7f02004d -int attr collapseIcon 0x7f02004e -int attr color 0x7f02004f -int attr colorAccent 0x7f020050 -int attr colorBackgroundFloating 0x7f020051 -int attr colorButtonNormal 0x7f020052 -int attr colorControlActivated 0x7f020053 -int attr colorControlHighlight 0x7f020054 -int attr colorControlNormal 0x7f020055 -int attr colorError 0x7f020056 -int attr colorPrimary 0x7f020057 -int attr colorPrimaryDark 0x7f020058 -int attr colorSwitchThumbNormal 0x7f020059 -int attr commitIcon 0x7f02005a -int attr contentDescription 0x7f02005b -int attr contentInsetEnd 0x7f02005c -int attr contentInsetEndWithActions 0x7f02005d -int attr contentInsetLeft 0x7f02005e -int attr contentInsetRight 0x7f02005f -int attr contentInsetStart 0x7f020060 -int attr contentInsetStartWithNavigation 0x7f020061 -int attr controlBackground 0x7f020062 -int attr customNavigationLayout 0x7f020063 -int attr defaultQueryHint 0x7f020064 -int attr dialogCornerRadius 0x7f020065 -int attr dialogPreferredPadding 0x7f020066 -int attr dialogTheme 0x7f020067 -int attr displayOptions 0x7f020068 -int attr divider 0x7f020069 -int attr dividerHorizontal 0x7f02006a -int attr dividerPadding 0x7f02006b -int attr dividerVertical 0x7f02006c -int attr drawableBottomCompat 0x7f02006d -int attr drawableEndCompat 0x7f02006e -int attr drawableLeftCompat 0x7f02006f -int attr drawableRightCompat 0x7f020070 -int attr drawableSize 0x7f020071 -int attr drawableStartCompat 0x7f020072 -int attr drawableTint 0x7f020073 -int attr drawableTintMode 0x7f020074 -int attr drawableTopCompat 0x7f020075 -int attr drawerArrowStyle 0x7f020076 -int attr dropDownListViewStyle 0x7f020077 -int attr dropdownListPreferredItemHeight 0x7f020078 -int attr editTextBackground 0x7f020079 -int attr editTextColor 0x7f02007a -int attr editTextStyle 0x7f02007b -int attr elevation 0x7f02007c -int attr expandActivityOverflowButtonDrawable 0x7f02007d -int attr fadeDuration 0x7f02007e -int attr failureImage 0x7f02007f -int attr failureImageScaleType 0x7f020080 -int attr firstBaselineToTopHeight 0x7f020081 -int attr font 0x7f020082 -int attr fontFamily 0x7f020083 -int attr fontProviderAuthority 0x7f020084 -int attr fontProviderCerts 0x7f020085 -int attr fontProviderFetchStrategy 0x7f020086 -int attr fontProviderFetchTimeout 0x7f020087 -int attr fontProviderPackage 0x7f020088 -int attr fontProviderQuery 0x7f020089 -int attr fontStyle 0x7f02008a -int attr fontVariationSettings 0x7f02008b -int attr fontWeight 0x7f02008c -int attr gapBetweenBars 0x7f02008d -int attr goIcon 0x7f02008e -int attr height 0x7f02008f -int attr hideOnContentScroll 0x7f020090 -int attr homeAsUpIndicator 0x7f020091 -int attr homeLayout 0x7f020092 -int attr icon 0x7f020093 -int attr iconTint 0x7f020094 -int attr iconTintMode 0x7f020095 -int attr iconifiedByDefault 0x7f020096 -int attr imageButtonStyle 0x7f020097 -int attr indeterminateProgressStyle 0x7f020098 -int attr initialActivityCount 0x7f020099 -int attr isLightTheme 0x7f02009a -int attr itemPadding 0x7f02009b -int attr lastBaselineToBottomHeight 0x7f02009c -int attr layout 0x7f02009d -int attr lineHeight 0x7f02009e -int attr listChoiceBackgroundIndicator 0x7f02009f -int attr listChoiceIndicatorMultipleAnimated 0x7f0200a0 -int attr listChoiceIndicatorSingleAnimated 0x7f0200a1 -int attr listDividerAlertDialog 0x7f0200a2 -int attr listItemLayout 0x7f0200a3 -int attr listLayout 0x7f0200a4 -int attr listMenuViewStyle 0x7f0200a5 -int attr listPopupWindowStyle 0x7f0200a6 -int attr listPreferredItemHeight 0x7f0200a7 -int attr listPreferredItemHeightLarge 0x7f0200a8 -int attr listPreferredItemHeightSmall 0x7f0200a9 -int attr listPreferredItemPaddingEnd 0x7f0200aa -int attr listPreferredItemPaddingLeft 0x7f0200ab -int attr listPreferredItemPaddingRight 0x7f0200ac -int attr listPreferredItemPaddingStart 0x7f0200ad -int attr logo 0x7f0200ae -int attr logoDescription 0x7f0200af -int attr maxButtonHeight 0x7f0200b0 -int attr measureWithLargestChild 0x7f0200b1 -int attr menu 0x7f0200b2 -int attr multiChoiceItemLayout 0x7f0200b3 -int attr navigationContentDescription 0x7f0200b4 -int attr navigationIcon 0x7f0200b5 -int attr navigationMode 0x7f0200b6 -int attr numericModifiers 0x7f0200b7 -int attr overlapAnchor 0x7f0200b8 -int attr overlayImage 0x7f0200b9 -int attr paddingBottomNoButtons 0x7f0200ba -int attr paddingEnd 0x7f0200bb -int attr paddingStart 0x7f0200bc -int attr paddingTopNoTitle 0x7f0200bd -int attr panelBackground 0x7f0200be -int attr panelMenuListTheme 0x7f0200bf -int attr panelMenuListWidth 0x7f0200c0 -int attr placeholderImage 0x7f0200c1 -int attr placeholderImageScaleType 0x7f0200c2 -int attr popupMenuStyle 0x7f0200c3 -int attr popupTheme 0x7f0200c4 -int attr popupWindowStyle 0x7f0200c5 -int attr preserveIconSpacing 0x7f0200c6 -int attr pressedStateOverlayImage 0x7f0200c7 -int attr progressBarAutoRotateInterval 0x7f0200c8 -int attr progressBarImage 0x7f0200c9 -int attr progressBarImageScaleType 0x7f0200ca -int attr progressBarPadding 0x7f0200cb -int attr progressBarStyle 0x7f0200cc -int attr queryBackground 0x7f0200cd -int attr queryHint 0x7f0200ce -int attr radioButtonStyle 0x7f0200cf -int attr ratingBarStyle 0x7f0200d0 -int attr ratingBarStyleIndicator 0x7f0200d1 -int attr ratingBarStyleSmall 0x7f0200d2 -int attr retryImage 0x7f0200d3 -int attr retryImageScaleType 0x7f0200d4 -int attr roundAsCircle 0x7f0200d5 -int attr roundBottomEnd 0x7f0200d6 -int attr roundBottomLeft 0x7f0200d7 -int attr roundBottomRight 0x7f0200d8 -int attr roundBottomStart 0x7f0200d9 -int attr roundTopEnd 0x7f0200da -int attr roundTopLeft 0x7f0200db -int attr roundTopRight 0x7f0200dc -int attr roundTopStart 0x7f0200dd -int attr roundWithOverlayColor 0x7f0200de -int attr roundedCornerRadius 0x7f0200df -int attr roundingBorderColor 0x7f0200e0 -int attr roundingBorderPadding 0x7f0200e1 -int attr roundingBorderWidth 0x7f0200e2 -int attr searchHintIcon 0x7f0200e3 -int attr searchIcon 0x7f0200e4 -int attr searchViewStyle 0x7f0200e5 -int attr seekBarStyle 0x7f0200e6 -int attr selectableItemBackground 0x7f0200e7 -int attr selectableItemBackgroundBorderless 0x7f0200e8 -int attr showAsAction 0x7f0200e9 -int attr showDividers 0x7f0200ea -int attr showText 0x7f0200eb -int attr showTitle 0x7f0200ec -int attr singleChoiceItemLayout 0x7f0200ed -int attr spinBars 0x7f0200ee -int attr spinnerDropDownItemStyle 0x7f0200ef -int attr spinnerStyle 0x7f0200f0 -int attr splitTrack 0x7f0200f1 -int attr srcCompat 0x7f0200f2 -int attr state_above_anchor 0x7f0200f3 -int attr subMenuArrow 0x7f0200f4 -int attr submitBackground 0x7f0200f5 -int attr subtitle 0x7f0200f6 -int attr subtitleTextAppearance 0x7f0200f7 -int attr subtitleTextColor 0x7f0200f8 -int attr subtitleTextStyle 0x7f0200f9 -int attr suggestionRowLayout 0x7f0200fa -int attr switchMinWidth 0x7f0200fb -int attr switchPadding 0x7f0200fc -int attr switchStyle 0x7f0200fd -int attr switchTextAppearance 0x7f0200fe -int attr textAllCaps 0x7f0200ff -int attr textAppearanceLargePopupMenu 0x7f020100 -int attr textAppearanceListItem 0x7f020101 -int attr textAppearanceListItemSecondary 0x7f020102 -int attr textAppearanceListItemSmall 0x7f020103 -int attr textAppearancePopupMenuHeader 0x7f020104 -int attr textAppearanceSearchResultSubtitle 0x7f020105 -int attr textAppearanceSearchResultTitle 0x7f020106 -int attr textAppearanceSmallPopupMenu 0x7f020107 -int attr textColorAlertDialogListItem 0x7f020108 -int attr textColorSearchUrl 0x7f020109 -int attr textLocale 0x7f02010a -int attr theme 0x7f02010b -int attr thickness 0x7f02010c -int attr thumbTextPadding 0x7f02010d -int attr thumbTint 0x7f02010e -int attr thumbTintMode 0x7f02010f -int attr tickMark 0x7f020110 -int attr tickMarkTint 0x7f020111 -int attr tickMarkTintMode 0x7f020112 -int attr tint 0x7f020113 -int attr tintMode 0x7f020114 -int attr title 0x7f020115 -int attr titleMargin 0x7f020116 -int attr titleMarginBottom 0x7f020117 -int attr titleMarginEnd 0x7f020118 -int attr titleMarginStart 0x7f020119 -int attr titleMarginTop 0x7f02011a -int attr titleMargins 0x7f02011b -int attr titleTextAppearance 0x7f02011c -int attr titleTextColor 0x7f02011d -int attr titleTextStyle 0x7f02011e -int attr toolbarNavigationButtonStyle 0x7f02011f -int attr toolbarStyle 0x7f020120 -int attr tooltipForegroundColor 0x7f020121 -int attr tooltipFrameBackground 0x7f020122 -int attr tooltipText 0x7f020123 -int attr track 0x7f020124 -int attr trackTint 0x7f020125 -int attr trackTintMode 0x7f020126 -int attr ttcIndex 0x7f020127 -int attr viewAspectRatio 0x7f020128 -int attr viewInflaterClass 0x7f020129 -int attr voiceIcon 0x7f02012a -int attr windowActionBar 0x7f02012b -int attr windowActionBarOverlay 0x7f02012c -int attr windowActionModeOverlay 0x7f02012d -int attr windowFixedHeightMajor 0x7f02012e -int attr windowFixedHeightMinor 0x7f02012f -int attr windowFixedWidthMajor 0x7f020130 -int attr windowFixedWidthMinor 0x7f020131 -int attr windowMinWidthMajor 0x7f020132 -int attr windowMinWidthMinor 0x7f020133 -int attr windowNoTitle 0x7f020134 -int bool abc_action_bar_embed_tabs 0x7f030000 -int bool abc_allow_stacked_button_bar 0x7f030001 -int bool abc_config_actionMenuItemAllCaps 0x7f030002 -int color abc_background_cache_hint_selector_material_dark 0x7f040000 -int color abc_background_cache_hint_selector_material_light 0x7f040001 -int color abc_btn_colored_borderless_text_material 0x7f040002 -int color abc_btn_colored_text_material 0x7f040003 -int color abc_color_highlight_material 0x7f040004 -int color abc_hint_foreground_material_dark 0x7f040005 -int color abc_hint_foreground_material_light 0x7f040006 -int color abc_input_method_navigation_guard 0x7f040007 -int color abc_primary_text_disable_only_material_dark 0x7f040008 -int color abc_primary_text_disable_only_material_light 0x7f040009 -int color abc_primary_text_material_dark 0x7f04000a -int color abc_primary_text_material_light 0x7f04000b -int color abc_search_url_text 0x7f04000c -int color abc_search_url_text_normal 0x7f04000d -int color abc_search_url_text_pressed 0x7f04000e -int color abc_search_url_text_selected 0x7f04000f -int color abc_secondary_text_material_dark 0x7f040010 -int color abc_secondary_text_material_light 0x7f040011 -int color abc_tint_btn_checkable 0x7f040012 -int color abc_tint_default 0x7f040013 -int color abc_tint_edittext 0x7f040014 -int color abc_tint_seek_thumb 0x7f040015 -int color abc_tint_spinner 0x7f040016 -int color abc_tint_switch_track 0x7f040017 -int color accent_material_dark 0x7f040018 -int color accent_material_light 0x7f040019 -int color background_floating_material_dark 0x7f04001a -int color background_floating_material_light 0x7f04001b -int color background_material_dark 0x7f04001c -int color background_material_light 0x7f04001d -int color bright_foreground_disabled_material_dark 0x7f04001e -int color bright_foreground_disabled_material_light 0x7f04001f -int color bright_foreground_inverse_material_dark 0x7f040020 -int color bright_foreground_inverse_material_light 0x7f040021 -int color bright_foreground_material_dark 0x7f040022 -int color bright_foreground_material_light 0x7f040023 -int color button_material_dark 0x7f040024 -int color button_material_light 0x7f040025 -int color catalyst_logbox_background 0x7f040026 -int color catalyst_redbox_background 0x7f040027 -int color dim_foreground_disabled_material_dark 0x7f040028 -int color dim_foreground_disabled_material_light 0x7f040029 -int color dim_foreground_material_dark 0x7f04002a -int color dim_foreground_material_light 0x7f04002b -int color error_color_material_dark 0x7f04002c -int color error_color_material_light 0x7f04002d -int color foreground_material_dark 0x7f04002e -int color foreground_material_light 0x7f04002f -int color highlighted_text_material_dark 0x7f040030 -int color highlighted_text_material_light 0x7f040031 -int color material_blue_grey_800 0x7f040032 -int color material_blue_grey_900 0x7f040033 -int color material_blue_grey_950 0x7f040034 -int color material_deep_teal_200 0x7f040035 -int color material_deep_teal_500 0x7f040036 -int color material_grey_100 0x7f040037 -int color material_grey_300 0x7f040038 -int color material_grey_50 0x7f040039 -int color material_grey_600 0x7f04003a -int color material_grey_800 0x7f04003b -int color material_grey_850 0x7f04003c -int color material_grey_900 0x7f04003d -int color notification_action_color_filter 0x7f04003e -int color notification_icon_bg_color 0x7f04003f -int color primary_dark_material_dark 0x7f040040 -int color primary_dark_material_light 0x7f040041 -int color primary_material_dark 0x7f040042 -int color primary_material_light 0x7f040043 -int color primary_text_default_material_dark 0x7f040044 -int color primary_text_default_material_light 0x7f040045 -int color primary_text_disabled_material_dark 0x7f040046 -int color primary_text_disabled_material_light 0x7f040047 -int color ripple_material_dark 0x7f040048 -int color ripple_material_light 0x7f040049 -int color secondary_text_default_material_dark 0x7f04004a -int color secondary_text_default_material_light 0x7f04004b -int color secondary_text_disabled_material_dark 0x7f04004c -int color secondary_text_disabled_material_light 0x7f04004d -int color switch_thumb_disabled_material_dark 0x7f04004e -int color switch_thumb_disabled_material_light 0x7f04004f -int color switch_thumb_material_dark 0x7f040050 -int color switch_thumb_material_light 0x7f040051 -int color switch_thumb_normal_material_dark 0x7f040052 -int color switch_thumb_normal_material_light 0x7f040053 -int color tooltip_background_dark 0x7f040054 -int color tooltip_background_light 0x7f040055 -int dimen abc_action_bar_content_inset_material 0x7f050000 -int dimen abc_action_bar_content_inset_with_nav 0x7f050001 -int dimen abc_action_bar_default_height_material 0x7f050002 -int dimen abc_action_bar_default_padding_end_material 0x7f050003 -int dimen abc_action_bar_default_padding_start_material 0x7f050004 -int dimen abc_action_bar_elevation_material 0x7f050005 -int dimen abc_action_bar_icon_vertical_padding_material 0x7f050006 -int dimen abc_action_bar_overflow_padding_end_material 0x7f050007 -int dimen abc_action_bar_overflow_padding_start_material 0x7f050008 -int dimen abc_action_bar_stacked_max_height 0x7f050009 -int dimen abc_action_bar_stacked_tab_max_width 0x7f05000a -int dimen abc_action_bar_subtitle_bottom_margin_material 0x7f05000b -int dimen abc_action_bar_subtitle_top_margin_material 0x7f05000c -int dimen abc_action_button_min_height_material 0x7f05000d -int dimen abc_action_button_min_width_material 0x7f05000e -int dimen abc_action_button_min_width_overflow_material 0x7f05000f -int dimen abc_alert_dialog_button_bar_height 0x7f050010 -int dimen abc_alert_dialog_button_dimen 0x7f050011 -int dimen abc_button_inset_horizontal_material 0x7f050012 -int dimen abc_button_inset_vertical_material 0x7f050013 -int dimen abc_button_padding_horizontal_material 0x7f050014 -int dimen abc_button_padding_vertical_material 0x7f050015 -int dimen abc_cascading_menus_min_smallest_width 0x7f050016 -int dimen abc_config_prefDialogWidth 0x7f050017 -int dimen abc_control_corner_material 0x7f050018 -int dimen abc_control_inset_material 0x7f050019 -int dimen abc_control_padding_material 0x7f05001a -int dimen abc_dialog_corner_radius_material 0x7f05001b -int dimen abc_dialog_fixed_height_major 0x7f05001c -int dimen abc_dialog_fixed_height_minor 0x7f05001d -int dimen abc_dialog_fixed_width_major 0x7f05001e -int dimen abc_dialog_fixed_width_minor 0x7f05001f -int dimen abc_dialog_list_padding_bottom_no_buttons 0x7f050020 -int dimen abc_dialog_list_padding_top_no_title 0x7f050021 -int dimen abc_dialog_min_width_major 0x7f050022 -int dimen abc_dialog_min_width_minor 0x7f050023 -int dimen abc_dialog_padding_material 0x7f050024 -int dimen abc_dialog_padding_top_material 0x7f050025 -int dimen abc_dialog_title_divider_material 0x7f050026 -int dimen abc_disabled_alpha_material_dark 0x7f050027 -int dimen abc_disabled_alpha_material_light 0x7f050028 -int dimen abc_dropdownitem_icon_width 0x7f050029 -int dimen abc_dropdownitem_text_padding_left 0x7f05002a -int dimen abc_dropdownitem_text_padding_right 0x7f05002b -int dimen abc_edit_text_inset_bottom_material 0x7f05002c -int dimen abc_edit_text_inset_horizontal_material 0x7f05002d -int dimen abc_edit_text_inset_top_material 0x7f05002e -int dimen abc_floating_window_z 0x7f05002f -int dimen abc_list_item_height_large_material 0x7f050030 -int dimen abc_list_item_height_material 0x7f050031 -int dimen abc_list_item_height_small_material 0x7f050032 -int dimen abc_list_item_padding_horizontal_material 0x7f050033 -int dimen abc_panel_menu_list_width 0x7f050034 -int dimen abc_progress_bar_height_material 0x7f050035 -int dimen abc_search_view_preferred_height 0x7f050036 -int dimen abc_search_view_preferred_width 0x7f050037 -int dimen abc_seekbar_track_background_height_material 0x7f050038 -int dimen abc_seekbar_track_progress_height_material 0x7f050039 -int dimen abc_select_dialog_padding_start_material 0x7f05003a -int dimen abc_switch_padding 0x7f05003b -int dimen abc_text_size_body_1_material 0x7f05003c -int dimen abc_text_size_body_2_material 0x7f05003d -int dimen abc_text_size_button_material 0x7f05003e -int dimen abc_text_size_caption_material 0x7f05003f -int dimen abc_text_size_display_1_material 0x7f050040 -int dimen abc_text_size_display_2_material 0x7f050041 -int dimen abc_text_size_display_3_material 0x7f050042 -int dimen abc_text_size_display_4_material 0x7f050043 -int dimen abc_text_size_headline_material 0x7f050044 -int dimen abc_text_size_large_material 0x7f050045 -int dimen abc_text_size_medium_material 0x7f050046 -int dimen abc_text_size_menu_header_material 0x7f050047 -int dimen abc_text_size_menu_material 0x7f050048 -int dimen abc_text_size_small_material 0x7f050049 -int dimen abc_text_size_subhead_material 0x7f05004a -int dimen abc_text_size_subtitle_material_toolbar 0x7f05004b -int dimen abc_text_size_title_material 0x7f05004c -int dimen abc_text_size_title_material_toolbar 0x7f05004d -int dimen compat_button_inset_horizontal_material 0x7f05004e -int dimen compat_button_inset_vertical_material 0x7f05004f -int dimen compat_button_padding_horizontal_material 0x7f050050 -int dimen compat_button_padding_vertical_material 0x7f050051 -int dimen compat_control_corner_material 0x7f050052 -int dimen compat_notification_large_icon_max_height 0x7f050053 -int dimen compat_notification_large_icon_max_width 0x7f050054 -int dimen disabled_alpha_material_dark 0x7f050055 -int dimen disabled_alpha_material_light 0x7f050056 -int dimen highlight_alpha_material_colored 0x7f050057 -int dimen highlight_alpha_material_dark 0x7f050058 -int dimen highlight_alpha_material_light 0x7f050059 -int dimen hint_alpha_material_dark 0x7f05005a -int dimen hint_alpha_material_light 0x7f05005b -int dimen hint_pressed_alpha_material_dark 0x7f05005c -int dimen hint_pressed_alpha_material_light 0x7f05005d -int dimen notification_action_icon_size 0x7f05005e -int dimen notification_action_text_size 0x7f05005f -int dimen notification_big_circle_margin 0x7f050060 -int dimen notification_content_margin_start 0x7f050061 -int dimen notification_large_icon_height 0x7f050062 -int dimen notification_large_icon_width 0x7f050063 -int dimen notification_main_column_padding_top 0x7f050064 -int dimen notification_media_narrow_margin 0x7f050065 -int dimen notification_right_icon_size 0x7f050066 -int dimen notification_right_side_padding_top 0x7f050067 -int dimen notification_small_icon_background_padding 0x7f050068 -int dimen notification_small_icon_size_as_large 0x7f050069 -int dimen notification_subtext_size 0x7f05006a -int dimen notification_top_pad 0x7f05006b -int dimen notification_top_pad_large_text 0x7f05006c -int dimen tooltip_corner_radius 0x7f05006d -int dimen tooltip_horizontal_padding 0x7f05006e -int dimen tooltip_margin 0x7f05006f -int dimen tooltip_precise_anchor_extra_offset 0x7f050070 -int dimen tooltip_precise_anchor_threshold 0x7f050071 -int dimen tooltip_vertical_padding 0x7f050072 -int dimen tooltip_y_offset_non_touch 0x7f050073 -int dimen tooltip_y_offset_touch 0x7f050074 -int drawable abc_ab_share_pack_mtrl_alpha 0x7f060000 -int drawable abc_action_bar_item_background_material 0x7f060001 -int drawable abc_btn_borderless_material 0x7f060002 -int drawable abc_btn_check_material 0x7f060003 -int drawable abc_btn_check_material_anim 0x7f060004 -int drawable abc_btn_check_to_on_mtrl_000 0x7f060005 -int drawable abc_btn_check_to_on_mtrl_015 0x7f060006 -int drawable abc_btn_colored_material 0x7f060007 -int drawable abc_btn_default_mtrl_shape 0x7f060008 -int drawable abc_btn_radio_material 0x7f060009 -int drawable abc_btn_radio_material_anim 0x7f06000a -int drawable abc_btn_radio_to_on_mtrl_000 0x7f06000b -int drawable abc_btn_radio_to_on_mtrl_015 0x7f06000c -int drawable abc_btn_switch_to_on_mtrl_00001 0x7f06000d -int drawable abc_btn_switch_to_on_mtrl_00012 0x7f06000e -int drawable abc_cab_background_internal_bg 0x7f06000f -int drawable abc_cab_background_top_material 0x7f060010 -int drawable abc_cab_background_top_mtrl_alpha 0x7f060011 -int drawable abc_control_background_material 0x7f060012 -int drawable abc_dialog_material_background 0x7f060013 -int drawable abc_edit_text_material 0x7f060014 -int drawable abc_ic_ab_back_material 0x7f060015 -int drawable abc_ic_arrow_drop_right_black_24dp 0x7f060016 -int drawable abc_ic_clear_material 0x7f060017 -int drawable abc_ic_commit_search_api_mtrl_alpha 0x7f060018 -int drawable abc_ic_go_search_api_material 0x7f060019 -int drawable abc_ic_menu_copy_mtrl_am_alpha 0x7f06001a -int drawable abc_ic_menu_cut_mtrl_alpha 0x7f06001b -int drawable abc_ic_menu_overflow_material 0x7f06001c -int drawable abc_ic_menu_paste_mtrl_am_alpha 0x7f06001d -int drawable abc_ic_menu_selectall_mtrl_alpha 0x7f06001e -int drawable abc_ic_menu_share_mtrl_alpha 0x7f06001f -int drawable abc_ic_search_api_material 0x7f060020 -int drawable abc_ic_star_black_16dp 0x7f060021 -int drawable abc_ic_star_black_36dp 0x7f060022 -int drawable abc_ic_star_black_48dp 0x7f060023 -int drawable abc_ic_star_half_black_16dp 0x7f060024 -int drawable abc_ic_star_half_black_36dp 0x7f060025 -int drawable abc_ic_star_half_black_48dp 0x7f060026 -int drawable abc_ic_voice_search_api_material 0x7f060027 -int drawable abc_item_background_holo_dark 0x7f060028 -int drawable abc_item_background_holo_light 0x7f060029 -int drawable abc_list_divider_material 0x7f06002a -int drawable abc_list_divider_mtrl_alpha 0x7f06002b -int drawable abc_list_focused_holo 0x7f06002c -int drawable abc_list_longpressed_holo 0x7f06002d -int drawable abc_list_pressed_holo_dark 0x7f06002e -int drawable abc_list_pressed_holo_light 0x7f06002f -int drawable abc_list_selector_background_transition_holo_dark 0x7f060030 -int drawable abc_list_selector_background_transition_holo_light 0x7f060031 -int drawable abc_list_selector_disabled_holo_dark 0x7f060032 -int drawable abc_list_selector_disabled_holo_light 0x7f060033 -int drawable abc_list_selector_holo_dark 0x7f060034 -int drawable abc_list_selector_holo_light 0x7f060035 -int drawable abc_menu_hardkey_panel_mtrl_mult 0x7f060036 -int drawable abc_popup_background_mtrl_mult 0x7f060037 -int drawable abc_ratingbar_indicator_material 0x7f060038 -int drawable abc_ratingbar_material 0x7f060039 -int drawable abc_ratingbar_small_material 0x7f06003a -int drawable abc_scrubber_control_off_mtrl_alpha 0x7f06003b -int drawable abc_scrubber_control_to_pressed_mtrl_000 0x7f06003c -int drawable abc_scrubber_control_to_pressed_mtrl_005 0x7f06003d -int drawable abc_scrubber_primary_mtrl_alpha 0x7f06003e -int drawable abc_scrubber_track_mtrl_alpha 0x7f06003f -int drawable abc_seekbar_thumb_material 0x7f060040 -int drawable abc_seekbar_tick_mark_material 0x7f060041 -int drawable abc_seekbar_track_material 0x7f060042 -int drawable abc_spinner_mtrl_am_alpha 0x7f060043 -int drawable abc_spinner_textfield_background_material 0x7f060044 -int drawable abc_switch_thumb_material 0x7f060045 -int drawable abc_switch_track_mtrl_alpha 0x7f060046 -int drawable abc_tab_indicator_material 0x7f060047 -int drawable abc_tab_indicator_mtrl_alpha 0x7f060048 -int drawable abc_text_cursor_material 0x7f060049 -int drawable abc_text_select_handle_left_mtrl_dark 0x7f06004a -int drawable abc_text_select_handle_left_mtrl_light 0x7f06004b -int drawable abc_text_select_handle_middle_mtrl_dark 0x7f06004c -int drawable abc_text_select_handle_middle_mtrl_light 0x7f06004d -int drawable abc_text_select_handle_right_mtrl_dark 0x7f06004e -int drawable abc_text_select_handle_right_mtrl_light 0x7f06004f -int drawable abc_textfield_activated_mtrl_alpha 0x7f060050 -int drawable abc_textfield_default_mtrl_alpha 0x7f060051 -int drawable abc_textfield_search_activated_mtrl_alpha 0x7f060052 -int drawable abc_textfield_search_default_mtrl_alpha 0x7f060053 -int drawable abc_textfield_search_material 0x7f060054 -int drawable abc_vector_test 0x7f060055 -int drawable btn_checkbox_checked_mtrl 0x7f060056 -int drawable btn_checkbox_checked_to_unchecked_mtrl_animation 0x7f060057 -int drawable btn_checkbox_unchecked_mtrl 0x7f060058 -int drawable btn_checkbox_unchecked_to_checked_mtrl_animation 0x7f060059 -int drawable btn_radio_off_mtrl 0x7f06005a -int drawable btn_radio_off_to_on_mtrl_animation 0x7f06005b -int drawable btn_radio_on_mtrl 0x7f06005c -int drawable btn_radio_on_to_off_mtrl_animation 0x7f06005d -int drawable notification_action_background 0x7f06005e -int drawable notification_bg 0x7f06005f -int drawable notification_bg_low 0x7f060060 -int drawable notification_bg_low_normal 0x7f060061 -int drawable notification_bg_low_pressed 0x7f060062 -int drawable notification_bg_normal 0x7f060063 -int drawable notification_bg_normal_pressed 0x7f060064 -int drawable notification_icon_background 0x7f060065 -int drawable notification_template_icon_bg 0x7f060066 -int drawable notification_template_icon_low_bg 0x7f060067 -int drawable notification_tile_bg 0x7f060068 -int drawable notify_panel_notification_icon_bg 0x7f060069 -int drawable redbox_top_border_background 0x7f06006a -int drawable tooltip_frame_dark 0x7f06006b -int drawable tooltip_frame_light 0x7f06006c -int id ALT 0x7f070000 -int id CTRL 0x7f070001 -int id FUNCTION 0x7f070002 -int id META 0x7f070003 -int id SHIFT 0x7f070004 -int id SYM 0x7f070005 -int id accessibility_action_clickable_span 0x7f070006 -int id accessibility_actions 0x7f070007 -int id accessibility_custom_action_0 0x7f070008 -int id accessibility_custom_action_1 0x7f070009 -int id accessibility_custom_action_10 0x7f07000a -int id accessibility_custom_action_11 0x7f07000b -int id accessibility_custom_action_12 0x7f07000c -int id accessibility_custom_action_13 0x7f07000d -int id accessibility_custom_action_14 0x7f07000e -int id accessibility_custom_action_15 0x7f07000f -int id accessibility_custom_action_16 0x7f070010 -int id accessibility_custom_action_17 0x7f070011 -int id accessibility_custom_action_18 0x7f070012 -int id accessibility_custom_action_19 0x7f070013 -int id accessibility_custom_action_2 0x7f070014 -int id accessibility_custom_action_20 0x7f070015 -int id accessibility_custom_action_21 0x7f070016 -int id accessibility_custom_action_22 0x7f070017 -int id accessibility_custom_action_23 0x7f070018 -int id accessibility_custom_action_24 0x7f070019 -int id accessibility_custom_action_25 0x7f07001a -int id accessibility_custom_action_26 0x7f07001b -int id accessibility_custom_action_27 0x7f07001c -int id accessibility_custom_action_28 0x7f07001d -int id accessibility_custom_action_29 0x7f07001e -int id accessibility_custom_action_3 0x7f07001f -int id accessibility_custom_action_30 0x7f070020 -int id accessibility_custom_action_31 0x7f070021 -int id accessibility_custom_action_4 0x7f070022 -int id accessibility_custom_action_5 0x7f070023 -int id accessibility_custom_action_6 0x7f070024 -int id accessibility_custom_action_7 0x7f070025 -int id accessibility_custom_action_8 0x7f070026 -int id accessibility_custom_action_9 0x7f070027 -int id accessibility_hint 0x7f070028 -int id accessibility_label 0x7f070029 -int id accessibility_role 0x7f07002a -int id accessibility_state 0x7f07002b -int id accessibility_value 0x7f07002c -int id action_bar 0x7f07002d -int id action_bar_activity_content 0x7f07002e -int id action_bar_container 0x7f07002f -int id action_bar_root 0x7f070030 -int id action_bar_spinner 0x7f070031 -int id action_bar_subtitle 0x7f070032 -int id action_bar_title 0x7f070033 -int id action_container 0x7f070034 -int id action_context_bar 0x7f070035 -int id action_divider 0x7f070036 -int id action_image 0x7f070037 -int id action_menu_divider 0x7f070038 -int id action_menu_presenter 0x7f070039 -int id action_mode_bar 0x7f07003a -int id action_mode_bar_stub 0x7f07003b -int id action_mode_close_button 0x7f07003c -int id action_text 0x7f07003d -int id actions 0x7f07003e -int id activity_chooser_view_content 0x7f07003f -int id add 0x7f070040 -int id alertTitle 0x7f070041 -int id always 0x7f070042 -int id async 0x7f070043 -int id beginning 0x7f070044 -int id blocking 0x7f070045 -int id bottom 0x7f070046 -int id buttonPanel 0x7f070047 -int id catalyst_redbox_title 0x7f070048 -int id center 0x7f070049 -int id centerCrop 0x7f07004a -int id centerInside 0x7f07004b -int id center_vertical 0x7f07004c -int id checkbox 0x7f07004d -int id checked 0x7f07004e -int id chronometer 0x7f07004f -int id collapseActionView 0x7f070050 -int id content 0x7f070051 -int id contentPanel 0x7f070052 -int id custom 0x7f070053 -int id customPanel 0x7f070054 -int id decor_content_parent 0x7f070055 -int id default_activity_button 0x7f070056 -int id dialog_button 0x7f070057 -int id disableHome 0x7f070058 -int id edit_query 0x7f070059 -int id end 0x7f07005a -int id expand_activities_button 0x7f07005b -int id expanded_menu 0x7f07005c -int id fitBottomStart 0x7f07005d -int id fitCenter 0x7f07005e -int id fitEnd 0x7f07005f -int id fitStart 0x7f070060 -int id fitXY 0x7f070061 -int id flipper_skip_empty_view_group_traversal 0x7f070062 -int id flipper_skip_view_traversal 0x7f070063 -int id focusCrop 0x7f070064 -int id forever 0x7f070065 -int id fps_text 0x7f070066 -int id group_divider 0x7f070067 -int id home 0x7f070068 -int id homeAsUp 0x7f070069 -int id icon 0x7f07006a -int id icon_group 0x7f07006b -int id ifRoom 0x7f07006c -int id image 0x7f07006d -int id info 0x7f07006e -int id italic 0x7f07006f -int id line1 0x7f070070 -int id line3 0x7f070071 -int id listMode 0x7f070072 -int id list_item 0x7f070073 -int id message 0x7f070074 -int id middle 0x7f070075 -int id multiply 0x7f070076 -int id never 0x7f070077 -int id none 0x7f070078 -int id normal 0x7f070079 -int id notification_background 0x7f07007a -int id notification_main_column 0x7f07007b -int id notification_main_column_container 0x7f07007c -int id off 0x7f07007d -int id on 0x7f07007e -int id parentPanel 0x7f07007f -int id progress_circular 0x7f070080 -int id progress_horizontal 0x7f070081 -int id radio 0x7f070082 -int id react_test_id 0x7f070083 -int id right_icon 0x7f070084 -int id right_side 0x7f070085 -int id rn_frame_file 0x7f070086 -int id rn_frame_method 0x7f070087 -int id rn_redbox_dismiss_button 0x7f070088 -int id rn_redbox_line_separator 0x7f070089 -int id rn_redbox_loading_indicator 0x7f07008a -int id rn_redbox_reload_button 0x7f07008b -int id rn_redbox_report_button 0x7f07008c -int id rn_redbox_report_label 0x7f07008d -int id rn_redbox_stack 0x7f07008e -int id screen 0x7f07008f -int id scrollIndicatorDown 0x7f070090 -int id scrollIndicatorUp 0x7f070091 -int id scrollView 0x7f070092 -int id search_badge 0x7f070093 -int id search_bar 0x7f070094 -int id search_button 0x7f070095 -int id search_close_btn 0x7f070096 -int id search_edit_frame 0x7f070097 -int id search_go_btn 0x7f070098 -int id search_mag_icon 0x7f070099 -int id search_plate 0x7f07009a -int id search_src_text 0x7f07009b -int id search_voice_btn 0x7f07009c -int id select_dialog_listview 0x7f07009d -int id shortcut 0x7f07009e -int id showCustom 0x7f07009f -int id showHome 0x7f0700a0 -int id showTitle 0x7f0700a1 -int id spacer 0x7f0700a2 -int id split_action_bar 0x7f0700a3 -int id src_atop 0x7f0700a4 -int id src_in 0x7f0700a5 -int id src_over 0x7f0700a6 -int id submenuarrow 0x7f0700a7 -int id submit_area 0x7f0700a8 -int id tabMode 0x7f0700a9 -int id tag_accessibility_actions 0x7f0700aa -int id tag_accessibility_clickable_spans 0x7f0700ab -int id tag_accessibility_heading 0x7f0700ac -int id tag_accessibility_pane_title 0x7f0700ad -int id tag_screen_reader_focusable 0x7f0700ae -int id tag_transition_group 0x7f0700af -int id tag_unhandled_key_event_manager 0x7f0700b0 -int id tag_unhandled_key_listeners 0x7f0700b1 -int id text 0x7f0700b2 -int id text2 0x7f0700b3 -int id textSpacerNoButtons 0x7f0700b4 -int id textSpacerNoTitle 0x7f0700b5 -int id time 0x7f0700b6 -int id title 0x7f0700b7 -int id titleDividerNoCustom 0x7f0700b8 -int id title_template 0x7f0700b9 -int id top 0x7f0700ba -int id topPanel 0x7f0700bb -int id unchecked 0x7f0700bc -int id uniform 0x7f0700bd -int id up 0x7f0700be -int id useLogo 0x7f0700bf -int id view_tag_instance_handle 0x7f0700c0 -int id view_tag_native_id 0x7f0700c1 -int id withText 0x7f0700c2 -int id wrap_content 0x7f0700c3 -int integer abc_config_activityDefaultDur 0x7f080000 -int integer abc_config_activityShortDur 0x7f080001 -int integer cancel_button_image_alpha 0x7f080002 -int integer config_tooltipAnimTime 0x7f080003 -int integer react_native_dev_server_port 0x7f080004 -int integer react_native_inspector_proxy_port 0x7f080005 -int integer status_bar_notification_info_maxnum 0x7f080006 -int interpolator btn_checkbox_checked_mtrl_animation_interpolator_0 0x7f090000 -int interpolator btn_checkbox_checked_mtrl_animation_interpolator_1 0x7f090001 -int interpolator btn_checkbox_unchecked_mtrl_animation_interpolator_0 0x7f090002 -int interpolator btn_checkbox_unchecked_mtrl_animation_interpolator_1 0x7f090003 -int interpolator btn_radio_to_off_mtrl_animation_interpolator_0 0x7f090004 -int interpolator btn_radio_to_on_mtrl_animation_interpolator_0 0x7f090005 -int interpolator fast_out_slow_in 0x7f090006 -int layout abc_action_bar_title_item 0x7f0a0000 -int layout abc_action_bar_up_container 0x7f0a0001 -int layout abc_action_menu_item_layout 0x7f0a0002 -int layout abc_action_menu_layout 0x7f0a0003 -int layout abc_action_mode_bar 0x7f0a0004 -int layout abc_action_mode_close_item_material 0x7f0a0005 -int layout abc_activity_chooser_view 0x7f0a0006 -int layout abc_activity_chooser_view_list_item 0x7f0a0007 -int layout abc_alert_dialog_button_bar_material 0x7f0a0008 -int layout abc_alert_dialog_material 0x7f0a0009 -int layout abc_alert_dialog_title_material 0x7f0a000a -int layout abc_cascading_menu_item_layout 0x7f0a000b -int layout abc_dialog_title_material 0x7f0a000c -int layout abc_expanded_menu_layout 0x7f0a000d -int layout abc_list_menu_item_checkbox 0x7f0a000e -int layout abc_list_menu_item_icon 0x7f0a000f -int layout abc_list_menu_item_layout 0x7f0a0010 -int layout abc_list_menu_item_radio 0x7f0a0011 -int layout abc_popup_menu_header_item_layout 0x7f0a0012 -int layout abc_popup_menu_item_layout 0x7f0a0013 -int layout abc_screen_content_include 0x7f0a0014 -int layout abc_screen_simple 0x7f0a0015 -int layout abc_screen_simple_overlay_action_mode 0x7f0a0016 -int layout abc_screen_toolbar 0x7f0a0017 -int layout abc_search_dropdown_item_icons_2line 0x7f0a0018 -int layout abc_search_view 0x7f0a0019 -int layout abc_select_dialog_material 0x7f0a001a -int layout abc_tooltip 0x7f0a001b -int layout custom_dialog 0x7f0a001c -int layout dev_loading_view 0x7f0a001d -int layout fps_view 0x7f0a001e -int layout notification_action 0x7f0a001f -int layout notification_action_tombstone 0x7f0a0020 -int layout notification_template_custom_big 0x7f0a0021 -int layout notification_template_icon_group 0x7f0a0022 -int layout notification_template_part_chronometer 0x7f0a0023 -int layout notification_template_part_time 0x7f0a0024 -int layout redbox_item_frame 0x7f0a0025 -int layout redbox_item_title 0x7f0a0026 -int layout redbox_view 0x7f0a0027 -int layout select_dialog_item_material 0x7f0a0028 -int layout select_dialog_multichoice_material 0x7f0a0029 -int layout select_dialog_singlechoice_material 0x7f0a002a -int layout support_simple_spinner_dropdown_item 0x7f0a002b -int mipmap ic_launcher 0x7f0b0000 -int mipmap ic_launcher_round 0x7f0b0001 -int string abc_action_bar_home_description 0x7f0c0000 -int string abc_action_bar_up_description 0x7f0c0001 -int string abc_action_menu_overflow_description 0x7f0c0002 -int string abc_action_mode_done 0x7f0c0003 -int string abc_activity_chooser_view_see_all 0x7f0c0004 -int string abc_activitychooserview_choose_application 0x7f0c0005 -int string abc_capital_off 0x7f0c0006 -int string abc_capital_on 0x7f0c0007 -int string abc_menu_alt_shortcut_label 0x7f0c0008 -int string abc_menu_ctrl_shortcut_label 0x7f0c0009 -int string abc_menu_delete_shortcut_label 0x7f0c000a -int string abc_menu_enter_shortcut_label 0x7f0c000b -int string abc_menu_function_shortcut_label 0x7f0c000c -int string abc_menu_meta_shortcut_label 0x7f0c000d -int string abc_menu_shift_shortcut_label 0x7f0c000e -int string abc_menu_space_shortcut_label 0x7f0c000f -int string abc_menu_sym_shortcut_label 0x7f0c0010 -int string abc_prepend_shortcut_label 0x7f0c0011 -int string abc_search_hint 0x7f0c0012 -int string abc_searchview_description_clear 0x7f0c0013 -int string abc_searchview_description_query 0x7f0c0014 -int string abc_searchview_description_search 0x7f0c0015 -int string abc_searchview_description_submit 0x7f0c0016 -int string abc_searchview_description_voice 0x7f0c0017 -int string abc_shareactionprovider_share_with 0x7f0c0018 -int string abc_shareactionprovider_share_with_application 0x7f0c0019 -int string abc_toolbar_collapse_description 0x7f0c001a -int string alert_description 0x7f0c001b -int string app_name 0x7f0c001c -int string button_description 0x7f0c001d -int string catalyst_change_bundle_location 0x7f0c001e -int string catalyst_copy_button 0x7f0c001f -int string catalyst_debug 0x7f0c0020 -int string catalyst_debug_chrome 0x7f0c0021 -int string catalyst_debug_chrome_stop 0x7f0c0022 -int string catalyst_debug_connecting 0x7f0c0023 -int string catalyst_debug_error 0x7f0c0024 -int string catalyst_debug_open 0x7f0c0025 -int string catalyst_debug_stop 0x7f0c0026 -int string catalyst_devtools_open 0x7f0c0027 -int string catalyst_dismiss_button 0x7f0c0028 -int string catalyst_heap_capture 0x7f0c0029 -int string catalyst_hot_reloading 0x7f0c002a -int string catalyst_hot_reloading_auto_disable 0x7f0c002b -int string catalyst_hot_reloading_auto_enable 0x7f0c002c -int string catalyst_hot_reloading_stop 0x7f0c002d -int string catalyst_inspector 0x7f0c002e -int string catalyst_loading_from_url 0x7f0c002f -int string catalyst_open_flipper_error 0x7f0c0030 -int string catalyst_perf_monitor 0x7f0c0031 -int string catalyst_perf_monitor_stop 0x7f0c0032 -int string catalyst_reload 0x7f0c0033 -int string catalyst_reload_button 0x7f0c0034 -int string catalyst_reload_error 0x7f0c0035 -int string catalyst_report_button 0x7f0c0036 -int string catalyst_sample_profiler_disable 0x7f0c0037 -int string catalyst_sample_profiler_enable 0x7f0c0038 -int string catalyst_settings 0x7f0c0039 -int string catalyst_settings_title 0x7f0c003a -int string combobox_description 0x7f0c003b -int string header_description 0x7f0c003c -int string image_description 0x7f0c003d -int string imagebutton_description 0x7f0c003e -int string link_description 0x7f0c003f -int string menu_description 0x7f0c0040 -int string menubar_description 0x7f0c0041 -int string menuitem_description 0x7f0c0042 -int string progressbar_description 0x7f0c0043 -int string radiogroup_description 0x7f0c0044 -int string rn_tab_description 0x7f0c0045 -int string scrollbar_description 0x7f0c0046 -int string search_description 0x7f0c0047 -int string search_menu_title 0x7f0c0048 -int string spinbutton_description 0x7f0c0049 -int string state_busy_description 0x7f0c004a -int string state_collapsed_description 0x7f0c004b -int string state_expanded_description 0x7f0c004c -int string state_mixed_description 0x7f0c004d -int string state_off_description 0x7f0c004e -int string state_on_description 0x7f0c004f -int string status_bar_notification_info_overflow 0x7f0c0050 -int string summary_description 0x7f0c0051 -int string tablist_description 0x7f0c0052 -int string timer_description 0x7f0c0053 -int string toolbar_description 0x7f0c0054 -int style AlertDialog_AppCompat 0x7f0d0000 -int style AlertDialog_AppCompat_Light 0x7f0d0001 -int style Animation_AppCompat_Dialog 0x7f0d0002 -int style Animation_AppCompat_DropDownUp 0x7f0d0003 -int style Animation_AppCompat_Tooltip 0x7f0d0004 -int style Animation_Catalyst_LogBox 0x7f0d0005 -int style Animation_Catalyst_RedBox 0x7f0d0006 -int style AppTheme 0x7f0d0007 -int style Base_AlertDialog_AppCompat 0x7f0d0008 -int style Base_AlertDialog_AppCompat_Light 0x7f0d0009 -int style Base_Animation_AppCompat_Dialog 0x7f0d000a -int style Base_Animation_AppCompat_DropDownUp 0x7f0d000b -int style Base_Animation_AppCompat_Tooltip 0x7f0d000c -int style Base_DialogWindowTitle_AppCompat 0x7f0d000d -int style Base_DialogWindowTitleBackground_AppCompat 0x7f0d000e -int style Base_TextAppearance_AppCompat 0x7f0d000f -int style Base_TextAppearance_AppCompat_Body1 0x7f0d0010 -int style Base_TextAppearance_AppCompat_Body2 0x7f0d0011 -int style Base_TextAppearance_AppCompat_Button 0x7f0d0012 -int style Base_TextAppearance_AppCompat_Caption 0x7f0d0013 -int style Base_TextAppearance_AppCompat_Display1 0x7f0d0014 -int style Base_TextAppearance_AppCompat_Display2 0x7f0d0015 -int style Base_TextAppearance_AppCompat_Display3 0x7f0d0016 -int style Base_TextAppearance_AppCompat_Display4 0x7f0d0017 -int style Base_TextAppearance_AppCompat_Headline 0x7f0d0018 -int style Base_TextAppearance_AppCompat_Inverse 0x7f0d0019 -int style Base_TextAppearance_AppCompat_Large 0x7f0d001a -int style Base_TextAppearance_AppCompat_Large_Inverse 0x7f0d001b -int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x7f0d001c -int style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x7f0d001d -int style Base_TextAppearance_AppCompat_Medium 0x7f0d001e -int style Base_TextAppearance_AppCompat_Medium_Inverse 0x7f0d001f -int style Base_TextAppearance_AppCompat_Menu 0x7f0d0020 -int style Base_TextAppearance_AppCompat_SearchResult 0x7f0d0021 -int style Base_TextAppearance_AppCompat_SearchResult_Subtitle 0x7f0d0022 -int style Base_TextAppearance_AppCompat_SearchResult_Title 0x7f0d0023 -int style Base_TextAppearance_AppCompat_Small 0x7f0d0024 -int style Base_TextAppearance_AppCompat_Small_Inverse 0x7f0d0025 -int style Base_TextAppearance_AppCompat_Subhead 0x7f0d0026 -int style Base_TextAppearance_AppCompat_Subhead_Inverse 0x7f0d0027 -int style Base_TextAppearance_AppCompat_Title 0x7f0d0028 -int style Base_TextAppearance_AppCompat_Title_Inverse 0x7f0d0029 -int style Base_TextAppearance_AppCompat_Tooltip 0x7f0d002a -int style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu 0x7f0d002b -int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x7f0d002c -int style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x7f0d002d -int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title 0x7f0d002e -int style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x7f0d002f -int style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x7f0d0030 -int style Base_TextAppearance_AppCompat_Widget_ActionMode_Title 0x7f0d0031 -int style Base_TextAppearance_AppCompat_Widget_Button 0x7f0d0032 -int style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x7f0d0033 -int style Base_TextAppearance_AppCompat_Widget_Button_Colored 0x7f0d0034 -int style Base_TextAppearance_AppCompat_Widget_Button_Inverse 0x7f0d0035 -int style Base_TextAppearance_AppCompat_Widget_DropDownItem 0x7f0d0036 -int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header 0x7f0d0037 -int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large 0x7f0d0038 -int style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small 0x7f0d0039 -int style Base_TextAppearance_AppCompat_Widget_Switch 0x7f0d003a -int style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x7f0d003b -int style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x7f0d003c -int style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x7f0d003d -int style Base_TextAppearance_Widget_AppCompat_Toolbar_Title 0x7f0d003e -int style Base_Theme_AppCompat 0x7f0d003f -int style Base_Theme_AppCompat_CompactMenu 0x7f0d0040 -int style Base_Theme_AppCompat_Dialog 0x7f0d0041 -int style Base_Theme_AppCompat_Dialog_Alert 0x7f0d0042 -int style Base_Theme_AppCompat_Dialog_FixedSize 0x7f0d0043 -int style Base_Theme_AppCompat_Dialog_MinWidth 0x7f0d0044 -int style Base_Theme_AppCompat_DialogWhenLarge 0x7f0d0045 -int style Base_Theme_AppCompat_Light 0x7f0d0046 -int style Base_Theme_AppCompat_Light_DarkActionBar 0x7f0d0047 -int style Base_Theme_AppCompat_Light_Dialog 0x7f0d0048 -int style Base_Theme_AppCompat_Light_Dialog_Alert 0x7f0d0049 -int style Base_Theme_AppCompat_Light_Dialog_FixedSize 0x7f0d004a -int style Base_Theme_AppCompat_Light_Dialog_MinWidth 0x7f0d004b -int style Base_Theme_AppCompat_Light_DialogWhenLarge 0x7f0d004c -int style Base_ThemeOverlay_AppCompat 0x7f0d004d -int style Base_ThemeOverlay_AppCompat_ActionBar 0x7f0d004e -int style Base_ThemeOverlay_AppCompat_Dark 0x7f0d004f -int style Base_ThemeOverlay_AppCompat_Dark_ActionBar 0x7f0d0050 -int style Base_ThemeOverlay_AppCompat_Dialog 0x7f0d0051 -int style Base_ThemeOverlay_AppCompat_Dialog_Alert 0x7f0d0052 -int style Base_ThemeOverlay_AppCompat_Light 0x7f0d0053 -int style Base_V21_Theme_AppCompat 0x7f0d0054 -int style Base_V21_Theme_AppCompat_Dialog 0x7f0d0055 -int style Base_V21_Theme_AppCompat_Light 0x7f0d0056 -int style Base_V21_Theme_AppCompat_Light_Dialog 0x7f0d0057 -int style Base_V21_ThemeOverlay_AppCompat_Dialog 0x7f0d0058 -int style Base_V22_Theme_AppCompat 0x7f0d0059 -int style Base_V22_Theme_AppCompat_Light 0x7f0d005a -int style Base_V23_Theme_AppCompat 0x7f0d005b -int style Base_V23_Theme_AppCompat_Light 0x7f0d005c -int style Base_V26_Theme_AppCompat 0x7f0d005d -int style Base_V26_Theme_AppCompat_Light 0x7f0d005e -int style Base_V26_Widget_AppCompat_Toolbar 0x7f0d005f -int style Base_V28_Theme_AppCompat 0x7f0d0060 -int style Base_V28_Theme_AppCompat_Light 0x7f0d0061 -int style Base_V7_Theme_AppCompat 0x7f0d0062 -int style Base_V7_Theme_AppCompat_Dialog 0x7f0d0063 -int style Base_V7_Theme_AppCompat_Light 0x7f0d0064 -int style Base_V7_Theme_AppCompat_Light_Dialog 0x7f0d0065 -int style Base_V7_ThemeOverlay_AppCompat_Dialog 0x7f0d0066 -int style Base_V7_Widget_AppCompat_AutoCompleteTextView 0x7f0d0067 -int style Base_V7_Widget_AppCompat_EditText 0x7f0d0068 -int style Base_V7_Widget_AppCompat_Toolbar 0x7f0d0069 -int style Base_Widget_AppCompat_ActionBar 0x7f0d006a -int style Base_Widget_AppCompat_ActionBar_Solid 0x7f0d006b -int style Base_Widget_AppCompat_ActionBar_TabBar 0x7f0d006c -int style Base_Widget_AppCompat_ActionBar_TabText 0x7f0d006d -int style Base_Widget_AppCompat_ActionBar_TabView 0x7f0d006e -int style Base_Widget_AppCompat_ActionButton 0x7f0d006f -int style Base_Widget_AppCompat_ActionButton_CloseMode 0x7f0d0070 -int style Base_Widget_AppCompat_ActionButton_Overflow 0x7f0d0071 -int style Base_Widget_AppCompat_ActionMode 0x7f0d0072 -int style Base_Widget_AppCompat_ActivityChooserView 0x7f0d0073 -int style Base_Widget_AppCompat_AutoCompleteTextView 0x7f0d0074 -int style Base_Widget_AppCompat_Button 0x7f0d0075 -int style Base_Widget_AppCompat_Button_Borderless 0x7f0d0076 -int style Base_Widget_AppCompat_Button_Borderless_Colored 0x7f0d0077 -int style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog 0x7f0d0078 -int style Base_Widget_AppCompat_Button_Colored 0x7f0d0079 -int style Base_Widget_AppCompat_Button_Small 0x7f0d007a -int style Base_Widget_AppCompat_ButtonBar 0x7f0d007b -int style Base_Widget_AppCompat_ButtonBar_AlertDialog 0x7f0d007c -int style Base_Widget_AppCompat_CompoundButton_CheckBox 0x7f0d007d -int style Base_Widget_AppCompat_CompoundButton_RadioButton 0x7f0d007e -int style Base_Widget_AppCompat_CompoundButton_Switch 0x7f0d007f -int style Base_Widget_AppCompat_DrawerArrowToggle 0x7f0d0080 -int style Base_Widget_AppCompat_DrawerArrowToggle_Common 0x7f0d0081 -int style Base_Widget_AppCompat_DropDownItem_Spinner 0x7f0d0082 -int style Base_Widget_AppCompat_EditText 0x7f0d0083 -int style Base_Widget_AppCompat_ImageButton 0x7f0d0084 -int style Base_Widget_AppCompat_Light_ActionBar 0x7f0d0085 -int style Base_Widget_AppCompat_Light_ActionBar_Solid 0x7f0d0086 -int style Base_Widget_AppCompat_Light_ActionBar_TabBar 0x7f0d0087 -int style Base_Widget_AppCompat_Light_ActionBar_TabText 0x7f0d0088 -int style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x7f0d0089 -int style Base_Widget_AppCompat_Light_ActionBar_TabView 0x7f0d008a -int style Base_Widget_AppCompat_Light_PopupMenu 0x7f0d008b -int style Base_Widget_AppCompat_Light_PopupMenu_Overflow 0x7f0d008c -int style Base_Widget_AppCompat_ListMenuView 0x7f0d008d -int style Base_Widget_AppCompat_ListPopupWindow 0x7f0d008e -int style Base_Widget_AppCompat_ListView 0x7f0d008f -int style Base_Widget_AppCompat_ListView_DropDown 0x7f0d0090 -int style Base_Widget_AppCompat_ListView_Menu 0x7f0d0091 -int style Base_Widget_AppCompat_PopupMenu 0x7f0d0092 -int style Base_Widget_AppCompat_PopupMenu_Overflow 0x7f0d0093 -int style Base_Widget_AppCompat_PopupWindow 0x7f0d0094 -int style Base_Widget_AppCompat_ProgressBar 0x7f0d0095 -int style Base_Widget_AppCompat_ProgressBar_Horizontal 0x7f0d0096 -int style Base_Widget_AppCompat_RatingBar 0x7f0d0097 -int style Base_Widget_AppCompat_RatingBar_Indicator 0x7f0d0098 -int style Base_Widget_AppCompat_RatingBar_Small 0x7f0d0099 -int style Base_Widget_AppCompat_SearchView 0x7f0d009a -int style Base_Widget_AppCompat_SearchView_ActionBar 0x7f0d009b -int style Base_Widget_AppCompat_SeekBar 0x7f0d009c -int style Base_Widget_AppCompat_SeekBar_Discrete 0x7f0d009d -int style Base_Widget_AppCompat_Spinner 0x7f0d009e -int style Base_Widget_AppCompat_Spinner_Underlined 0x7f0d009f -int style Base_Widget_AppCompat_TextView 0x7f0d00a0 -int style Base_Widget_AppCompat_TextView_SpinnerItem 0x7f0d00a1 -int style Base_Widget_AppCompat_Toolbar 0x7f0d00a2 -int style Base_Widget_AppCompat_Toolbar_Button_Navigation 0x7f0d00a3 -int style CalendarDatePickerDialog 0x7f0d00a4 -int style CalendarDatePickerStyle 0x7f0d00a5 -int style DialogAnimationFade 0x7f0d00a6 -int style DialogAnimationSlide 0x7f0d00a7 -int style Platform_AppCompat 0x7f0d00a8 -int style Platform_AppCompat_Light 0x7f0d00a9 -int style Platform_ThemeOverlay_AppCompat 0x7f0d00aa -int style Platform_ThemeOverlay_AppCompat_Dark 0x7f0d00ab -int style Platform_ThemeOverlay_AppCompat_Light 0x7f0d00ac -int style Platform_V21_AppCompat 0x7f0d00ad -int style Platform_V21_AppCompat_Light 0x7f0d00ae -int style Platform_V25_AppCompat 0x7f0d00af -int style Platform_V25_AppCompat_Light 0x7f0d00b0 -int style Platform_Widget_AppCompat_Spinner 0x7f0d00b1 -int style RtlOverlay_DialogWindowTitle_AppCompat 0x7f0d00b2 -int style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem 0x7f0d00b3 -int style RtlOverlay_Widget_AppCompat_DialogTitle_Icon 0x7f0d00b4 -int style RtlOverlay_Widget_AppCompat_PopupMenuItem 0x7f0d00b5 -int style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup 0x7f0d00b6 -int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut 0x7f0d00b7 -int style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow 0x7f0d00b8 -int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text 0x7f0d00b9 -int style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title 0x7f0d00ba -int style RtlOverlay_Widget_AppCompat_Search_DropDown 0x7f0d00bb -int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 0x7f0d00bc -int style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 0x7f0d00bd -int style RtlOverlay_Widget_AppCompat_Search_DropDown_Query 0x7f0d00be -int style RtlOverlay_Widget_AppCompat_Search_DropDown_Text 0x7f0d00bf -int style RtlOverlay_Widget_AppCompat_SearchView_MagIcon 0x7f0d00c0 -int style RtlUnderlay_Widget_AppCompat_ActionButton 0x7f0d00c1 -int style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow 0x7f0d00c2 -int style SpinnerDatePickerDialog 0x7f0d00c3 -int style SpinnerDatePickerStyle 0x7f0d00c4 -int style TextAppearance_AppCompat 0x7f0d00c5 -int style TextAppearance_AppCompat_Body1 0x7f0d00c6 -int style TextAppearance_AppCompat_Body2 0x7f0d00c7 -int style TextAppearance_AppCompat_Button 0x7f0d00c8 -int style TextAppearance_AppCompat_Caption 0x7f0d00c9 -int style TextAppearance_AppCompat_Display1 0x7f0d00ca -int style TextAppearance_AppCompat_Display2 0x7f0d00cb -int style TextAppearance_AppCompat_Display3 0x7f0d00cc -int style TextAppearance_AppCompat_Display4 0x7f0d00cd -int style TextAppearance_AppCompat_Headline 0x7f0d00ce -int style TextAppearance_AppCompat_Inverse 0x7f0d00cf -int style TextAppearance_AppCompat_Large 0x7f0d00d0 -int style TextAppearance_AppCompat_Large_Inverse 0x7f0d00d1 -int style TextAppearance_AppCompat_Light_SearchResult_Subtitle 0x7f0d00d2 -int style TextAppearance_AppCompat_Light_SearchResult_Title 0x7f0d00d3 -int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large 0x7f0d00d4 -int style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small 0x7f0d00d5 -int style TextAppearance_AppCompat_Medium 0x7f0d00d6 -int style TextAppearance_AppCompat_Medium_Inverse 0x7f0d00d7 -int style TextAppearance_AppCompat_Menu 0x7f0d00d8 -int style TextAppearance_AppCompat_SearchResult_Subtitle 0x7f0d00d9 -int style TextAppearance_AppCompat_SearchResult_Title 0x7f0d00da -int style TextAppearance_AppCompat_Small 0x7f0d00db -int style TextAppearance_AppCompat_Small_Inverse 0x7f0d00dc -int style TextAppearance_AppCompat_Subhead 0x7f0d00dd -int style TextAppearance_AppCompat_Subhead_Inverse 0x7f0d00de -int style TextAppearance_AppCompat_Title 0x7f0d00df -int style TextAppearance_AppCompat_Title_Inverse 0x7f0d00e0 -int style TextAppearance_AppCompat_Tooltip 0x7f0d00e1 -int style TextAppearance_AppCompat_Widget_ActionBar_Menu 0x7f0d00e2 -int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle 0x7f0d00e3 -int style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse 0x7f0d00e4 -int style TextAppearance_AppCompat_Widget_ActionBar_Title 0x7f0d00e5 -int style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse 0x7f0d00e6 -int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle 0x7f0d00e7 -int style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse 0x7f0d00e8 -int style TextAppearance_AppCompat_Widget_ActionMode_Title 0x7f0d00e9 -int style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse 0x7f0d00ea -int style TextAppearance_AppCompat_Widget_Button 0x7f0d00eb -int style TextAppearance_AppCompat_Widget_Button_Borderless_Colored 0x7f0d00ec -int style TextAppearance_AppCompat_Widget_Button_Colored 0x7f0d00ed -int style TextAppearance_AppCompat_Widget_Button_Inverse 0x7f0d00ee -int style TextAppearance_AppCompat_Widget_DropDownItem 0x7f0d00ef -int style TextAppearance_AppCompat_Widget_PopupMenu_Header 0x7f0d00f0 -int style TextAppearance_AppCompat_Widget_PopupMenu_Large 0x7f0d00f1 -int style TextAppearance_AppCompat_Widget_PopupMenu_Small 0x7f0d00f2 -int style TextAppearance_AppCompat_Widget_Switch 0x7f0d00f3 -int style TextAppearance_AppCompat_Widget_TextView_SpinnerItem 0x7f0d00f4 -int style TextAppearance_Compat_Notification 0x7f0d00f5 -int style TextAppearance_Compat_Notification_Info 0x7f0d00f6 -int style TextAppearance_Compat_Notification_Line2 0x7f0d00f7 -int style TextAppearance_Compat_Notification_Time 0x7f0d00f8 -int style TextAppearance_Compat_Notification_Title 0x7f0d00f9 -int style TextAppearance_Widget_AppCompat_ExpandedMenu_Item 0x7f0d00fa -int style TextAppearance_Widget_AppCompat_Toolbar_Subtitle 0x7f0d00fb -int style TextAppearance_Widget_AppCompat_Toolbar_Title 0x7f0d00fc -int style Theme 0x7f0d00fd -int style Theme_AppCompat 0x7f0d00fe -int style Theme_AppCompat_CompactMenu 0x7f0d00ff -int style Theme_AppCompat_DayNight 0x7f0d0100 -int style Theme_AppCompat_DayNight_DarkActionBar 0x7f0d0101 -int style Theme_AppCompat_DayNight_Dialog 0x7f0d0102 -int style Theme_AppCompat_DayNight_Dialog_Alert 0x7f0d0103 -int style Theme_AppCompat_DayNight_Dialog_MinWidth 0x7f0d0104 -int style Theme_AppCompat_DayNight_DialogWhenLarge 0x7f0d0105 -int style Theme_AppCompat_DayNight_NoActionBar 0x7f0d0106 -int style Theme_AppCompat_Dialog 0x7f0d0107 -int style Theme_AppCompat_Dialog_Alert 0x7f0d0108 -int style Theme_AppCompat_Dialog_MinWidth 0x7f0d0109 -int style Theme_AppCompat_DialogWhenLarge 0x7f0d010a -int style Theme_AppCompat_Light 0x7f0d010b -int style Theme_AppCompat_Light_DarkActionBar 0x7f0d010c -int style Theme_AppCompat_Light_Dialog 0x7f0d010d -int style Theme_AppCompat_Light_Dialog_Alert 0x7f0d010e -int style Theme_AppCompat_Light_Dialog_MinWidth 0x7f0d010f -int style Theme_AppCompat_Light_DialogWhenLarge 0x7f0d0110 -int style Theme_AppCompat_Light_NoActionBar 0x7f0d0111 -int style Theme_AppCompat_NoActionBar 0x7f0d0112 -int style Theme_Catalyst 0x7f0d0113 -int style Theme_Catalyst_LogBox 0x7f0d0114 -int style Theme_Catalyst_RedBox 0x7f0d0115 -int style Theme_FullScreenDialog 0x7f0d0116 -int style Theme_FullScreenDialogAnimatedFade 0x7f0d0117 -int style Theme_FullScreenDialogAnimatedSlide 0x7f0d0118 -int style Theme_ReactNative_AppCompat_Light 0x7f0d0119 -int style Theme_ReactNative_AppCompat_Light_NoActionBar_FullScreen 0x7f0d011a -int style ThemeOverlay_AppCompat 0x7f0d011b -int style ThemeOverlay_AppCompat_ActionBar 0x7f0d011c -int style ThemeOverlay_AppCompat_Dark 0x7f0d011d -int style ThemeOverlay_AppCompat_Dark_ActionBar 0x7f0d011e -int style ThemeOverlay_AppCompat_DayNight 0x7f0d011f -int style ThemeOverlay_AppCompat_DayNight_ActionBar 0x7f0d0120 -int style ThemeOverlay_AppCompat_Dialog 0x7f0d0121 -int style ThemeOverlay_AppCompat_Dialog_Alert 0x7f0d0122 -int style ThemeOverlay_AppCompat_Light 0x7f0d0123 -int style Widget_AppCompat_ActionBar 0x7f0d0124 -int style Widget_AppCompat_ActionBar_Solid 0x7f0d0125 -int style Widget_AppCompat_ActionBar_TabBar 0x7f0d0126 -int style Widget_AppCompat_ActionBar_TabText 0x7f0d0127 -int style Widget_AppCompat_ActionBar_TabView 0x7f0d0128 -int style Widget_AppCompat_ActionButton 0x7f0d0129 -int style Widget_AppCompat_ActionButton_CloseMode 0x7f0d012a -int style Widget_AppCompat_ActionButton_Overflow 0x7f0d012b -int style Widget_AppCompat_ActionMode 0x7f0d012c -int style Widget_AppCompat_ActivityChooserView 0x7f0d012d -int style Widget_AppCompat_AutoCompleteTextView 0x7f0d012e -int style Widget_AppCompat_Button 0x7f0d012f -int style Widget_AppCompat_Button_Borderless 0x7f0d0130 -int style Widget_AppCompat_Button_Borderless_Colored 0x7f0d0131 -int style Widget_AppCompat_Button_ButtonBar_AlertDialog 0x7f0d0132 -int style Widget_AppCompat_Button_Colored 0x7f0d0133 -int style Widget_AppCompat_Button_Small 0x7f0d0134 -int style Widget_AppCompat_ButtonBar 0x7f0d0135 -int style Widget_AppCompat_ButtonBar_AlertDialog 0x7f0d0136 -int style Widget_AppCompat_CompoundButton_CheckBox 0x7f0d0137 -int style Widget_AppCompat_CompoundButton_RadioButton 0x7f0d0138 -int style Widget_AppCompat_CompoundButton_Switch 0x7f0d0139 -int style Widget_AppCompat_DrawerArrowToggle 0x7f0d013a -int style Widget_AppCompat_DropDownItem_Spinner 0x7f0d013b -int style Widget_AppCompat_EditText 0x7f0d013c -int style Widget_AppCompat_ImageButton 0x7f0d013d -int style Widget_AppCompat_Light_ActionBar 0x7f0d013e -int style Widget_AppCompat_Light_ActionBar_Solid 0x7f0d013f -int style Widget_AppCompat_Light_ActionBar_Solid_Inverse 0x7f0d0140 -int style Widget_AppCompat_Light_ActionBar_TabBar 0x7f0d0141 -int style Widget_AppCompat_Light_ActionBar_TabBar_Inverse 0x7f0d0142 -int style Widget_AppCompat_Light_ActionBar_TabText 0x7f0d0143 -int style Widget_AppCompat_Light_ActionBar_TabText_Inverse 0x7f0d0144 -int style Widget_AppCompat_Light_ActionBar_TabView 0x7f0d0145 -int style Widget_AppCompat_Light_ActionBar_TabView_Inverse 0x7f0d0146 -int style Widget_AppCompat_Light_ActionButton 0x7f0d0147 -int style Widget_AppCompat_Light_ActionButton_CloseMode 0x7f0d0148 -int style Widget_AppCompat_Light_ActionButton_Overflow 0x7f0d0149 -int style Widget_AppCompat_Light_ActionMode_Inverse 0x7f0d014a -int style Widget_AppCompat_Light_ActivityChooserView 0x7f0d014b -int style Widget_AppCompat_Light_AutoCompleteTextView 0x7f0d014c -int style Widget_AppCompat_Light_DropDownItem_Spinner 0x7f0d014d -int style Widget_AppCompat_Light_ListPopupWindow 0x7f0d014e -int style Widget_AppCompat_Light_ListView_DropDown 0x7f0d014f -int style Widget_AppCompat_Light_PopupMenu 0x7f0d0150 -int style Widget_AppCompat_Light_PopupMenu_Overflow 0x7f0d0151 -int style Widget_AppCompat_Light_SearchView 0x7f0d0152 -int style Widget_AppCompat_Light_Spinner_DropDown_ActionBar 0x7f0d0153 -int style Widget_AppCompat_ListMenuView 0x7f0d0154 -int style Widget_AppCompat_ListPopupWindow 0x7f0d0155 -int style Widget_AppCompat_ListView 0x7f0d0156 -int style Widget_AppCompat_ListView_DropDown 0x7f0d0157 -int style Widget_AppCompat_ListView_Menu 0x7f0d0158 -int style Widget_AppCompat_PopupMenu 0x7f0d0159 -int style Widget_AppCompat_PopupMenu_Overflow 0x7f0d015a -int style Widget_AppCompat_PopupWindow 0x7f0d015b -int style Widget_AppCompat_ProgressBar 0x7f0d015c -int style Widget_AppCompat_ProgressBar_Horizontal 0x7f0d015d -int style Widget_AppCompat_RatingBar 0x7f0d015e -int style Widget_AppCompat_RatingBar_Indicator 0x7f0d015f -int style Widget_AppCompat_RatingBar_Small 0x7f0d0160 -int style Widget_AppCompat_SearchView 0x7f0d0161 -int style Widget_AppCompat_SearchView_ActionBar 0x7f0d0162 -int style Widget_AppCompat_SeekBar 0x7f0d0163 -int style Widget_AppCompat_SeekBar_Discrete 0x7f0d0164 -int style Widget_AppCompat_Spinner 0x7f0d0165 -int style Widget_AppCompat_Spinner_DropDown 0x7f0d0166 -int style Widget_AppCompat_Spinner_DropDown_ActionBar 0x7f0d0167 -int style Widget_AppCompat_Spinner_Underlined 0x7f0d0168 -int style Widget_AppCompat_TextView 0x7f0d0169 -int style Widget_AppCompat_TextView_SpinnerItem 0x7f0d016a -int style Widget_AppCompat_Toolbar 0x7f0d016b -int style Widget_AppCompat_Toolbar_Button_Navigation 0x7f0d016c -int style Widget_Compat_NotificationActionContainer 0x7f0d016d -int style Widget_Compat_NotificationActionText 0x7f0d016e -int style redboxButton 0x7f0d016f -int[] styleable ActionBar { 0x7f020034, 0x7f020036, 0x7f020037, 0x7f02005c, 0x7f02005d, 0x7f02005e, 0x7f02005f, 0x7f020060, 0x7f020061, 0x7f020063, 0x7f020068, 0x7f020069, 0x7f02007c, 0x7f02008f, 0x7f020090, 0x7f020091, 0x7f020092, 0x7f020093, 0x7f020098, 0x7f02009b, 0x7f0200ae, 0x7f0200b6, 0x7f0200c4, 0x7f0200cb, 0x7f0200cc, 0x7f0200f6, 0x7f0200f9, 0x7f020115, 0x7f02011e } -int styleable ActionBar_background 0 -int styleable ActionBar_backgroundSplit 1 -int styleable ActionBar_backgroundStacked 2 -int styleable ActionBar_contentInsetEnd 3 -int styleable ActionBar_contentInsetEndWithActions 4 -int styleable ActionBar_contentInsetLeft 5 -int styleable ActionBar_contentInsetRight 6 -int styleable ActionBar_contentInsetStart 7 -int styleable ActionBar_contentInsetStartWithNavigation 8 -int styleable ActionBar_customNavigationLayout 9 -int styleable ActionBar_displayOptions 10 -int styleable ActionBar_divider 11 -int styleable ActionBar_elevation 12 -int styleable ActionBar_height 13 -int styleable ActionBar_hideOnContentScroll 14 -int styleable ActionBar_homeAsUpIndicator 15 -int styleable ActionBar_homeLayout 16 -int styleable ActionBar_icon 17 -int styleable ActionBar_indeterminateProgressStyle 18 -int styleable ActionBar_itemPadding 19 -int styleable ActionBar_logo 20 -int styleable ActionBar_navigationMode 21 -int styleable ActionBar_popupTheme 22 -int styleable ActionBar_progressBarPadding 23 -int styleable ActionBar_progressBarStyle 24 -int styleable ActionBar_subtitle 25 -int styleable ActionBar_subtitleTextStyle 26 -int styleable ActionBar_title 27 -int styleable ActionBar_titleTextStyle 28 -int[] styleable ActionBarLayout { 0x010100b3 } -int styleable ActionBarLayout_android_layout_gravity 0 -int[] styleable ActionMenuItemView { 0x0101013f } -int styleable ActionMenuItemView_android_minWidth 0 -int[] styleable ActionMenuView { } -int[] styleable ActionMode { 0x7f020034, 0x7f020036, 0x7f02004c, 0x7f02008f, 0x7f0200f9, 0x7f02011e } -int styleable ActionMode_background 0 -int styleable ActionMode_backgroundSplit 1 -int styleable ActionMode_closeItemLayout 2 -int styleable ActionMode_height 3 -int styleable ActionMode_subtitleTextStyle 4 -int styleable ActionMode_titleTextStyle 5 -int[] styleable ActivityChooserView { 0x7f02007d, 0x7f020099 } -int styleable ActivityChooserView_expandActivityOverflowButtonDrawable 0 -int styleable ActivityChooserView_initialActivityCount 1 -int[] styleable AlertDialog { 0x010100f2, 0x7f020043, 0x7f020044, 0x7f0200a3, 0x7f0200a4, 0x7f0200b3, 0x7f0200ec, 0x7f0200ed } -int styleable AlertDialog_android_layout 0 -int styleable AlertDialog_buttonIconDimen 1 -int styleable AlertDialog_buttonPanelSideLayout 2 -int styleable AlertDialog_listItemLayout 3 -int styleable AlertDialog_listLayout 4 -int styleable AlertDialog_multiChoiceItemLayout 5 -int styleable AlertDialog_showTitle 6 -int styleable AlertDialog_singleChoiceItemLayout 7 -int[] styleable AnimatedStateListDrawableCompat { 0x0101011c, 0x01010194, 0x01010195, 0x01010196, 0x0101030c, 0x0101030d } -int styleable AnimatedStateListDrawableCompat_android_dither 0 -int styleable AnimatedStateListDrawableCompat_android_visible 1 -int styleable AnimatedStateListDrawableCompat_android_variablePadding 2 -int styleable AnimatedStateListDrawableCompat_android_constantSize 3 -int styleable AnimatedStateListDrawableCompat_android_enterFadeDuration 4 -int styleable AnimatedStateListDrawableCompat_android_exitFadeDuration 5 -int[] styleable AnimatedStateListDrawableItem { 0x010100d0, 0x01010199 } -int styleable AnimatedStateListDrawableItem_android_id 0 -int styleable AnimatedStateListDrawableItem_android_drawable 1 -int[] styleable AnimatedStateListDrawableTransition { 0x01010199, 0x01010449, 0x0101044a, 0x0101044b } -int styleable AnimatedStateListDrawableTransition_android_drawable 0 -int styleable AnimatedStateListDrawableTransition_android_toId 1 -int styleable AnimatedStateListDrawableTransition_android_fromId 2 -int styleable AnimatedStateListDrawableTransition_android_reversible 3 -int[] styleable AppCompatImageView { 0x01010119, 0x7f0200f2, 0x7f020113, 0x7f020114 } -int styleable AppCompatImageView_android_src 0 -int styleable AppCompatImageView_srcCompat 1 -int styleable AppCompatImageView_tint 2 -int styleable AppCompatImageView_tintMode 3 -int[] styleable AppCompatSeekBar { 0x01010142, 0x7f020110, 0x7f020111, 0x7f020112 } -int styleable AppCompatSeekBar_android_thumb 0 -int styleable AppCompatSeekBar_tickMark 1 -int styleable AppCompatSeekBar_tickMarkTint 2 -int styleable AppCompatSeekBar_tickMarkTintMode 3 -int[] styleable AppCompatTextHelper { 0x01010034, 0x0101016d, 0x0101016e, 0x0101016f, 0x01010170, 0x01010392, 0x01010393 } -int styleable AppCompatTextHelper_android_textAppearance 0 -int styleable AppCompatTextHelper_android_drawableTop 1 -int styleable AppCompatTextHelper_android_drawableBottom 2 -int styleable AppCompatTextHelper_android_drawableLeft 3 -int styleable AppCompatTextHelper_android_drawableRight 4 -int styleable AppCompatTextHelper_android_drawableStart 5 -int styleable AppCompatTextHelper_android_drawableEnd 6 -int[] styleable AppCompatTextView { 0x01010034, 0x7f02002f, 0x7f020030, 0x7f020031, 0x7f020032, 0x7f020033, 0x7f02006d, 0x7f02006e, 0x7f02006f, 0x7f020070, 0x7f020072, 0x7f020073, 0x7f020074, 0x7f020075, 0x7f020081, 0x7f020083, 0x7f02008b, 0x7f02009c, 0x7f02009e, 0x7f0200ff, 0x7f02010a } -int styleable AppCompatTextView_android_textAppearance 0 -int styleable AppCompatTextView_autoSizeMaxTextSize 1 -int styleable AppCompatTextView_autoSizeMinTextSize 2 -int styleable AppCompatTextView_autoSizePresetSizes 3 -int styleable AppCompatTextView_autoSizeStepGranularity 4 -int styleable AppCompatTextView_autoSizeTextType 5 -int styleable AppCompatTextView_drawableBottomCompat 6 -int styleable AppCompatTextView_drawableEndCompat 7 -int styleable AppCompatTextView_drawableLeftCompat 8 -int styleable AppCompatTextView_drawableRightCompat 9 -int styleable AppCompatTextView_drawableStartCompat 10 -int styleable AppCompatTextView_drawableTint 11 -int styleable AppCompatTextView_drawableTintMode 12 -int styleable AppCompatTextView_drawableTopCompat 13 -int styleable AppCompatTextView_firstBaselineToTopHeight 14 -int styleable AppCompatTextView_fontFamily 15 -int styleable AppCompatTextView_fontVariationSettings 16 -int styleable AppCompatTextView_lastBaselineToBottomHeight 17 -int styleable AppCompatTextView_lineHeight 18 -int styleable AppCompatTextView_textAllCaps 19 -int styleable AppCompatTextView_textLocale 20 -int[] styleable AppCompatTheme { 0x01010057, 0x010100ae, 0x7f020000, 0x7f020001, 0x7f020002, 0x7f020003, 0x7f020004, 0x7f020005, 0x7f020006, 0x7f020007, 0x7f020008, 0x7f020009, 0x7f02000a, 0x7f02000b, 0x7f02000c, 0x7f02000e, 0x7f02000f, 0x7f020010, 0x7f020011, 0x7f020012, 0x7f020013, 0x7f020014, 0x7f020015, 0x7f020016, 0x7f020017, 0x7f020018, 0x7f020019, 0x7f02001a, 0x7f02001b, 0x7f02001c, 0x7f02001d, 0x7f02001e, 0x7f020021, 0x7f020025, 0x7f020026, 0x7f020027, 0x7f020028, 0x7f02002e, 0x7f02003b, 0x7f02003c, 0x7f02003d, 0x7f02003e, 0x7f02003f, 0x7f020040, 0x7f020045, 0x7f020046, 0x7f020049, 0x7f02004a, 0x7f020050, 0x7f020051, 0x7f020052, 0x7f020053, 0x7f020054, 0x7f020055, 0x7f020056, 0x7f020057, 0x7f020058, 0x7f020059, 0x7f020062, 0x7f020065, 0x7f020066, 0x7f020067, 0x7f02006a, 0x7f02006c, 0x7f020077, 0x7f020078, 0x7f020079, 0x7f02007a, 0x7f02007b, 0x7f020091, 0x7f020097, 0x7f02009f, 0x7f0200a0, 0x7f0200a1, 0x7f0200a2, 0x7f0200a5, 0x7f0200a6, 0x7f0200a7, 0x7f0200a8, 0x7f0200a9, 0x7f0200aa, 0x7f0200ab, 0x7f0200ac, 0x7f0200ad, 0x7f0200be, 0x7f0200bf, 0x7f0200c0, 0x7f0200c3, 0x7f0200c5, 0x7f0200cf, 0x7f0200d0, 0x7f0200d1, 0x7f0200d2, 0x7f0200e5, 0x7f0200e6, 0x7f0200e7, 0x7f0200e8, 0x7f0200ef, 0x7f0200f0, 0x7f0200fd, 0x7f020100, 0x7f020101, 0x7f020102, 0x7f020103, 0x7f020104, 0x7f020105, 0x7f020106, 0x7f020107, 0x7f020108, 0x7f020109, 0x7f02011f, 0x7f020120, 0x7f020121, 0x7f020122, 0x7f020129, 0x7f02012b, 0x7f02012c, 0x7f02012d, 0x7f02012e, 0x7f02012f, 0x7f020130, 0x7f020131, 0x7f020132, 0x7f020133, 0x7f020134 } -int styleable AppCompatTheme_android_windowIsFloating 0 -int styleable AppCompatTheme_android_windowAnimationStyle 1 -int styleable AppCompatTheme_actionBarDivider 2 -int styleable AppCompatTheme_actionBarItemBackground 3 -int styleable AppCompatTheme_actionBarPopupTheme 4 -int styleable AppCompatTheme_actionBarSize 5 -int styleable AppCompatTheme_actionBarSplitStyle 6 -int styleable AppCompatTheme_actionBarStyle 7 -int styleable AppCompatTheme_actionBarTabBarStyle 8 -int styleable AppCompatTheme_actionBarTabStyle 9 -int styleable AppCompatTheme_actionBarTabTextStyle 10 -int styleable AppCompatTheme_actionBarTheme 11 -int styleable AppCompatTheme_actionBarWidgetTheme 12 -int styleable AppCompatTheme_actionButtonStyle 13 -int styleable AppCompatTheme_actionDropDownStyle 14 -int styleable AppCompatTheme_actionMenuTextAppearance 15 -int styleable AppCompatTheme_actionMenuTextColor 16 -int styleable AppCompatTheme_actionModeBackground 17 -int styleable AppCompatTheme_actionModeCloseButtonStyle 18 -int styleable AppCompatTheme_actionModeCloseDrawable 19 -int styleable AppCompatTheme_actionModeCopyDrawable 20 -int styleable AppCompatTheme_actionModeCutDrawable 21 -int styleable AppCompatTheme_actionModeFindDrawable 22 -int styleable AppCompatTheme_actionModePasteDrawable 23 -int styleable AppCompatTheme_actionModePopupWindowStyle 24 -int styleable AppCompatTheme_actionModeSelectAllDrawable 25 -int styleable AppCompatTheme_actionModeShareDrawable 26 -int styleable AppCompatTheme_actionModeSplitBackground 27 -int styleable AppCompatTheme_actionModeStyle 28 -int styleable AppCompatTheme_actionModeWebSearchDrawable 29 -int styleable AppCompatTheme_actionOverflowButtonStyle 30 -int styleable AppCompatTheme_actionOverflowMenuStyle 31 -int styleable AppCompatTheme_activityChooserViewStyle 32 -int styleable AppCompatTheme_alertDialogButtonGroupStyle 33 -int styleable AppCompatTheme_alertDialogCenterButtons 34 -int styleable AppCompatTheme_alertDialogStyle 35 -int styleable AppCompatTheme_alertDialogTheme 36 -int styleable AppCompatTheme_autoCompleteTextViewStyle 37 -int styleable AppCompatTheme_borderlessButtonStyle 38 -int styleable AppCompatTheme_buttonBarButtonStyle 39 -int styleable AppCompatTheme_buttonBarNegativeButtonStyle 40 -int styleable AppCompatTheme_buttonBarNeutralButtonStyle 41 -int styleable AppCompatTheme_buttonBarPositiveButtonStyle 42 -int styleable AppCompatTheme_buttonBarStyle 43 -int styleable AppCompatTheme_buttonStyle 44 -int styleable AppCompatTheme_buttonStyleSmall 45 -int styleable AppCompatTheme_checkboxStyle 46 -int styleable AppCompatTheme_checkedTextViewStyle 47 -int styleable AppCompatTheme_colorAccent 48 -int styleable AppCompatTheme_colorBackgroundFloating 49 -int styleable AppCompatTheme_colorButtonNormal 50 -int styleable AppCompatTheme_colorControlActivated 51 -int styleable AppCompatTheme_colorControlHighlight 52 -int styleable AppCompatTheme_colorControlNormal 53 -int styleable AppCompatTheme_colorError 54 -int styleable AppCompatTheme_colorPrimary 55 -int styleable AppCompatTheme_colorPrimaryDark 56 -int styleable AppCompatTheme_colorSwitchThumbNormal 57 -int styleable AppCompatTheme_controlBackground 58 -int styleable AppCompatTheme_dialogCornerRadius 59 -int styleable AppCompatTheme_dialogPreferredPadding 60 -int styleable AppCompatTheme_dialogTheme 61 -int styleable AppCompatTheme_dividerHorizontal 62 -int styleable AppCompatTheme_dividerVertical 63 -int styleable AppCompatTheme_dropDownListViewStyle 64 -int styleable AppCompatTheme_dropdownListPreferredItemHeight 65 -int styleable AppCompatTheme_editTextBackground 66 -int styleable AppCompatTheme_editTextColor 67 -int styleable AppCompatTheme_editTextStyle 68 -int styleable AppCompatTheme_homeAsUpIndicator 69 -int styleable AppCompatTheme_imageButtonStyle 70 -int styleable AppCompatTheme_listChoiceBackgroundIndicator 71 -int styleable AppCompatTheme_listChoiceIndicatorMultipleAnimated 72 -int styleable AppCompatTheme_listChoiceIndicatorSingleAnimated 73 -int styleable AppCompatTheme_listDividerAlertDialog 74 -int styleable AppCompatTheme_listMenuViewStyle 75 -int styleable AppCompatTheme_listPopupWindowStyle 76 -int styleable AppCompatTheme_listPreferredItemHeight 77 -int styleable AppCompatTheme_listPreferredItemHeightLarge 78 -int styleable AppCompatTheme_listPreferredItemHeightSmall 79 -int styleable AppCompatTheme_listPreferredItemPaddingEnd 80 -int styleable AppCompatTheme_listPreferredItemPaddingLeft 81 -int styleable AppCompatTheme_listPreferredItemPaddingRight 82 -int styleable AppCompatTheme_listPreferredItemPaddingStart 83 -int styleable AppCompatTheme_panelBackground 84 -int styleable AppCompatTheme_panelMenuListTheme 85 -int styleable AppCompatTheme_panelMenuListWidth 86 -int styleable AppCompatTheme_popupMenuStyle 87 -int styleable AppCompatTheme_popupWindowStyle 88 -int styleable AppCompatTheme_radioButtonStyle 89 -int styleable AppCompatTheme_ratingBarStyle 90 -int styleable AppCompatTheme_ratingBarStyleIndicator 91 -int styleable AppCompatTheme_ratingBarStyleSmall 92 -int styleable AppCompatTheme_searchViewStyle 93 -int styleable AppCompatTheme_seekBarStyle 94 -int styleable AppCompatTheme_selectableItemBackground 95 -int styleable AppCompatTheme_selectableItemBackgroundBorderless 96 -int styleable AppCompatTheme_spinnerDropDownItemStyle 97 -int styleable AppCompatTheme_spinnerStyle 98 -int styleable AppCompatTheme_switchStyle 99 -int styleable AppCompatTheme_textAppearanceLargePopupMenu 100 -int styleable AppCompatTheme_textAppearanceListItem 101 -int styleable AppCompatTheme_textAppearanceListItemSecondary 102 -int styleable AppCompatTheme_textAppearanceListItemSmall 103 -int styleable AppCompatTheme_textAppearancePopupMenuHeader 104 -int styleable AppCompatTheme_textAppearanceSearchResultSubtitle 105 -int styleable AppCompatTheme_textAppearanceSearchResultTitle 106 -int styleable AppCompatTheme_textAppearanceSmallPopupMenu 107 -int styleable AppCompatTheme_textColorAlertDialogListItem 108 -int styleable AppCompatTheme_textColorSearchUrl 109 -int styleable AppCompatTheme_toolbarNavigationButtonStyle 110 -int styleable AppCompatTheme_toolbarStyle 111 -int styleable AppCompatTheme_tooltipForegroundColor 112 -int styleable AppCompatTheme_tooltipFrameBackground 113 -int styleable AppCompatTheme_viewInflaterClass 114 -int styleable AppCompatTheme_windowActionBar 115 -int styleable AppCompatTheme_windowActionBarOverlay 116 -int styleable AppCompatTheme_windowActionModeOverlay 117 -int styleable AppCompatTheme_windowFixedHeightMajor 118 -int styleable AppCompatTheme_windowFixedHeightMinor 119 -int styleable AppCompatTheme_windowFixedWidthMajor 120 -int styleable AppCompatTheme_windowFixedWidthMinor 121 -int styleable AppCompatTheme_windowMinWidthMajor 122 -int styleable AppCompatTheme_windowMinWidthMinor 123 -int styleable AppCompatTheme_windowNoTitle 124 -int[] styleable ButtonBarLayout { 0x7f020029 } -int styleable ButtonBarLayout_allowStacking 0 -int[] styleable ColorStateListItem { 0x010101a5, 0x0101031f, 0x7f02002a } -int styleable ColorStateListItem_android_color 0 -int styleable ColorStateListItem_android_alpha 1 -int styleable ColorStateListItem_alpha 2 -int[] styleable CompoundButton { 0x01010107, 0x7f020041, 0x7f020047, 0x7f020048 } -int styleable CompoundButton_android_button 0 -int styleable CompoundButton_buttonCompat 1 -int styleable CompoundButton_buttonTint 2 -int styleable CompoundButton_buttonTintMode 3 -int[] styleable DrawerArrowToggle { 0x7f02002c, 0x7f02002d, 0x7f02003a, 0x7f02004f, 0x7f020071, 0x7f02008d, 0x7f0200ee, 0x7f02010c } -int styleable DrawerArrowToggle_arrowHeadLength 0 -int styleable DrawerArrowToggle_arrowShaftLength 1 -int styleable DrawerArrowToggle_barLength 2 -int styleable DrawerArrowToggle_color 3 -int styleable DrawerArrowToggle_drawableSize 4 -int styleable DrawerArrowToggle_gapBetweenBars 5 -int styleable DrawerArrowToggle_spinBars 6 -int styleable DrawerArrowToggle_thickness 7 -int[] styleable FontFamily { 0x7f020084, 0x7f020085, 0x7f020086, 0x7f020087, 0x7f020088, 0x7f020089 } -int styleable FontFamily_fontProviderAuthority 0 -int styleable FontFamily_fontProviderCerts 1 -int styleable FontFamily_fontProviderFetchStrategy 2 -int styleable FontFamily_fontProviderFetchTimeout 3 -int styleable FontFamily_fontProviderPackage 4 -int styleable FontFamily_fontProviderQuery 5 -int[] styleable FontFamilyFont { 0x01010532, 0x01010533, 0x0101053f, 0x0101056f, 0x01010570, 0x7f020082, 0x7f02008a, 0x7f02008b, 0x7f02008c, 0x7f020127 } -int styleable FontFamilyFont_android_font 0 -int styleable FontFamilyFont_android_fontWeight 1 -int styleable FontFamilyFont_android_fontStyle 2 -int styleable FontFamilyFont_android_ttcIndex 3 -int styleable FontFamilyFont_android_fontVariationSettings 4 -int styleable FontFamilyFont_font 5 -int styleable FontFamilyFont_fontStyle 6 -int styleable FontFamilyFont_fontVariationSettings 7 -int styleable FontFamilyFont_fontWeight 8 -int styleable FontFamilyFont_ttcIndex 9 -int[] styleable GenericDraweeHierarchy { 0x7f020023, 0x7f020035, 0x7f02007e, 0x7f02007f, 0x7f020080, 0x7f0200b9, 0x7f0200c1, 0x7f0200c2, 0x7f0200c7, 0x7f0200c8, 0x7f0200c9, 0x7f0200ca, 0x7f0200d3, 0x7f0200d4, 0x7f0200d5, 0x7f0200d6, 0x7f0200d7, 0x7f0200d8, 0x7f0200d9, 0x7f0200da, 0x7f0200db, 0x7f0200dc, 0x7f0200dd, 0x7f0200de, 0x7f0200df, 0x7f0200e0, 0x7f0200e1, 0x7f0200e2, 0x7f020128 } -int styleable GenericDraweeHierarchy_actualImageScaleType 0 -int styleable GenericDraweeHierarchy_backgroundImage 1 -int styleable GenericDraweeHierarchy_fadeDuration 2 -int styleable GenericDraweeHierarchy_failureImage 3 -int styleable GenericDraweeHierarchy_failureImageScaleType 4 -int styleable GenericDraweeHierarchy_overlayImage 5 -int styleable GenericDraweeHierarchy_placeholderImage 6 -int styleable GenericDraweeHierarchy_placeholderImageScaleType 7 -int styleable GenericDraweeHierarchy_pressedStateOverlayImage 8 -int styleable GenericDraweeHierarchy_progressBarAutoRotateInterval 9 -int styleable GenericDraweeHierarchy_progressBarImage 10 -int styleable GenericDraweeHierarchy_progressBarImageScaleType 11 -int styleable GenericDraweeHierarchy_retryImage 12 -int styleable GenericDraweeHierarchy_retryImageScaleType 13 -int styleable GenericDraweeHierarchy_roundAsCircle 14 -int styleable GenericDraweeHierarchy_roundBottomEnd 15 -int styleable GenericDraweeHierarchy_roundBottomLeft 16 -int styleable GenericDraweeHierarchy_roundBottomRight 17 -int styleable GenericDraweeHierarchy_roundBottomStart 18 -int styleable GenericDraweeHierarchy_roundTopEnd 19 -int styleable GenericDraweeHierarchy_roundTopLeft 20 -int styleable GenericDraweeHierarchy_roundTopRight 21 -int styleable GenericDraweeHierarchy_roundTopStart 22 -int styleable GenericDraweeHierarchy_roundWithOverlayColor 23 -int styleable GenericDraweeHierarchy_roundedCornerRadius 24 -int styleable GenericDraweeHierarchy_roundingBorderColor 25 -int styleable GenericDraweeHierarchy_roundingBorderPadding 26 -int styleable GenericDraweeHierarchy_roundingBorderWidth 27 -int styleable GenericDraweeHierarchy_viewAspectRatio 28 -int[] styleable GradientColor { 0x0101019d, 0x0101019e, 0x010101a1, 0x010101a2, 0x010101a3, 0x010101a4, 0x01010201, 0x0101020b, 0x01010510, 0x01010511, 0x01010512, 0x01010513 } -int styleable GradientColor_android_startColor 0 -int styleable GradientColor_android_endColor 1 -int styleable GradientColor_android_type 2 -int styleable GradientColor_android_centerX 3 -int styleable GradientColor_android_centerY 4 -int styleable GradientColor_android_gradientRadius 5 -int styleable GradientColor_android_tileMode 6 -int styleable GradientColor_android_centerColor 7 -int styleable GradientColor_android_startX 8 -int styleable GradientColor_android_startY 9 -int styleable GradientColor_android_endX 10 -int styleable GradientColor_android_endY 11 -int[] styleable GradientColorItem { 0x010101a5, 0x01010514 } -int styleable GradientColorItem_android_color 0 -int styleable GradientColorItem_android_offset 1 -int[] styleable LinearLayoutCompat { 0x010100af, 0x010100c4, 0x01010126, 0x01010127, 0x01010128, 0x7f020069, 0x7f02006b, 0x7f0200b1, 0x7f0200ea } -int styleable LinearLayoutCompat_android_gravity 0 -int styleable LinearLayoutCompat_android_orientation 1 -int styleable LinearLayoutCompat_android_baselineAligned 2 -int styleable LinearLayoutCompat_android_baselineAlignedChildIndex 3 -int styleable LinearLayoutCompat_android_weightSum 4 -int styleable LinearLayoutCompat_divider 5 -int styleable LinearLayoutCompat_dividerPadding 6 -int styleable LinearLayoutCompat_measureWithLargestChild 7 -int styleable LinearLayoutCompat_showDividers 8 -int[] styleable LinearLayoutCompat_Layout { 0x010100b3, 0x010100f4, 0x010100f5, 0x01010181 } -int styleable LinearLayoutCompat_Layout_android_layout_gravity 0 -int styleable LinearLayoutCompat_Layout_android_layout_width 1 -int styleable LinearLayoutCompat_Layout_android_layout_height 2 -int styleable LinearLayoutCompat_Layout_android_layout_weight 3 -int[] styleable ListPopupWindow { 0x010102ac, 0x010102ad } -int styleable ListPopupWindow_android_dropDownHorizontalOffset 0 -int styleable ListPopupWindow_android_dropDownVerticalOffset 1 -int[] styleable MenuGroup { 0x0101000e, 0x010100d0, 0x01010194, 0x010101de, 0x010101df, 0x010101e0 } -int styleable MenuGroup_android_enabled 0 -int styleable MenuGroup_android_id 1 -int styleable MenuGroup_android_visible 2 -int styleable MenuGroup_android_menuCategory 3 -int styleable MenuGroup_android_orderInCategory 4 -int styleable MenuGroup_android_checkableBehavior 5 -int[] styleable MenuItem { 0x01010002, 0x0101000e, 0x010100d0, 0x01010106, 0x01010194, 0x010101de, 0x010101df, 0x010101e1, 0x010101e2, 0x010101e3, 0x010101e4, 0x010101e5, 0x0101026f, 0x7f02000d, 0x7f02001f, 0x7f020020, 0x7f02002b, 0x7f02005b, 0x7f020094, 0x7f020095, 0x7f0200b7, 0x7f0200e9, 0x7f020123 } -int styleable MenuItem_android_icon 0 -int styleable MenuItem_android_enabled 1 -int styleable MenuItem_android_id 2 -int styleable MenuItem_android_checked 3 -int styleable MenuItem_android_visible 4 -int styleable MenuItem_android_menuCategory 5 -int styleable MenuItem_android_orderInCategory 6 -int styleable MenuItem_android_title 7 -int styleable MenuItem_android_titleCondensed 8 -int styleable MenuItem_android_alphabeticShortcut 9 -int styleable MenuItem_android_numericShortcut 10 -int styleable MenuItem_android_checkable 11 -int styleable MenuItem_android_onClick 12 -int styleable MenuItem_actionLayout 13 -int styleable MenuItem_actionProviderClass 14 -int styleable MenuItem_actionViewClass 15 -int styleable MenuItem_alphabeticModifiers 16 -int styleable MenuItem_contentDescription 17 -int styleable MenuItem_iconTint 18 -int styleable MenuItem_iconTintMode 19 -int styleable MenuItem_numericModifiers 20 -int styleable MenuItem_showAsAction 21 -int styleable MenuItem_tooltipText 22 -int[] styleable MenuView { 0x010100ae, 0x0101012c, 0x0101012d, 0x0101012e, 0x0101012f, 0x01010130, 0x01010131, 0x7f0200c6, 0x7f0200f4 } -int styleable MenuView_android_windowAnimationStyle 0 -int styleable MenuView_android_itemTextAppearance 1 -int styleable MenuView_android_horizontalDivider 2 -int styleable MenuView_android_verticalDivider 3 -int styleable MenuView_android_headerBackground 4 -int styleable MenuView_android_itemBackground 5 -int styleable MenuView_android_itemIconDisabledAlpha 6 -int styleable MenuView_preserveIconSpacing 7 -int styleable MenuView_subMenuArrow 8 -int[] styleable PopupWindow { 0x01010176, 0x010102c9, 0x7f0200b8 } -int styleable PopupWindow_android_popupBackground 0 -int styleable PopupWindow_android_popupAnimationStyle 1 -int styleable PopupWindow_overlapAnchor 2 -int[] styleable PopupWindowBackgroundState { 0x7f0200f3 } -int styleable PopupWindowBackgroundState_state_above_anchor 0 -int[] styleable RecycleListView { 0x7f0200ba, 0x7f0200bd } -int styleable RecycleListView_paddingBottomNoButtons 0 -int styleable RecycleListView_paddingTopNoTitle 1 -int[] styleable SearchView { 0x010100da, 0x0101011f, 0x01010220, 0x01010264, 0x7f02004b, 0x7f02005a, 0x7f020064, 0x7f02008e, 0x7f020096, 0x7f02009d, 0x7f0200cd, 0x7f0200ce, 0x7f0200e3, 0x7f0200e4, 0x7f0200f5, 0x7f0200fa, 0x7f02012a } -int styleable SearchView_android_focusable 0 -int styleable SearchView_android_maxWidth 1 -int styleable SearchView_android_inputType 2 -int styleable SearchView_android_imeOptions 3 -int styleable SearchView_closeIcon 4 -int styleable SearchView_commitIcon 5 -int styleable SearchView_defaultQueryHint 6 -int styleable SearchView_goIcon 7 -int styleable SearchView_iconifiedByDefault 8 -int styleable SearchView_layout 9 -int styleable SearchView_queryBackground 10 -int styleable SearchView_queryHint 11 -int styleable SearchView_searchHintIcon 12 -int styleable SearchView_searchIcon 13 -int styleable SearchView_submitBackground 14 -int styleable SearchView_suggestionRowLayout 15 -int styleable SearchView_voiceIcon 16 -int[] styleable SimpleDraweeView { 0x7f020022, 0x7f020023, 0x7f020024, 0x7f020035, 0x7f02007e, 0x7f02007f, 0x7f020080, 0x7f0200b9, 0x7f0200c1, 0x7f0200c2, 0x7f0200c7, 0x7f0200c8, 0x7f0200c9, 0x7f0200ca, 0x7f0200d3, 0x7f0200d4, 0x7f0200d5, 0x7f0200d6, 0x7f0200d7, 0x7f0200d8, 0x7f0200d9, 0x7f0200da, 0x7f0200db, 0x7f0200dc, 0x7f0200dd, 0x7f0200de, 0x7f0200df, 0x7f0200e0, 0x7f0200e1, 0x7f0200e2, 0x7f020128 } -int styleable SimpleDraweeView_actualImageResource 0 -int styleable SimpleDraweeView_actualImageScaleType 1 -int styleable SimpleDraweeView_actualImageUri 2 -int styleable SimpleDraweeView_backgroundImage 3 -int styleable SimpleDraweeView_fadeDuration 4 -int styleable SimpleDraweeView_failureImage 5 -int styleable SimpleDraweeView_failureImageScaleType 6 -int styleable SimpleDraweeView_overlayImage 7 -int styleable SimpleDraweeView_placeholderImage 8 -int styleable SimpleDraweeView_placeholderImageScaleType 9 -int styleable SimpleDraweeView_pressedStateOverlayImage 10 -int styleable SimpleDraweeView_progressBarAutoRotateInterval 11 -int styleable SimpleDraweeView_progressBarImage 12 -int styleable SimpleDraweeView_progressBarImageScaleType 13 -int styleable SimpleDraweeView_retryImage 14 -int styleable SimpleDraweeView_retryImageScaleType 15 -int styleable SimpleDraweeView_roundAsCircle 16 -int styleable SimpleDraweeView_roundBottomEnd 17 -int styleable SimpleDraweeView_roundBottomLeft 18 -int styleable SimpleDraweeView_roundBottomRight 19 -int styleable SimpleDraweeView_roundBottomStart 20 -int styleable SimpleDraweeView_roundTopEnd 21 -int styleable SimpleDraweeView_roundTopLeft 22 -int styleable SimpleDraweeView_roundTopRight 23 -int styleable SimpleDraweeView_roundTopStart 24 -int styleable SimpleDraweeView_roundWithOverlayColor 25 -int styleable SimpleDraweeView_roundedCornerRadius 26 -int styleable SimpleDraweeView_roundingBorderColor 27 -int styleable SimpleDraweeView_roundingBorderPadding 28 -int styleable SimpleDraweeView_roundingBorderWidth 29 -int styleable SimpleDraweeView_viewAspectRatio 30 -int[] styleable Spinner { 0x010100b2, 0x01010176, 0x0101017b, 0x01010262, 0x7f0200c4 } -int styleable Spinner_android_entries 0 -int styleable Spinner_android_popupBackground 1 -int styleable Spinner_android_prompt 2 -int styleable Spinner_android_dropDownWidth 3 -int styleable Spinner_popupTheme 4 -int[] styleable StateListDrawable { 0x0101011c, 0x01010194, 0x01010195, 0x01010196, 0x0101030c, 0x0101030d } -int styleable StateListDrawable_android_dither 0 -int styleable StateListDrawable_android_visible 1 -int styleable StateListDrawable_android_variablePadding 2 -int styleable StateListDrawable_android_constantSize 3 -int styleable StateListDrawable_android_enterFadeDuration 4 -int styleable StateListDrawable_android_exitFadeDuration 5 -int[] styleable StateListDrawableItem { 0x01010199 } -int styleable StateListDrawableItem_android_drawable 0 -int[] styleable SwitchCompat { 0x01010124, 0x01010125, 0x01010142, 0x7f0200eb, 0x7f0200f1, 0x7f0200fb, 0x7f0200fc, 0x7f0200fe, 0x7f02010d, 0x7f02010e, 0x7f02010f, 0x7f020124, 0x7f020125, 0x7f020126 } -int styleable SwitchCompat_android_textOn 0 -int styleable SwitchCompat_android_textOff 1 -int styleable SwitchCompat_android_thumb 2 -int styleable SwitchCompat_showText 3 -int styleable SwitchCompat_splitTrack 4 -int styleable SwitchCompat_switchMinWidth 5 -int styleable SwitchCompat_switchPadding 6 -int styleable SwitchCompat_switchTextAppearance 7 -int styleable SwitchCompat_thumbTextPadding 8 -int styleable SwitchCompat_thumbTint 9 -int styleable SwitchCompat_thumbTintMode 10 -int styleable SwitchCompat_track 11 -int styleable SwitchCompat_trackTint 12 -int styleable SwitchCompat_trackTintMode 13 -int[] styleable TextAppearance { 0x01010095, 0x01010096, 0x01010097, 0x01010098, 0x0101009a, 0x0101009b, 0x01010161, 0x01010162, 0x01010163, 0x01010164, 0x010103ac, 0x01010585, 0x7f020083, 0x7f02008b, 0x7f0200ff, 0x7f02010a } -int styleable TextAppearance_android_textSize 0 -int styleable TextAppearance_android_typeface 1 -int styleable TextAppearance_android_textStyle 2 -int styleable TextAppearance_android_textColor 3 -int styleable TextAppearance_android_textColorHint 4 -int styleable TextAppearance_android_textColorLink 5 -int styleable TextAppearance_android_shadowColor 6 -int styleable TextAppearance_android_shadowDx 7 -int styleable TextAppearance_android_shadowDy 8 -int styleable TextAppearance_android_shadowRadius 9 -int styleable TextAppearance_android_fontFamily 10 -int styleable TextAppearance_android_textFontWeight 11 -int styleable TextAppearance_fontFamily 12 -int styleable TextAppearance_fontVariationSettings 13 -int styleable TextAppearance_textAllCaps 14 -int styleable TextAppearance_textLocale 15 -int[] styleable Toolbar { 0x010100af, 0x01010140, 0x7f020042, 0x7f02004d, 0x7f02004e, 0x7f02005c, 0x7f02005d, 0x7f02005e, 0x7f02005f, 0x7f020060, 0x7f020061, 0x7f0200ae, 0x7f0200af, 0x7f0200b0, 0x7f0200b2, 0x7f0200b4, 0x7f0200b5, 0x7f0200c4, 0x7f0200f6, 0x7f0200f7, 0x7f0200f8, 0x7f020115, 0x7f020116, 0x7f020117, 0x7f020118, 0x7f020119, 0x7f02011a, 0x7f02011b, 0x7f02011c, 0x7f02011d } -int styleable Toolbar_android_gravity 0 -int styleable Toolbar_android_minHeight 1 -int styleable Toolbar_buttonGravity 2 -int styleable Toolbar_collapseContentDescription 3 -int styleable Toolbar_collapseIcon 4 -int styleable Toolbar_contentInsetEnd 5 -int styleable Toolbar_contentInsetEndWithActions 6 -int styleable Toolbar_contentInsetLeft 7 -int styleable Toolbar_contentInsetRight 8 -int styleable Toolbar_contentInsetStart 9 -int styleable Toolbar_contentInsetStartWithNavigation 10 -int styleable Toolbar_logo 11 -int styleable Toolbar_logoDescription 12 -int styleable Toolbar_maxButtonHeight 13 -int styleable Toolbar_menu 14 -int styleable Toolbar_navigationContentDescription 15 -int styleable Toolbar_navigationIcon 16 -int styleable Toolbar_popupTheme 17 -int styleable Toolbar_subtitle 18 -int styleable Toolbar_subtitleTextAppearance 19 -int styleable Toolbar_subtitleTextColor 20 -int styleable Toolbar_title 21 -int styleable Toolbar_titleMargin 22 -int styleable Toolbar_titleMarginBottom 23 -int styleable Toolbar_titleMarginEnd 24 -int styleable Toolbar_titleMarginStart 25 -int styleable Toolbar_titleMarginTop 26 -int styleable Toolbar_titleMargins 27 -int styleable Toolbar_titleTextAppearance 28 -int styleable Toolbar_titleTextColor 29 -int[] styleable View { 0x01010000, 0x010100da, 0x7f0200bb, 0x7f0200bc, 0x7f02010b } -int styleable View_android_theme 0 -int styleable View_android_focusable 1 -int styleable View_paddingEnd 2 -int styleable View_paddingStart 3 -int styleable View_theme 4 -int[] styleable ViewBackgroundHelper { 0x010100d4, 0x7f020038, 0x7f020039 } -int styleable ViewBackgroundHelper_android_background 0 -int styleable ViewBackgroundHelper_backgroundTint 1 -int styleable ViewBackgroundHelper_backgroundTintMode 2 -int[] styleable ViewStubCompat { 0x010100d0, 0x010100f2, 0x010100f3 } -int styleable ViewStubCompat_android_id 0 -int styleable ViewStubCompat_android_layout 1 -int styleable ViewStubCompat_android_inflatedId 2 -int xml rn_dev_preferences 0x7f0f0000 diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libc++_shared.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libc++_shared.so deleted file mode 100644 index 1b6a320..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libc++_shared.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libevent-2.1.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libevent-2.1.so deleted file mode 100644 index 630bc06..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libevent-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libevent_core-2.1.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libevent_core-2.1.so deleted file mode 100644 index 0e8df11..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libevent_core-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libevent_extra-2.1.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libevent_extra-2.1.so deleted file mode 100644 index 32cd1df..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libevent_extra-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libfb.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libfb.so deleted file mode 100644 index 92a4572..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libfb.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libfbjni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libfbjni.so deleted file mode 100644 index 73fccd5..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libfbjni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libflipper.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libflipper.so deleted file mode 100644 index 489f18e..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libflipper.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libfolly_futures.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libfolly_futures.so deleted file mode 100644 index 18ac20b..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libfolly_futures.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libfolly_json.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libfolly_json.so deleted file mode 100644 index cef1b28..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libfolly_json.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libglog.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libglog.so deleted file mode 100644 index 9c1b02c..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libglog.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libglog_init.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libglog_init.so deleted file mode 100644 index c7c0a96..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libglog_init.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-common-debug.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-common-debug.so deleted file mode 100644 index 2a50e2a..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-common-debug.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-common-release.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-common-release.so deleted file mode 100644 index f145d10..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-common-release.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-debug.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-debug.so deleted file mode 100644 index 92acb5d..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-debug.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-release.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-release.so deleted file mode 100644 index f64d612..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermes-executor-release.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermes-inspector.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermes-inspector.so deleted file mode 100644 index 1981f07..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libhermes-inspector.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libimagepipeline.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libimagepipeline.so deleted file mode 100644 index aae77b7..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libimagepipeline.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libjsc.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libjsc.so deleted file mode 100644 index e997f19..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libjsc.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libjscexecutor.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libjscexecutor.so deleted file mode 100644 index ee6ff5a..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libjscexecutor.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libjsijniprofiler.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libjsijniprofiler.so deleted file mode 100644 index 7ac737b..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libjsijniprofiler.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libjsinspector.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libjsinspector.so deleted file mode 100644 index 348f20f..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libjsinspector.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libnative-filters.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libnative-filters.so deleted file mode 100644 index ecae0f1..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libnative-filters.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libnative-imagetranscoder.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libnative-imagetranscoder.so deleted file mode 100644 index 51b25af..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libnative-imagetranscoder.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_codegen_reactandroidspec.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_codegen_reactandroidspec.so deleted file mode 100644 index 72720a1..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_codegen_reactandroidspec.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_nativemodule_core.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_nativemodule_core.so deleted file mode 100644 index a2bda4d..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreact_nativemodule_core.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreactnativeblob.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreactnativeblob.so deleted file mode 100644 index 2bedfbf..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreactnativeblob.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreactnativejni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreactnativejni.so deleted file mode 100644 index d001162..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreactnativejni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreactnativeutilsjni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreactnativeutilsjni.so deleted file mode 100644 index 813ac9f..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreactnativeutilsjni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreactperfloggerjni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreactperfloggerjni.so deleted file mode 100644 index e9738e0..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libreactperfloggerjni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libturbomodulejsijni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libturbomodulejsijni.so deleted file mode 100644 index d023f5a..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libturbomodulejsijni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libyoga.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libyoga.so deleted file mode 100644 index c278387..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libyoga.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libc++_shared.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libc++_shared.so deleted file mode 100644 index a64fb01..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libc++_shared.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libevent-2.1.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libevent-2.1.so deleted file mode 100644 index d659616..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libevent-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libevent_core-2.1.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libevent_core-2.1.so deleted file mode 100644 index 4a53e1d..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libevent_core-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libevent_extra-2.1.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libevent_extra-2.1.so deleted file mode 100644 index a2b8165..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libevent_extra-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libfb.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libfb.so deleted file mode 100644 index d9193ff..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libfb.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libfbjni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libfbjni.so deleted file mode 100644 index 0a0dfc6..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libfbjni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libflipper.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libflipper.so deleted file mode 100644 index 116e7c4..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libflipper.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libfolly_futures.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libfolly_futures.so deleted file mode 100644 index 2d15382..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libfolly_futures.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libfolly_json.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libfolly_json.so deleted file mode 100644 index ded9b0b..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libfolly_json.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libglog.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libglog.so deleted file mode 100644 index 6801673..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libglog.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libglog_init.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libglog_init.so deleted file mode 100644 index a0b9522..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libglog_init.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-common-debug.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-common-debug.so deleted file mode 100644 index c678458..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-common-debug.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-common-release.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-common-release.so deleted file mode 100644 index 1212076..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-common-release.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-debug.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-debug.so deleted file mode 100644 index dc8f90a..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-debug.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-release.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-release.so deleted file mode 100644 index 34195f2..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libhermes-executor-release.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libhermes-inspector.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libhermes-inspector.so deleted file mode 100644 index 711d9d7..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libhermes-inspector.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libimagepipeline.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libimagepipeline.so deleted file mode 100644 index 907ce75..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libimagepipeline.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libjsc.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libjsc.so deleted file mode 100644 index 0b28059..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libjsc.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libjscexecutor.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libjscexecutor.so deleted file mode 100644 index 5c62e5b..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libjscexecutor.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libjsijniprofiler.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libjsijniprofiler.so deleted file mode 100644 index 881f239..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libjsijniprofiler.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libjsinspector.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libjsinspector.so deleted file mode 100644 index e71614b..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libjsinspector.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libnative-filters.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libnative-filters.so deleted file mode 100644 index 5498292..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libnative-filters.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libnative-imagetranscoder.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libnative-imagetranscoder.so deleted file mode 100644 index 971eb91..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libnative-imagetranscoder.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreact_codegen_reactandroidspec.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreact_codegen_reactandroidspec.so deleted file mode 100644 index 1640165..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreact_codegen_reactandroidspec.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreact_nativemodule_core.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreact_nativemodule_core.so deleted file mode 100644 index d274a10..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreact_nativemodule_core.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreactnativeblob.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreactnativeblob.so deleted file mode 100644 index b1d7838..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreactnativeblob.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreactnativejni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreactnativejni.so deleted file mode 100644 index 5c515c7..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreactnativejni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreactnativeutilsjni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreactnativeutilsjni.so deleted file mode 100644 index 1a21000..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreactnativeutilsjni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreactperfloggerjni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreactperfloggerjni.so deleted file mode 100644 index 2ab2300..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libreactperfloggerjni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libturbomodulejsijni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libturbomodulejsijni.so deleted file mode 100644 index ddf728d..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libturbomodulejsijni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libyoga.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libyoga.so deleted file mode 100644 index 3dc4e21..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/armeabi-v7a/libyoga.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libc++_shared.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libc++_shared.so deleted file mode 100644 index 7e9d748..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libc++_shared.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libevent-2.1.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libevent-2.1.so deleted file mode 100644 index d40e5a8..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libevent-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libevent_core-2.1.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libevent_core-2.1.so deleted file mode 100644 index fff9cbe..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libevent_core-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libevent_extra-2.1.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libevent_extra-2.1.so deleted file mode 100644 index cd22d2e..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libevent_extra-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libfb.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libfb.so deleted file mode 100644 index ec549b8..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libfb.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libfbjni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libfbjni.so deleted file mode 100644 index e8187bf..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libfbjni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libflipper.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libflipper.so deleted file mode 100644 index 501262e..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libflipper.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libfolly_futures.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libfolly_futures.so deleted file mode 100644 index 5ab22ec..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libfolly_futures.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libfolly_json.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libfolly_json.so deleted file mode 100644 index 5da69c4..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libfolly_json.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libglog.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libglog.so deleted file mode 100644 index d557551..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libglog.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libglog_init.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libglog_init.so deleted file mode 100644 index 4817f31..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libglog_init.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libhermes-executor-common-debug.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libhermes-executor-common-debug.so deleted file mode 100644 index 0c95e68..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libhermes-executor-common-debug.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libhermes-executor-common-release.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libhermes-executor-common-release.so deleted file mode 100644 index 845a385..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libhermes-executor-common-release.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libhermes-executor-debug.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libhermes-executor-debug.so deleted file mode 100644 index b431c0f..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libhermes-executor-debug.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libhermes-executor-release.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libhermes-executor-release.so deleted file mode 100644 index 88dc869..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libhermes-executor-release.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libhermes-inspector.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libhermes-inspector.so deleted file mode 100644 index b6233af..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libhermes-inspector.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libimagepipeline.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libimagepipeline.so deleted file mode 100644 index bc71e1a..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libimagepipeline.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libjsc.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libjsc.so deleted file mode 100644 index 2bbf435..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libjsc.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libjscexecutor.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libjscexecutor.so deleted file mode 100644 index 9f6b05c..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libjscexecutor.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libjsijniprofiler.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libjsijniprofiler.so deleted file mode 100644 index ff9041b..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libjsijniprofiler.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libjsinspector.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libjsinspector.so deleted file mode 100644 index 3a1b591..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libjsinspector.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libnative-filters.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libnative-filters.so deleted file mode 100644 index 181efc8..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libnative-filters.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libnative-imagetranscoder.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libnative-imagetranscoder.so deleted file mode 100644 index 30d79c3..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libnative-imagetranscoder.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreact_codegen_reactandroidspec.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreact_codegen_reactandroidspec.so deleted file mode 100644 index de863ca..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreact_codegen_reactandroidspec.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreact_nativemodule_core.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreact_nativemodule_core.so deleted file mode 100644 index d7b5732..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreact_nativemodule_core.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreactnativeblob.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreactnativeblob.so deleted file mode 100644 index 043619e..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreactnativeblob.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreactnativejni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreactnativejni.so deleted file mode 100644 index ea0b4db..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreactnativejni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreactnativeutilsjni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreactnativeutilsjni.so deleted file mode 100644 index fee37ae..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreactnativeutilsjni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreactperfloggerjni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreactperfloggerjni.so deleted file mode 100644 index 81effd9..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libreactperfloggerjni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libturbomodulejsijni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libturbomodulejsijni.so deleted file mode 100644 index e24691f..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libturbomodulejsijni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libyoga.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libyoga.so deleted file mode 100644 index 9ca6478..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86/libyoga.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libc++_shared.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libc++_shared.so deleted file mode 100644 index ee3c65a..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libc++_shared.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libevent-2.1.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libevent-2.1.so deleted file mode 100644 index 786d905..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libevent-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libevent_core-2.1.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libevent_core-2.1.so deleted file mode 100644 index 9c2f60e..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libevent_core-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libevent_extra-2.1.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libevent_extra-2.1.so deleted file mode 100644 index 0b6d363..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libevent_extra-2.1.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libfb.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libfb.so deleted file mode 100644 index e1257cd..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libfb.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libfbjni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libfbjni.so deleted file mode 100644 index 65bb4ae..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libfbjni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libflipper.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libflipper.so deleted file mode 100644 index 5cce668..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libflipper.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libfolly_futures.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libfolly_futures.so deleted file mode 100644 index be4b4f5..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libfolly_futures.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libfolly_json.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libfolly_json.so deleted file mode 100644 index 16d5b45..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libfolly_json.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libglog.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libglog.so deleted file mode 100644 index 9c6a929..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libglog.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libglog_init.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libglog_init.so deleted file mode 100644 index f389e36..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libglog_init.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libhermes-executor-common-debug.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libhermes-executor-common-debug.so deleted file mode 100644 index b471f79..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libhermes-executor-common-debug.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libhermes-executor-common-release.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libhermes-executor-common-release.so deleted file mode 100644 index 881b30e..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libhermes-executor-common-release.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libhermes-executor-debug.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libhermes-executor-debug.so deleted file mode 100644 index 1f3cf91..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libhermes-executor-debug.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libhermes-executor-release.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libhermes-executor-release.so deleted file mode 100644 index d68130c..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libhermes-executor-release.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libhermes-inspector.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libhermes-inspector.so deleted file mode 100644 index 406963d..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libhermes-inspector.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libimagepipeline.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libimagepipeline.so deleted file mode 100644 index 29b7911..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libimagepipeline.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libjsc.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libjsc.so deleted file mode 100644 index 2016ced..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libjsc.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libjscexecutor.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libjscexecutor.so deleted file mode 100644 index d99f0b4..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libjscexecutor.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libjsijniprofiler.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libjsijniprofiler.so deleted file mode 100644 index 3a92291..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libjsijniprofiler.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libjsinspector.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libjsinspector.so deleted file mode 100644 index 39d83de..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libjsinspector.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libnative-filters.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libnative-filters.so deleted file mode 100644 index 4b5fc20..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libnative-filters.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libnative-imagetranscoder.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libnative-imagetranscoder.so deleted file mode 100644 index 1dec96b..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libnative-imagetranscoder.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreact_codegen_reactandroidspec.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreact_codegen_reactandroidspec.so deleted file mode 100644 index 42caba6..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreact_codegen_reactandroidspec.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreact_nativemodule_core.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreact_nativemodule_core.so deleted file mode 100644 index e059b90..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreact_nativemodule_core.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreactnativeblob.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreactnativeblob.so deleted file mode 100644 index af4bbf4..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreactnativeblob.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreactnativejni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreactnativejni.so deleted file mode 100644 index b982b21..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreactnativejni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreactnativeutilsjni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreactnativeutilsjni.so deleted file mode 100644 index aa0bf94..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreactnativeutilsjni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreactperfloggerjni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreactperfloggerjni.so deleted file mode 100644 index e060913..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libreactperfloggerjni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libturbomodulejsijni.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libturbomodulejsijni.so deleted file mode 100644 index 519f08e..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libturbomodulejsijni.so and /dev/null differ diff --git a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libyoga.so b/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libyoga.so deleted file mode 100644 index b5612bb..0000000 Binary files a/android/app/build/intermediates/stripped_native_libs/debug/out/lib/x86_64/libyoga.so and /dev/null differ diff --git a/android/app/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt b/android/app/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt deleted file mode 100644 index 99729e1..0000000 --- a/android/app/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt +++ /dev/null @@ -1,1409 +0,0 @@ -com.reactnativeapp -anim abc_fade_in -anim abc_fade_out -anim abc_grow_fade_in_from_bottom -anim abc_popup_enter -anim abc_popup_exit -anim abc_shrink_fade_out_from_bottom -anim abc_slide_in_bottom -anim abc_slide_in_top -anim abc_slide_out_bottom -anim abc_slide_out_top -anim abc_tooltip_enter -anim abc_tooltip_exit -anim btn_checkbox_to_checked_box_inner_merged_animation -anim btn_checkbox_to_checked_box_outer_merged_animation -anim btn_checkbox_to_checked_icon_null_animation -anim btn_checkbox_to_unchecked_box_inner_merged_animation -anim btn_checkbox_to_unchecked_check_path_merged_animation -anim btn_checkbox_to_unchecked_icon_null_animation -anim btn_radio_to_off_mtrl_dot_group_animation -anim btn_radio_to_off_mtrl_ring_outer_animation -anim btn_radio_to_off_mtrl_ring_outer_path_animation -anim btn_radio_to_on_mtrl_dot_group_animation -anim btn_radio_to_on_mtrl_ring_outer_animation -anim btn_radio_to_on_mtrl_ring_outer_path_animation -anim catalyst_fade_in -anim catalyst_fade_out -anim catalyst_push_up_in -anim catalyst_push_up_out -anim catalyst_slide_down -anim catalyst_slide_up -attr actionBarDivider -attr actionBarItemBackground -attr actionBarPopupTheme -attr actionBarSize -attr actionBarSplitStyle -attr actionBarStyle -attr actionBarTabBarStyle -attr actionBarTabStyle -attr actionBarTabTextStyle -attr actionBarTheme -attr actionBarWidgetTheme -attr actionButtonStyle -attr actionDropDownStyle -attr actionLayout -attr actionMenuTextAppearance -attr actionMenuTextColor -attr actionModeBackground -attr actionModeCloseButtonStyle -attr actionModeCloseDrawable -attr actionModeCopyDrawable -attr actionModeCutDrawable -attr actionModeFindDrawable -attr actionModePasteDrawable -attr actionModePopupWindowStyle -attr actionModeSelectAllDrawable -attr actionModeShareDrawable -attr actionModeSplitBackground -attr actionModeStyle -attr actionModeWebSearchDrawable -attr actionOverflowButtonStyle -attr actionOverflowMenuStyle -attr actionProviderClass -attr actionViewClass -attr activityChooserViewStyle -attr actualImageResource -attr actualImageScaleType -attr actualImageUri -attr alertDialogButtonGroupStyle -attr alertDialogCenterButtons -attr alertDialogStyle -attr alertDialogTheme -attr allowStacking -attr alpha -attr alphabeticModifiers -attr arrowHeadLength -attr arrowShaftLength -attr autoCompleteTextViewStyle -attr autoSizeMaxTextSize -attr autoSizeMinTextSize -attr autoSizePresetSizes -attr autoSizeStepGranularity -attr autoSizeTextType -attr background -attr backgroundImage -attr backgroundSplit -attr backgroundStacked -attr backgroundTint -attr backgroundTintMode -attr barLength -attr borderlessButtonStyle -attr buttonBarButtonStyle -attr buttonBarNegativeButtonStyle -attr buttonBarNeutralButtonStyle -attr buttonBarPositiveButtonStyle -attr buttonBarStyle -attr buttonCompat -attr buttonGravity -attr buttonIconDimen -attr buttonPanelSideLayout -attr buttonStyle -attr buttonStyleSmall -attr buttonTint -attr buttonTintMode -attr checkboxStyle -attr checkedTextViewStyle -attr closeIcon -attr closeItemLayout -attr collapseContentDescription -attr collapseIcon -attr color -attr colorAccent -attr colorBackgroundFloating -attr colorButtonNormal -attr colorControlActivated -attr colorControlHighlight -attr colorControlNormal -attr colorError -attr colorPrimary -attr colorPrimaryDark -attr colorSwitchThumbNormal -attr commitIcon -attr contentDescription -attr contentInsetEnd -attr contentInsetEndWithActions -attr contentInsetLeft -attr contentInsetRight -attr contentInsetStart -attr contentInsetStartWithNavigation -attr controlBackground -attr customNavigationLayout -attr defaultQueryHint -attr dialogCornerRadius -attr dialogPreferredPadding -attr dialogTheme -attr displayOptions -attr divider -attr dividerHorizontal -attr dividerPadding -attr dividerVertical -attr drawableBottomCompat -attr drawableEndCompat -attr drawableLeftCompat -attr drawableRightCompat -attr drawableSize -attr drawableStartCompat -attr drawableTint -attr drawableTintMode -attr drawableTopCompat -attr drawerArrowStyle -attr dropDownListViewStyle -attr dropdownListPreferredItemHeight -attr editTextBackground -attr editTextColor -attr editTextStyle -attr elevation -attr expandActivityOverflowButtonDrawable -attr fadeDuration -attr failureImage -attr failureImageScaleType -attr firstBaselineToTopHeight -attr font -attr fontFamily -attr fontProviderAuthority -attr fontProviderCerts -attr fontProviderFetchStrategy -attr fontProviderFetchTimeout -attr fontProviderPackage -attr fontProviderQuery -attr fontStyle -attr fontVariationSettings -attr fontWeight -attr gapBetweenBars -attr goIcon -attr height -attr hideOnContentScroll -attr homeAsUpIndicator -attr homeLayout -attr icon -attr iconTint -attr iconTintMode -attr iconifiedByDefault -attr imageButtonStyle -attr indeterminateProgressStyle -attr initialActivityCount -attr isLightTheme -attr itemPadding -attr lastBaselineToBottomHeight -attr layout -attr lineHeight -attr listChoiceBackgroundIndicator -attr listChoiceIndicatorMultipleAnimated -attr listChoiceIndicatorSingleAnimated -attr listDividerAlertDialog -attr listItemLayout -attr listLayout -attr listMenuViewStyle -attr listPopupWindowStyle -attr listPreferredItemHeight -attr listPreferredItemHeightLarge -attr listPreferredItemHeightSmall -attr listPreferredItemPaddingEnd -attr listPreferredItemPaddingLeft -attr listPreferredItemPaddingRight -attr listPreferredItemPaddingStart -attr logo -attr logoDescription -attr maxButtonHeight -attr measureWithLargestChild -attr menu -attr multiChoiceItemLayout -attr navigationContentDescription -attr navigationIcon -attr navigationMode -attr numericModifiers -attr overlapAnchor -attr overlayImage -attr paddingBottomNoButtons -attr paddingEnd -attr paddingStart -attr paddingTopNoTitle -attr panelBackground -attr panelMenuListTheme -attr panelMenuListWidth -attr placeholderImage -attr placeholderImageScaleType -attr popupMenuStyle -attr popupTheme -attr popupWindowStyle -attr preserveIconSpacing -attr pressedStateOverlayImage -attr progressBarAutoRotateInterval -attr progressBarImage -attr progressBarImageScaleType -attr progressBarPadding -attr progressBarStyle -attr queryBackground -attr queryHint -attr radioButtonStyle -attr ratingBarStyle -attr ratingBarStyleIndicator -attr ratingBarStyleSmall -attr retryImage -attr retryImageScaleType -attr roundAsCircle -attr roundBottomEnd -attr roundBottomLeft -attr roundBottomRight -attr roundBottomStart -attr roundTopEnd -attr roundTopLeft -attr roundTopRight -attr roundTopStart -attr roundWithOverlayColor -attr roundedCornerRadius -attr roundingBorderColor -attr roundingBorderPadding -attr roundingBorderWidth -attr searchHintIcon -attr searchIcon -attr searchViewStyle -attr seekBarStyle -attr selectableItemBackground -attr selectableItemBackgroundBorderless -attr showAsAction -attr showDividers -attr showText -attr showTitle -attr singleChoiceItemLayout -attr spinBars -attr spinnerDropDownItemStyle -attr spinnerStyle -attr splitTrack -attr srcCompat -attr state_above_anchor -attr subMenuArrow -attr submitBackground -attr subtitle -attr subtitleTextAppearance -attr subtitleTextColor -attr subtitleTextStyle -attr suggestionRowLayout -attr switchMinWidth -attr switchPadding -attr switchStyle -attr switchTextAppearance -attr textAllCaps -attr textAppearanceLargePopupMenu -attr textAppearanceListItem -attr textAppearanceListItemSecondary -attr textAppearanceListItemSmall -attr textAppearancePopupMenuHeader -attr textAppearanceSearchResultSubtitle -attr textAppearanceSearchResultTitle -attr textAppearanceSmallPopupMenu -attr textColorAlertDialogListItem -attr textColorSearchUrl -attr textLocale -attr theme -attr thickness -attr thumbTextPadding -attr thumbTint -attr thumbTintMode -attr tickMark -attr tickMarkTint -attr tickMarkTintMode -attr tint -attr tintMode -attr title -attr titleMargin -attr titleMarginBottom -attr titleMarginEnd -attr titleMarginStart -attr titleMarginTop -attr titleMargins -attr titleTextAppearance -attr titleTextColor -attr titleTextStyle -attr toolbarNavigationButtonStyle -attr toolbarStyle -attr tooltipForegroundColor -attr tooltipFrameBackground -attr tooltipText -attr track -attr trackTint -attr trackTintMode -attr ttcIndex -attr viewAspectRatio -attr viewInflaterClass -attr voiceIcon -attr windowActionBar -attr windowActionBarOverlay -attr windowActionModeOverlay -attr windowFixedHeightMajor -attr windowFixedHeightMinor -attr windowFixedWidthMajor -attr windowFixedWidthMinor -attr windowMinWidthMajor -attr windowMinWidthMinor -attr windowNoTitle -bool abc_action_bar_embed_tabs -bool abc_allow_stacked_button_bar -bool abc_config_actionMenuItemAllCaps -color abc_background_cache_hint_selector_material_dark -color abc_background_cache_hint_selector_material_light -color abc_btn_colored_borderless_text_material -color abc_btn_colored_text_material -color abc_color_highlight_material -color abc_hint_foreground_material_dark -color abc_hint_foreground_material_light -color abc_input_method_navigation_guard -color abc_primary_text_disable_only_material_dark -color abc_primary_text_disable_only_material_light -color abc_primary_text_material_dark -color abc_primary_text_material_light -color abc_search_url_text -color abc_search_url_text_normal -color abc_search_url_text_pressed -color abc_search_url_text_selected -color abc_secondary_text_material_dark -color abc_secondary_text_material_light -color abc_tint_btn_checkable -color abc_tint_default -color abc_tint_edittext -color abc_tint_seek_thumb -color abc_tint_spinner -color abc_tint_switch_track -color accent_material_dark -color accent_material_light -color background_floating_material_dark -color background_floating_material_light -color background_material_dark -color background_material_light -color bright_foreground_disabled_material_dark -color bright_foreground_disabled_material_light -color bright_foreground_inverse_material_dark -color bright_foreground_inverse_material_light -color bright_foreground_material_dark -color bright_foreground_material_light -color button_material_dark -color button_material_light -color catalyst_logbox_background -color catalyst_redbox_background -color dim_foreground_disabled_material_dark -color dim_foreground_disabled_material_light -color dim_foreground_material_dark -color dim_foreground_material_light -color error_color_material_dark -color error_color_material_light -color foreground_material_dark -color foreground_material_light -color highlighted_text_material_dark -color highlighted_text_material_light -color material_blue_grey_800 -color material_blue_grey_900 -color material_blue_grey_950 -color material_deep_teal_200 -color material_deep_teal_500 -color material_grey_100 -color material_grey_300 -color material_grey_50 -color material_grey_600 -color material_grey_800 -color material_grey_850 -color material_grey_900 -color notification_action_color_filter -color notification_icon_bg_color -color primary_dark_material_dark -color primary_dark_material_light -color primary_material_dark -color primary_material_light -color primary_text_default_material_dark -color primary_text_default_material_light -color primary_text_disabled_material_dark -color primary_text_disabled_material_light -color ripple_material_dark -color ripple_material_light -color secondary_text_default_material_dark -color secondary_text_default_material_light -color secondary_text_disabled_material_dark -color secondary_text_disabled_material_light -color switch_thumb_disabled_material_dark -color switch_thumb_disabled_material_light -color switch_thumb_material_dark -color switch_thumb_material_light -color switch_thumb_normal_material_dark -color switch_thumb_normal_material_light -color tooltip_background_dark -color tooltip_background_light -dimen abc_action_bar_content_inset_material -dimen abc_action_bar_content_inset_with_nav -dimen abc_action_bar_default_height_material -dimen abc_action_bar_default_padding_end_material -dimen abc_action_bar_default_padding_start_material -dimen abc_action_bar_elevation_material -dimen abc_action_bar_icon_vertical_padding_material -dimen abc_action_bar_overflow_padding_end_material -dimen abc_action_bar_overflow_padding_start_material -dimen abc_action_bar_stacked_max_height -dimen abc_action_bar_stacked_tab_max_width -dimen abc_action_bar_subtitle_bottom_margin_material -dimen abc_action_bar_subtitle_top_margin_material -dimen abc_action_button_min_height_material -dimen abc_action_button_min_width_material -dimen abc_action_button_min_width_overflow_material -dimen abc_alert_dialog_button_bar_height -dimen abc_alert_dialog_button_dimen -dimen abc_button_inset_horizontal_material -dimen abc_button_inset_vertical_material -dimen abc_button_padding_horizontal_material -dimen abc_button_padding_vertical_material -dimen abc_cascading_menus_min_smallest_width -dimen abc_config_prefDialogWidth -dimen abc_control_corner_material -dimen abc_control_inset_material -dimen abc_control_padding_material -dimen abc_dialog_corner_radius_material -dimen abc_dialog_fixed_height_major -dimen abc_dialog_fixed_height_minor -dimen abc_dialog_fixed_width_major -dimen abc_dialog_fixed_width_minor -dimen abc_dialog_list_padding_bottom_no_buttons -dimen abc_dialog_list_padding_top_no_title -dimen abc_dialog_min_width_major -dimen abc_dialog_min_width_minor -dimen abc_dialog_padding_material -dimen abc_dialog_padding_top_material -dimen abc_dialog_title_divider_material -dimen abc_disabled_alpha_material_dark -dimen abc_disabled_alpha_material_light -dimen abc_dropdownitem_icon_width -dimen abc_dropdownitem_text_padding_left -dimen abc_dropdownitem_text_padding_right -dimen abc_edit_text_inset_bottom_material -dimen abc_edit_text_inset_horizontal_material -dimen abc_edit_text_inset_top_material -dimen abc_floating_window_z -dimen abc_list_item_height_large_material -dimen abc_list_item_height_material -dimen abc_list_item_height_small_material -dimen abc_list_item_padding_horizontal_material -dimen abc_panel_menu_list_width -dimen abc_progress_bar_height_material -dimen abc_search_view_preferred_height -dimen abc_search_view_preferred_width -dimen abc_seekbar_track_background_height_material -dimen abc_seekbar_track_progress_height_material -dimen abc_select_dialog_padding_start_material -dimen abc_switch_padding -dimen abc_text_size_body_1_material -dimen abc_text_size_body_2_material -dimen abc_text_size_button_material -dimen abc_text_size_caption_material -dimen abc_text_size_display_1_material -dimen abc_text_size_display_2_material -dimen abc_text_size_display_3_material -dimen abc_text_size_display_4_material -dimen abc_text_size_headline_material -dimen abc_text_size_large_material -dimen abc_text_size_medium_material -dimen abc_text_size_menu_header_material -dimen abc_text_size_menu_material -dimen abc_text_size_small_material -dimen abc_text_size_subhead_material -dimen abc_text_size_subtitle_material_toolbar -dimen abc_text_size_title_material -dimen abc_text_size_title_material_toolbar -dimen compat_button_inset_horizontal_material -dimen compat_button_inset_vertical_material -dimen compat_button_padding_horizontal_material -dimen compat_button_padding_vertical_material -dimen compat_control_corner_material -dimen compat_notification_large_icon_max_height -dimen compat_notification_large_icon_max_width -dimen disabled_alpha_material_dark -dimen disabled_alpha_material_light -dimen highlight_alpha_material_colored -dimen highlight_alpha_material_dark -dimen highlight_alpha_material_light -dimen hint_alpha_material_dark -dimen hint_alpha_material_light -dimen hint_pressed_alpha_material_dark -dimen hint_pressed_alpha_material_light -dimen notification_action_icon_size -dimen notification_action_text_size -dimen notification_big_circle_margin -dimen notification_content_margin_start -dimen notification_large_icon_height -dimen notification_large_icon_width -dimen notification_main_column_padding_top -dimen notification_media_narrow_margin -dimen notification_right_icon_size -dimen notification_right_side_padding_top -dimen notification_small_icon_background_padding -dimen notification_small_icon_size_as_large -dimen notification_subtext_size -dimen notification_top_pad -dimen notification_top_pad_large_text -dimen tooltip_corner_radius -dimen tooltip_horizontal_padding -dimen tooltip_margin -dimen tooltip_precise_anchor_extra_offset -dimen tooltip_precise_anchor_threshold -dimen tooltip_vertical_padding -dimen tooltip_y_offset_non_touch -dimen tooltip_y_offset_touch -drawable abc_ab_share_pack_mtrl_alpha -drawable abc_action_bar_item_background_material -drawable abc_btn_borderless_material -drawable abc_btn_check_material -drawable abc_btn_check_material_anim -drawable abc_btn_check_to_on_mtrl_000 -drawable abc_btn_check_to_on_mtrl_015 -drawable abc_btn_colored_material -drawable abc_btn_default_mtrl_shape -drawable abc_btn_radio_material -drawable abc_btn_radio_material_anim -drawable abc_btn_radio_to_on_mtrl_000 -drawable abc_btn_radio_to_on_mtrl_015 -drawable abc_btn_switch_to_on_mtrl_00001 -drawable abc_btn_switch_to_on_mtrl_00012 -drawable abc_cab_background_internal_bg -drawable abc_cab_background_top_material -drawable abc_cab_background_top_mtrl_alpha -drawable abc_control_background_material -drawable abc_dialog_material_background -drawable abc_edit_text_material -drawable abc_ic_ab_back_material -drawable abc_ic_arrow_drop_right_black_24dp -drawable abc_ic_clear_material -drawable abc_ic_commit_search_api_mtrl_alpha -drawable abc_ic_go_search_api_material -drawable abc_ic_menu_copy_mtrl_am_alpha -drawable abc_ic_menu_cut_mtrl_alpha -drawable abc_ic_menu_overflow_material -drawable abc_ic_menu_paste_mtrl_am_alpha -drawable abc_ic_menu_selectall_mtrl_alpha -drawable abc_ic_menu_share_mtrl_alpha -drawable abc_ic_search_api_material -drawable abc_ic_star_black_16dp -drawable abc_ic_star_black_36dp -drawable abc_ic_star_black_48dp -drawable abc_ic_star_half_black_16dp -drawable abc_ic_star_half_black_36dp -drawable abc_ic_star_half_black_48dp -drawable abc_ic_voice_search_api_material -drawable abc_item_background_holo_dark -drawable abc_item_background_holo_light -drawable abc_list_divider_material -drawable abc_list_divider_mtrl_alpha -drawable abc_list_focused_holo -drawable abc_list_longpressed_holo -drawable abc_list_pressed_holo_dark -drawable abc_list_pressed_holo_light -drawable abc_list_selector_background_transition_holo_dark -drawable abc_list_selector_background_transition_holo_light -drawable abc_list_selector_disabled_holo_dark -drawable abc_list_selector_disabled_holo_light -drawable abc_list_selector_holo_dark -drawable abc_list_selector_holo_light -drawable abc_menu_hardkey_panel_mtrl_mult -drawable abc_popup_background_mtrl_mult -drawable abc_ratingbar_indicator_material -drawable abc_ratingbar_material -drawable abc_ratingbar_small_material -drawable abc_scrubber_control_off_mtrl_alpha -drawable abc_scrubber_control_to_pressed_mtrl_000 -drawable abc_scrubber_control_to_pressed_mtrl_005 -drawable abc_scrubber_primary_mtrl_alpha -drawable abc_scrubber_track_mtrl_alpha -drawable abc_seekbar_thumb_material -drawable abc_seekbar_tick_mark_material -drawable abc_seekbar_track_material -drawable abc_spinner_mtrl_am_alpha -drawable abc_spinner_textfield_background_material -drawable abc_switch_thumb_material -drawable abc_switch_track_mtrl_alpha -drawable abc_tab_indicator_material -drawable abc_tab_indicator_mtrl_alpha -drawable abc_text_cursor_material -drawable abc_text_select_handle_left_mtrl_dark -drawable abc_text_select_handle_left_mtrl_light -drawable abc_text_select_handle_middle_mtrl_dark -drawable abc_text_select_handle_middle_mtrl_light -drawable abc_text_select_handle_right_mtrl_dark -drawable abc_text_select_handle_right_mtrl_light -drawable abc_textfield_activated_mtrl_alpha -drawable abc_textfield_default_mtrl_alpha -drawable abc_textfield_search_activated_mtrl_alpha -drawable abc_textfield_search_default_mtrl_alpha -drawable abc_textfield_search_material -drawable abc_vector_test -drawable btn_checkbox_checked_mtrl -drawable btn_checkbox_checked_to_unchecked_mtrl_animation -drawable btn_checkbox_unchecked_mtrl -drawable btn_checkbox_unchecked_to_checked_mtrl_animation -drawable btn_radio_off_mtrl -drawable btn_radio_off_to_on_mtrl_animation -drawable btn_radio_on_mtrl -drawable btn_radio_on_to_off_mtrl_animation -drawable notification_action_background -drawable notification_bg -drawable notification_bg_low -drawable notification_bg_low_normal -drawable notification_bg_low_pressed -drawable notification_bg_normal -drawable notification_bg_normal_pressed -drawable notification_icon_background -drawable notification_template_icon_bg -drawable notification_template_icon_low_bg -drawable notification_tile_bg -drawable notify_panel_notification_icon_bg -drawable redbox_top_border_background -drawable tooltip_frame_dark -drawable tooltip_frame_light -id ALT -id CTRL -id FUNCTION -id META -id SHIFT -id SYM -id accessibility_action_clickable_span -id accessibility_actions -id accessibility_custom_action_0 -id accessibility_custom_action_1 -id accessibility_custom_action_10 -id accessibility_custom_action_11 -id accessibility_custom_action_12 -id accessibility_custom_action_13 -id accessibility_custom_action_14 -id accessibility_custom_action_15 -id accessibility_custom_action_16 -id accessibility_custom_action_17 -id accessibility_custom_action_18 -id accessibility_custom_action_19 -id accessibility_custom_action_2 -id accessibility_custom_action_20 -id accessibility_custom_action_21 -id accessibility_custom_action_22 -id accessibility_custom_action_23 -id accessibility_custom_action_24 -id accessibility_custom_action_25 -id accessibility_custom_action_26 -id accessibility_custom_action_27 -id accessibility_custom_action_28 -id accessibility_custom_action_29 -id accessibility_custom_action_3 -id accessibility_custom_action_30 -id accessibility_custom_action_31 -id accessibility_custom_action_4 -id accessibility_custom_action_5 -id accessibility_custom_action_6 -id accessibility_custom_action_7 -id accessibility_custom_action_8 -id accessibility_custom_action_9 -id accessibility_hint -id accessibility_label -id accessibility_role -id accessibility_state -id accessibility_value -id action_bar -id action_bar_activity_content -id action_bar_container -id action_bar_root -id action_bar_spinner -id action_bar_subtitle -id action_bar_title -id action_container -id action_context_bar -id action_divider -id action_image -id action_menu_divider -id action_menu_presenter -id action_mode_bar -id action_mode_bar_stub -id action_mode_close_button -id action_text -id actions -id activity_chooser_view_content -id add -id alertTitle -id always -id async -id beginning -id blocking -id bottom -id buttonPanel -id catalyst_redbox_title -id center -id centerCrop -id centerInside -id center_vertical -id checkbox -id checked -id chronometer -id collapseActionView -id content -id contentPanel -id custom -id customPanel -id decor_content_parent -id default_activity_button -id dialog_button -id disableHome -id edit_query -id end -id expand_activities_button -id expanded_menu -id fitBottomStart -id fitCenter -id fitEnd -id fitStart -id fitXY -id flipper_skip_empty_view_group_traversal -id flipper_skip_view_traversal -id focusCrop -id forever -id fps_text -id group_divider -id home -id homeAsUp -id icon -id icon_group -id ifRoom -id image -id info -id italic -id line1 -id line3 -id listMode -id list_item -id message -id middle -id multiply -id never -id none -id normal -id notification_background -id notification_main_column -id notification_main_column_container -id off -id on -id parentPanel -id progress_circular -id progress_horizontal -id radio -id react_test_id -id right_icon -id right_side -id rn_frame_file -id rn_frame_method -id rn_redbox_dismiss_button -id rn_redbox_line_separator -id rn_redbox_loading_indicator -id rn_redbox_reload_button -id rn_redbox_report_button -id rn_redbox_report_label -id rn_redbox_stack -id screen -id scrollIndicatorDown -id scrollIndicatorUp -id scrollView -id search_badge -id search_bar -id search_button -id search_close_btn -id search_edit_frame -id search_go_btn -id search_mag_icon -id search_plate -id search_src_text -id search_voice_btn -id select_dialog_listview -id shortcut -id showCustom -id showHome -id showTitle -id spacer -id split_action_bar -id src_atop -id src_in -id src_over -id submenuarrow -id submit_area -id tabMode -id tag_accessibility_actions -id tag_accessibility_clickable_spans -id tag_accessibility_heading -id tag_accessibility_pane_title -id tag_screen_reader_focusable -id tag_transition_group -id tag_unhandled_key_event_manager -id tag_unhandled_key_listeners -id text -id text2 -id textSpacerNoButtons -id textSpacerNoTitle -id time -id title -id titleDividerNoCustom -id title_template -id top -id topPanel -id unchecked -id uniform -id up -id useLogo -id view_tag_instance_handle -id view_tag_native_id -id withText -id wrap_content -integer abc_config_activityDefaultDur -integer abc_config_activityShortDur -integer cancel_button_image_alpha -integer config_tooltipAnimTime -integer react_native_dev_server_port -integer react_native_inspector_proxy_port -integer status_bar_notification_info_maxnum -interpolator btn_checkbox_checked_mtrl_animation_interpolator_0 -interpolator btn_checkbox_checked_mtrl_animation_interpolator_1 -interpolator btn_checkbox_unchecked_mtrl_animation_interpolator_0 -interpolator btn_checkbox_unchecked_mtrl_animation_interpolator_1 -interpolator btn_radio_to_off_mtrl_animation_interpolator_0 -interpolator btn_radio_to_on_mtrl_animation_interpolator_0 -interpolator fast_out_slow_in -layout abc_action_bar_title_item -layout abc_action_bar_up_container -layout abc_action_menu_item_layout -layout abc_action_menu_layout -layout abc_action_mode_bar -layout abc_action_mode_close_item_material -layout abc_activity_chooser_view -layout abc_activity_chooser_view_list_item -layout abc_alert_dialog_button_bar_material -layout abc_alert_dialog_material -layout abc_alert_dialog_title_material -layout abc_cascading_menu_item_layout -layout abc_dialog_title_material -layout abc_expanded_menu_layout -layout abc_list_menu_item_checkbox -layout abc_list_menu_item_icon -layout abc_list_menu_item_layout -layout abc_list_menu_item_radio -layout abc_popup_menu_header_item_layout -layout abc_popup_menu_item_layout -layout abc_screen_content_include -layout abc_screen_simple -layout abc_screen_simple_overlay_action_mode -layout abc_screen_toolbar -layout abc_search_dropdown_item_icons_2line -layout abc_search_view -layout abc_select_dialog_material -layout abc_tooltip -layout custom_dialog -layout dev_loading_view -layout fps_view -layout notification_action -layout notification_action_tombstone -layout notification_template_custom_big -layout notification_template_icon_group -layout notification_template_part_chronometer -layout notification_template_part_time -layout redbox_item_frame -layout redbox_item_title -layout redbox_view -layout select_dialog_item_material -layout select_dialog_multichoice_material -layout select_dialog_singlechoice_material -layout support_simple_spinner_dropdown_item -mipmap ic_launcher -mipmap ic_launcher_round -string abc_action_bar_home_description -string abc_action_bar_up_description -string abc_action_menu_overflow_description -string abc_action_mode_done -string abc_activity_chooser_view_see_all -string abc_activitychooserview_choose_application -string abc_capital_off -string abc_capital_on -string abc_menu_alt_shortcut_label -string abc_menu_ctrl_shortcut_label -string abc_menu_delete_shortcut_label -string abc_menu_enter_shortcut_label -string abc_menu_function_shortcut_label -string abc_menu_meta_shortcut_label -string abc_menu_shift_shortcut_label -string abc_menu_space_shortcut_label -string abc_menu_sym_shortcut_label -string abc_prepend_shortcut_label -string abc_search_hint -string abc_searchview_description_clear -string abc_searchview_description_query -string abc_searchview_description_search -string abc_searchview_description_submit -string abc_searchview_description_voice -string abc_shareactionprovider_share_with -string abc_shareactionprovider_share_with_application -string abc_toolbar_collapse_description -string alert_description -string app_name -string button_description -string catalyst_change_bundle_location -string catalyst_copy_button -string catalyst_debug -string catalyst_debug_chrome -string catalyst_debug_chrome_stop -string catalyst_debug_connecting -string catalyst_debug_error -string catalyst_debug_open -string catalyst_debug_stop -string catalyst_devtools_open -string catalyst_dismiss_button -string catalyst_heap_capture -string catalyst_hot_reloading -string catalyst_hot_reloading_auto_disable -string catalyst_hot_reloading_auto_enable -string catalyst_hot_reloading_stop -string catalyst_inspector -string catalyst_loading_from_url -string catalyst_open_flipper_error -string catalyst_perf_monitor -string catalyst_perf_monitor_stop -string catalyst_reload -string catalyst_reload_button -string catalyst_reload_error -string catalyst_report_button -string catalyst_sample_profiler_disable -string catalyst_sample_profiler_enable -string catalyst_settings -string catalyst_settings_title -string combobox_description -string header_description -string image_description -string imagebutton_description -string link_description -string menu_description -string menubar_description -string menuitem_description -string progressbar_description -string radiogroup_description -string rn_tab_description -string scrollbar_description -string search_description -string search_menu_title -string spinbutton_description -string state_busy_description -string state_collapsed_description -string state_expanded_description -string state_mixed_description -string state_off_description -string state_on_description -string status_bar_notification_info_overflow -string summary_description -string tablist_description -string timer_description -string toolbar_description -style AlertDialog_AppCompat -style AlertDialog_AppCompat_Light -style Animation_AppCompat_Dialog -style Animation_AppCompat_DropDownUp -style Animation_AppCompat_Tooltip -style Animation_Catalyst_LogBox -style Animation_Catalyst_RedBox -style AppTheme -style Base_AlertDialog_AppCompat -style Base_AlertDialog_AppCompat_Light -style Base_Animation_AppCompat_Dialog -style Base_Animation_AppCompat_DropDownUp -style Base_Animation_AppCompat_Tooltip -style Base_DialogWindowTitle_AppCompat -style Base_DialogWindowTitleBackground_AppCompat -style Base_TextAppearance_AppCompat -style Base_TextAppearance_AppCompat_Body1 -style Base_TextAppearance_AppCompat_Body2 -style Base_TextAppearance_AppCompat_Button -style Base_TextAppearance_AppCompat_Caption -style Base_TextAppearance_AppCompat_Display1 -style Base_TextAppearance_AppCompat_Display2 -style Base_TextAppearance_AppCompat_Display3 -style Base_TextAppearance_AppCompat_Display4 -style Base_TextAppearance_AppCompat_Headline -style Base_TextAppearance_AppCompat_Inverse -style Base_TextAppearance_AppCompat_Large -style Base_TextAppearance_AppCompat_Large_Inverse -style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Large -style Base_TextAppearance_AppCompat_Light_Widget_PopupMenu_Small -style Base_TextAppearance_AppCompat_Medium -style Base_TextAppearance_AppCompat_Medium_Inverse -style Base_TextAppearance_AppCompat_Menu -style Base_TextAppearance_AppCompat_SearchResult -style Base_TextAppearance_AppCompat_SearchResult_Subtitle -style Base_TextAppearance_AppCompat_SearchResult_Title -style Base_TextAppearance_AppCompat_Small -style Base_TextAppearance_AppCompat_Small_Inverse -style Base_TextAppearance_AppCompat_Subhead -style Base_TextAppearance_AppCompat_Subhead_Inverse -style Base_TextAppearance_AppCompat_Title -style Base_TextAppearance_AppCompat_Title_Inverse -style Base_TextAppearance_AppCompat_Tooltip -style Base_TextAppearance_AppCompat_Widget_ActionBar_Menu -style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle -style Base_TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse -style Base_TextAppearance_AppCompat_Widget_ActionBar_Title -style Base_TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse -style Base_TextAppearance_AppCompat_Widget_ActionMode_Subtitle -style Base_TextAppearance_AppCompat_Widget_ActionMode_Title -style Base_TextAppearance_AppCompat_Widget_Button -style Base_TextAppearance_AppCompat_Widget_Button_Borderless_Colored -style Base_TextAppearance_AppCompat_Widget_Button_Colored -style Base_TextAppearance_AppCompat_Widget_Button_Inverse -style Base_TextAppearance_AppCompat_Widget_DropDownItem -style Base_TextAppearance_AppCompat_Widget_PopupMenu_Header -style Base_TextAppearance_AppCompat_Widget_PopupMenu_Large -style Base_TextAppearance_AppCompat_Widget_PopupMenu_Small -style Base_TextAppearance_AppCompat_Widget_Switch -style Base_TextAppearance_AppCompat_Widget_TextView_SpinnerItem -style Base_TextAppearance_Widget_AppCompat_ExpandedMenu_Item -style Base_TextAppearance_Widget_AppCompat_Toolbar_Subtitle -style Base_TextAppearance_Widget_AppCompat_Toolbar_Title -style Base_Theme_AppCompat -style Base_Theme_AppCompat_CompactMenu -style Base_Theme_AppCompat_Dialog -style Base_Theme_AppCompat_Dialog_Alert -style Base_Theme_AppCompat_Dialog_FixedSize -style Base_Theme_AppCompat_Dialog_MinWidth -style Base_Theme_AppCompat_DialogWhenLarge -style Base_Theme_AppCompat_Light -style Base_Theme_AppCompat_Light_DarkActionBar -style Base_Theme_AppCompat_Light_Dialog -style Base_Theme_AppCompat_Light_Dialog_Alert -style Base_Theme_AppCompat_Light_Dialog_FixedSize -style Base_Theme_AppCompat_Light_Dialog_MinWidth -style Base_Theme_AppCompat_Light_DialogWhenLarge -style Base_ThemeOverlay_AppCompat -style Base_ThemeOverlay_AppCompat_ActionBar -style Base_ThemeOverlay_AppCompat_Dark -style Base_ThemeOverlay_AppCompat_Dark_ActionBar -style Base_ThemeOverlay_AppCompat_Dialog -style Base_ThemeOverlay_AppCompat_Dialog_Alert -style Base_ThemeOverlay_AppCompat_Light -style Base_V21_Theme_AppCompat -style Base_V21_Theme_AppCompat_Dialog -style Base_V21_Theme_AppCompat_Light -style Base_V21_Theme_AppCompat_Light_Dialog -style Base_V21_ThemeOverlay_AppCompat_Dialog -style Base_V22_Theme_AppCompat -style Base_V22_Theme_AppCompat_Light -style Base_V23_Theme_AppCompat -style Base_V23_Theme_AppCompat_Light -style Base_V26_Theme_AppCompat -style Base_V26_Theme_AppCompat_Light -style Base_V26_Widget_AppCompat_Toolbar -style Base_V28_Theme_AppCompat -style Base_V28_Theme_AppCompat_Light -style Base_V7_Theme_AppCompat -style Base_V7_Theme_AppCompat_Dialog -style Base_V7_Theme_AppCompat_Light -style Base_V7_Theme_AppCompat_Light_Dialog -style Base_V7_ThemeOverlay_AppCompat_Dialog -style Base_V7_Widget_AppCompat_AutoCompleteTextView -style Base_V7_Widget_AppCompat_EditText -style Base_V7_Widget_AppCompat_Toolbar -style Base_Widget_AppCompat_ActionBar -style Base_Widget_AppCompat_ActionBar_Solid -style Base_Widget_AppCompat_ActionBar_TabBar -style Base_Widget_AppCompat_ActionBar_TabText -style Base_Widget_AppCompat_ActionBar_TabView -style Base_Widget_AppCompat_ActionButton -style Base_Widget_AppCompat_ActionButton_CloseMode -style Base_Widget_AppCompat_ActionButton_Overflow -style Base_Widget_AppCompat_ActionMode -style Base_Widget_AppCompat_ActivityChooserView -style Base_Widget_AppCompat_AutoCompleteTextView -style Base_Widget_AppCompat_Button -style Base_Widget_AppCompat_Button_Borderless -style Base_Widget_AppCompat_Button_Borderless_Colored -style Base_Widget_AppCompat_Button_ButtonBar_AlertDialog -style Base_Widget_AppCompat_Button_Colored -style Base_Widget_AppCompat_Button_Small -style Base_Widget_AppCompat_ButtonBar -style Base_Widget_AppCompat_ButtonBar_AlertDialog -style Base_Widget_AppCompat_CompoundButton_CheckBox -style Base_Widget_AppCompat_CompoundButton_RadioButton -style Base_Widget_AppCompat_CompoundButton_Switch -style Base_Widget_AppCompat_DrawerArrowToggle -style Base_Widget_AppCompat_DrawerArrowToggle_Common -style Base_Widget_AppCompat_DropDownItem_Spinner -style Base_Widget_AppCompat_EditText -style Base_Widget_AppCompat_ImageButton -style Base_Widget_AppCompat_Light_ActionBar -style Base_Widget_AppCompat_Light_ActionBar_Solid -style Base_Widget_AppCompat_Light_ActionBar_TabBar -style Base_Widget_AppCompat_Light_ActionBar_TabText -style Base_Widget_AppCompat_Light_ActionBar_TabText_Inverse -style Base_Widget_AppCompat_Light_ActionBar_TabView -style Base_Widget_AppCompat_Light_PopupMenu -style Base_Widget_AppCompat_Light_PopupMenu_Overflow -style Base_Widget_AppCompat_ListMenuView -style Base_Widget_AppCompat_ListPopupWindow -style Base_Widget_AppCompat_ListView -style Base_Widget_AppCompat_ListView_DropDown -style Base_Widget_AppCompat_ListView_Menu -style Base_Widget_AppCompat_PopupMenu -style Base_Widget_AppCompat_PopupMenu_Overflow -style Base_Widget_AppCompat_PopupWindow -style Base_Widget_AppCompat_ProgressBar -style Base_Widget_AppCompat_ProgressBar_Horizontal -style Base_Widget_AppCompat_RatingBar -style Base_Widget_AppCompat_RatingBar_Indicator -style Base_Widget_AppCompat_RatingBar_Small -style Base_Widget_AppCompat_SearchView -style Base_Widget_AppCompat_SearchView_ActionBar -style Base_Widget_AppCompat_SeekBar -style Base_Widget_AppCompat_SeekBar_Discrete -style Base_Widget_AppCompat_Spinner -style Base_Widget_AppCompat_Spinner_Underlined -style Base_Widget_AppCompat_TextView -style Base_Widget_AppCompat_TextView_SpinnerItem -style Base_Widget_AppCompat_Toolbar -style Base_Widget_AppCompat_Toolbar_Button_Navigation -style CalendarDatePickerDialog -style CalendarDatePickerStyle -style DialogAnimationFade -style DialogAnimationSlide -style Platform_AppCompat -style Platform_AppCompat_Light -style Platform_ThemeOverlay_AppCompat -style Platform_ThemeOverlay_AppCompat_Dark -style Platform_ThemeOverlay_AppCompat_Light -style Platform_V21_AppCompat -style Platform_V21_AppCompat_Light -style Platform_V25_AppCompat -style Platform_V25_AppCompat_Light -style Platform_Widget_AppCompat_Spinner -style RtlOverlay_DialogWindowTitle_AppCompat -style RtlOverlay_Widget_AppCompat_ActionBar_TitleItem -style RtlOverlay_Widget_AppCompat_DialogTitle_Icon -style RtlOverlay_Widget_AppCompat_PopupMenuItem -style RtlOverlay_Widget_AppCompat_PopupMenuItem_InternalGroup -style RtlOverlay_Widget_AppCompat_PopupMenuItem_Shortcut -style RtlOverlay_Widget_AppCompat_PopupMenuItem_SubmenuArrow -style RtlOverlay_Widget_AppCompat_PopupMenuItem_Text -style RtlOverlay_Widget_AppCompat_PopupMenuItem_Title -style RtlOverlay_Widget_AppCompat_Search_DropDown -style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon1 -style RtlOverlay_Widget_AppCompat_Search_DropDown_Icon2 -style RtlOverlay_Widget_AppCompat_Search_DropDown_Query -style RtlOverlay_Widget_AppCompat_Search_DropDown_Text -style RtlOverlay_Widget_AppCompat_SearchView_MagIcon -style RtlUnderlay_Widget_AppCompat_ActionButton -style RtlUnderlay_Widget_AppCompat_ActionButton_Overflow -style SpinnerDatePickerDialog -style SpinnerDatePickerStyle -style TextAppearance_AppCompat -style TextAppearance_AppCompat_Body1 -style TextAppearance_AppCompat_Body2 -style TextAppearance_AppCompat_Button -style TextAppearance_AppCompat_Caption -style TextAppearance_AppCompat_Display1 -style TextAppearance_AppCompat_Display2 -style TextAppearance_AppCompat_Display3 -style TextAppearance_AppCompat_Display4 -style TextAppearance_AppCompat_Headline -style TextAppearance_AppCompat_Inverse -style TextAppearance_AppCompat_Large -style TextAppearance_AppCompat_Large_Inverse -style TextAppearance_AppCompat_Light_SearchResult_Subtitle -style TextAppearance_AppCompat_Light_SearchResult_Title -style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large -style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small -style TextAppearance_AppCompat_Medium -style TextAppearance_AppCompat_Medium_Inverse -style TextAppearance_AppCompat_Menu -style TextAppearance_AppCompat_SearchResult_Subtitle -style TextAppearance_AppCompat_SearchResult_Title -style TextAppearance_AppCompat_Small -style TextAppearance_AppCompat_Small_Inverse -style TextAppearance_AppCompat_Subhead -style TextAppearance_AppCompat_Subhead_Inverse -style TextAppearance_AppCompat_Title -style TextAppearance_AppCompat_Title_Inverse -style TextAppearance_AppCompat_Tooltip -style TextAppearance_AppCompat_Widget_ActionBar_Menu -style TextAppearance_AppCompat_Widget_ActionBar_Subtitle -style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse -style TextAppearance_AppCompat_Widget_ActionBar_Title -style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse -style TextAppearance_AppCompat_Widget_ActionMode_Subtitle -style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse -style TextAppearance_AppCompat_Widget_ActionMode_Title -style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse -style TextAppearance_AppCompat_Widget_Button -style TextAppearance_AppCompat_Widget_Button_Borderless_Colored -style TextAppearance_AppCompat_Widget_Button_Colored -style TextAppearance_AppCompat_Widget_Button_Inverse -style TextAppearance_AppCompat_Widget_DropDownItem -style TextAppearance_AppCompat_Widget_PopupMenu_Header -style TextAppearance_AppCompat_Widget_PopupMenu_Large -style TextAppearance_AppCompat_Widget_PopupMenu_Small -style TextAppearance_AppCompat_Widget_Switch -style TextAppearance_AppCompat_Widget_TextView_SpinnerItem -style TextAppearance_Compat_Notification -style TextAppearance_Compat_Notification_Info -style TextAppearance_Compat_Notification_Line2 -style TextAppearance_Compat_Notification_Time -style TextAppearance_Compat_Notification_Title -style TextAppearance_Widget_AppCompat_ExpandedMenu_Item -style TextAppearance_Widget_AppCompat_Toolbar_Subtitle -style TextAppearance_Widget_AppCompat_Toolbar_Title -style Theme -style Theme_AppCompat -style Theme_AppCompat_CompactMenu -style Theme_AppCompat_DayNight -style Theme_AppCompat_DayNight_DarkActionBar -style Theme_AppCompat_DayNight_Dialog -style Theme_AppCompat_DayNight_Dialog_Alert -style Theme_AppCompat_DayNight_Dialog_MinWidth -style Theme_AppCompat_DayNight_DialogWhenLarge -style Theme_AppCompat_DayNight_NoActionBar -style Theme_AppCompat_Dialog -style Theme_AppCompat_Dialog_Alert -style Theme_AppCompat_Dialog_MinWidth -style Theme_AppCompat_DialogWhenLarge -style Theme_AppCompat_Light -style Theme_AppCompat_Light_DarkActionBar -style Theme_AppCompat_Light_Dialog -style Theme_AppCompat_Light_Dialog_Alert -style Theme_AppCompat_Light_Dialog_MinWidth -style Theme_AppCompat_Light_DialogWhenLarge -style Theme_AppCompat_Light_NoActionBar -style Theme_AppCompat_NoActionBar -style Theme_Catalyst -style Theme_Catalyst_LogBox -style Theme_Catalyst_RedBox -style Theme_FullScreenDialog -style Theme_FullScreenDialogAnimatedFade -style Theme_FullScreenDialogAnimatedSlide -style Theme_ReactNative_AppCompat_Light -style Theme_ReactNative_AppCompat_Light_NoActionBar_FullScreen -style ThemeOverlay_AppCompat -style ThemeOverlay_AppCompat_ActionBar -style ThemeOverlay_AppCompat_Dark -style ThemeOverlay_AppCompat_Dark_ActionBar -style ThemeOverlay_AppCompat_DayNight -style ThemeOverlay_AppCompat_DayNight_ActionBar -style ThemeOverlay_AppCompat_Dialog -style ThemeOverlay_AppCompat_Dialog_Alert -style ThemeOverlay_AppCompat_Light -style Widget_AppCompat_ActionBar -style Widget_AppCompat_ActionBar_Solid -style Widget_AppCompat_ActionBar_TabBar -style Widget_AppCompat_ActionBar_TabText -style Widget_AppCompat_ActionBar_TabView -style Widget_AppCompat_ActionButton -style Widget_AppCompat_ActionButton_CloseMode -style Widget_AppCompat_ActionButton_Overflow -style Widget_AppCompat_ActionMode -style Widget_AppCompat_ActivityChooserView -style Widget_AppCompat_AutoCompleteTextView -style Widget_AppCompat_Button -style Widget_AppCompat_Button_Borderless -style Widget_AppCompat_Button_Borderless_Colored -style Widget_AppCompat_Button_ButtonBar_AlertDialog -style Widget_AppCompat_Button_Colored -style Widget_AppCompat_Button_Small -style Widget_AppCompat_ButtonBar -style Widget_AppCompat_ButtonBar_AlertDialog -style Widget_AppCompat_CompoundButton_CheckBox -style Widget_AppCompat_CompoundButton_RadioButton -style Widget_AppCompat_CompoundButton_Switch -style Widget_AppCompat_DrawerArrowToggle -style Widget_AppCompat_DropDownItem_Spinner -style Widget_AppCompat_EditText -style Widget_AppCompat_ImageButton -style Widget_AppCompat_Light_ActionBar -style Widget_AppCompat_Light_ActionBar_Solid -style Widget_AppCompat_Light_ActionBar_Solid_Inverse -style Widget_AppCompat_Light_ActionBar_TabBar -style Widget_AppCompat_Light_ActionBar_TabBar_Inverse -style Widget_AppCompat_Light_ActionBar_TabText -style Widget_AppCompat_Light_ActionBar_TabText_Inverse -style Widget_AppCompat_Light_ActionBar_TabView -style Widget_AppCompat_Light_ActionBar_TabView_Inverse -style Widget_AppCompat_Light_ActionButton -style Widget_AppCompat_Light_ActionButton_CloseMode -style Widget_AppCompat_Light_ActionButton_Overflow -style Widget_AppCompat_Light_ActionMode_Inverse -style Widget_AppCompat_Light_ActivityChooserView -style Widget_AppCompat_Light_AutoCompleteTextView -style Widget_AppCompat_Light_DropDownItem_Spinner -style Widget_AppCompat_Light_ListPopupWindow -style Widget_AppCompat_Light_ListView_DropDown -style Widget_AppCompat_Light_PopupMenu -style Widget_AppCompat_Light_PopupMenu_Overflow -style Widget_AppCompat_Light_SearchView -style Widget_AppCompat_Light_Spinner_DropDown_ActionBar -style Widget_AppCompat_ListMenuView -style Widget_AppCompat_ListPopupWindow -style Widget_AppCompat_ListView -style Widget_AppCompat_ListView_DropDown -style Widget_AppCompat_ListView_Menu -style Widget_AppCompat_PopupMenu -style Widget_AppCompat_PopupMenu_Overflow -style Widget_AppCompat_PopupWindow -style Widget_AppCompat_ProgressBar -style Widget_AppCompat_ProgressBar_Horizontal -style Widget_AppCompat_RatingBar -style Widget_AppCompat_RatingBar_Indicator -style Widget_AppCompat_RatingBar_Small -style Widget_AppCompat_SearchView -style Widget_AppCompat_SearchView_ActionBar -style Widget_AppCompat_SeekBar -style Widget_AppCompat_SeekBar_Discrete -style Widget_AppCompat_Spinner -style Widget_AppCompat_Spinner_DropDown -style Widget_AppCompat_Spinner_DropDown_ActionBar -style Widget_AppCompat_Spinner_Underlined -style Widget_AppCompat_TextView -style Widget_AppCompat_TextView_SpinnerItem -style Widget_AppCompat_Toolbar -style Widget_AppCompat_Toolbar_Button_Navigation -style Widget_Compat_NotificationActionContainer -style Widget_Compat_NotificationActionText -style redboxButton -styleable ActionBar background backgroundSplit backgroundStacked contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation customNavigationLayout displayOptions divider elevation height hideOnContentScroll homeAsUpIndicator homeLayout icon indeterminateProgressStyle itemPadding logo navigationMode popupTheme progressBarPadding progressBarStyle subtitle subtitleTextStyle title titleTextStyle -styleable ActionBarLayout android_layout_gravity -styleable ActionMenuItemView android_minWidth -styleable ActionMenuView -styleable ActionMode background backgroundSplit closeItemLayout height subtitleTextStyle titleTextStyle -styleable ActivityChooserView expandActivityOverflowButtonDrawable initialActivityCount -styleable AlertDialog android_layout buttonIconDimen buttonPanelSideLayout listItemLayout listLayout multiChoiceItemLayout showTitle singleChoiceItemLayout -styleable AnimatedStateListDrawableCompat android_dither android_visible android_variablePadding android_constantSize android_enterFadeDuration android_exitFadeDuration -styleable AnimatedStateListDrawableItem android_id android_drawable -styleable AnimatedStateListDrawableTransition android_drawable android_toId android_fromId android_reversible -styleable AppCompatImageView android_src srcCompat tint tintMode -styleable AppCompatSeekBar android_thumb tickMark tickMarkTint tickMarkTintMode -styleable AppCompatTextHelper android_textAppearance android_drawableTop android_drawableBottom android_drawableLeft android_drawableRight android_drawableStart android_drawableEnd -styleable AppCompatTextView android_textAppearance autoSizeMaxTextSize autoSizeMinTextSize autoSizePresetSizes autoSizeStepGranularity autoSizeTextType drawableBottomCompat drawableEndCompat drawableLeftCompat drawableRightCompat drawableStartCompat drawableTint drawableTintMode drawableTopCompat firstBaselineToTopHeight fontFamily fontVariationSettings lastBaselineToBottomHeight lineHeight textAllCaps textLocale -styleable AppCompatTheme android_windowIsFloating android_windowAnimationStyle actionBarDivider actionBarItemBackground actionBarPopupTheme actionBarSize actionBarSplitStyle actionBarStyle actionBarTabBarStyle actionBarTabStyle actionBarTabTextStyle actionBarTheme actionBarWidgetTheme actionButtonStyle actionDropDownStyle actionMenuTextAppearance actionMenuTextColor actionModeBackground actionModeCloseButtonStyle actionModeCloseDrawable actionModeCopyDrawable actionModeCutDrawable actionModeFindDrawable actionModePasteDrawable actionModePopupWindowStyle actionModeSelectAllDrawable actionModeShareDrawable actionModeSplitBackground actionModeStyle actionModeWebSearchDrawable actionOverflowButtonStyle actionOverflowMenuStyle activityChooserViewStyle alertDialogButtonGroupStyle alertDialogCenterButtons alertDialogStyle alertDialogTheme autoCompleteTextViewStyle borderlessButtonStyle buttonBarButtonStyle buttonBarNegativeButtonStyle buttonBarNeutralButtonStyle buttonBarPositiveButtonStyle buttonBarStyle buttonStyle buttonStyleSmall checkboxStyle checkedTextViewStyle colorAccent colorBackgroundFloating colorButtonNormal colorControlActivated colorControlHighlight colorControlNormal colorError colorPrimary colorPrimaryDark colorSwitchThumbNormal controlBackground dialogCornerRadius dialogPreferredPadding dialogTheme dividerHorizontal dividerVertical dropDownListViewStyle dropdownListPreferredItemHeight editTextBackground editTextColor editTextStyle homeAsUpIndicator imageButtonStyle listChoiceBackgroundIndicator listChoiceIndicatorMultipleAnimated listChoiceIndicatorSingleAnimated listDividerAlertDialog listMenuViewStyle listPopupWindowStyle listPreferredItemHeight listPreferredItemHeightLarge listPreferredItemHeightSmall listPreferredItemPaddingEnd listPreferredItemPaddingLeft listPreferredItemPaddingRight listPreferredItemPaddingStart panelBackground panelMenuListTheme panelMenuListWidth popupMenuStyle popupWindowStyle radioButtonStyle ratingBarStyle ratingBarStyleIndicator ratingBarStyleSmall searchViewStyle seekBarStyle selectableItemBackground selectableItemBackgroundBorderless spinnerDropDownItemStyle spinnerStyle switchStyle textAppearanceLargePopupMenu textAppearanceListItem textAppearanceListItemSecondary textAppearanceListItemSmall textAppearancePopupMenuHeader textAppearanceSearchResultSubtitle textAppearanceSearchResultTitle textAppearanceSmallPopupMenu textColorAlertDialogListItem textColorSearchUrl toolbarNavigationButtonStyle toolbarStyle tooltipForegroundColor tooltipFrameBackground viewInflaterClass windowActionBar windowActionBarOverlay windowActionModeOverlay windowFixedHeightMajor windowFixedHeightMinor windowFixedWidthMajor windowFixedWidthMinor windowMinWidthMajor windowMinWidthMinor windowNoTitle -styleable ButtonBarLayout allowStacking -styleable ColorStateListItem android_color android_alpha alpha -styleable CompoundButton android_button buttonCompat buttonTint buttonTintMode -styleable DrawerArrowToggle arrowHeadLength arrowShaftLength barLength color drawableSize gapBetweenBars spinBars thickness -styleable FontFamily fontProviderAuthority fontProviderCerts fontProviderFetchStrategy fontProviderFetchTimeout fontProviderPackage fontProviderQuery -styleable FontFamilyFont android_font android_fontWeight android_fontStyle android_ttcIndex android_fontVariationSettings font fontStyle fontVariationSettings fontWeight ttcIndex -styleable GenericDraweeHierarchy actualImageScaleType backgroundImage fadeDuration failureImage failureImageScaleType overlayImage placeholderImage placeholderImageScaleType pressedStateOverlayImage progressBarAutoRotateInterval progressBarImage progressBarImageScaleType retryImage retryImageScaleType roundAsCircle roundBottomEnd roundBottomLeft roundBottomRight roundBottomStart roundTopEnd roundTopLeft roundTopRight roundTopStart roundWithOverlayColor roundedCornerRadius roundingBorderColor roundingBorderPadding roundingBorderWidth viewAspectRatio -styleable GradientColor android_startColor android_endColor android_type android_centerX android_centerY android_gradientRadius android_tileMode android_centerColor android_startX android_startY android_endX android_endY -styleable GradientColorItem android_color android_offset -styleable LinearLayoutCompat android_gravity android_orientation android_baselineAligned android_baselineAlignedChildIndex android_weightSum divider dividerPadding measureWithLargestChild showDividers -styleable LinearLayoutCompat_Layout android_layout_gravity android_layout_width android_layout_height android_layout_weight -styleable ListPopupWindow android_dropDownHorizontalOffset android_dropDownVerticalOffset -styleable MenuGroup android_enabled android_id android_visible android_menuCategory android_orderInCategory android_checkableBehavior -styleable MenuItem android_icon android_enabled android_id android_checked android_visible android_menuCategory android_orderInCategory android_title android_titleCondensed android_alphabeticShortcut android_numericShortcut android_checkable android_onClick actionLayout actionProviderClass actionViewClass alphabeticModifiers contentDescription iconTint iconTintMode numericModifiers showAsAction tooltipText -styleable MenuView android_windowAnimationStyle android_itemTextAppearance android_horizontalDivider android_verticalDivider android_headerBackground android_itemBackground android_itemIconDisabledAlpha preserveIconSpacing subMenuArrow -styleable PopupWindow android_popupBackground android_popupAnimationStyle overlapAnchor -styleable PopupWindowBackgroundState state_above_anchor -styleable RecycleListView paddingBottomNoButtons paddingTopNoTitle -styleable SearchView android_focusable android_maxWidth android_inputType android_imeOptions closeIcon commitIcon defaultQueryHint goIcon iconifiedByDefault layout queryBackground queryHint searchHintIcon searchIcon submitBackground suggestionRowLayout voiceIcon -styleable SimpleDraweeView actualImageResource actualImageScaleType actualImageUri backgroundImage fadeDuration failureImage failureImageScaleType overlayImage placeholderImage placeholderImageScaleType pressedStateOverlayImage progressBarAutoRotateInterval progressBarImage progressBarImageScaleType retryImage retryImageScaleType roundAsCircle roundBottomEnd roundBottomLeft roundBottomRight roundBottomStart roundTopEnd roundTopLeft roundTopRight roundTopStart roundWithOverlayColor roundedCornerRadius roundingBorderColor roundingBorderPadding roundingBorderWidth viewAspectRatio -styleable Spinner android_entries android_popupBackground android_prompt android_dropDownWidth popupTheme -styleable StateListDrawable android_dither android_visible android_variablePadding android_constantSize android_enterFadeDuration android_exitFadeDuration -styleable StateListDrawableItem android_drawable -styleable SwitchCompat android_textOn android_textOff android_thumb showText splitTrack switchMinWidth switchPadding switchTextAppearance thumbTextPadding thumbTint thumbTintMode track trackTint trackTintMode -styleable TextAppearance android_textSize android_typeface android_textStyle android_textColor android_textColorHint android_textColorLink android_shadowColor android_shadowDx android_shadowDy android_shadowRadius android_fontFamily android_textFontWeight fontFamily fontVariationSettings textAllCaps textLocale -styleable Toolbar android_gravity android_minHeight buttonGravity collapseContentDescription collapseIcon contentInsetEnd contentInsetEndWithActions contentInsetLeft contentInsetRight contentInsetStart contentInsetStartWithNavigation logo logoDescription maxButtonHeight menu navigationContentDescription navigationIcon popupTheme subtitle subtitleTextAppearance subtitleTextColor title titleMargin titleMarginBottom titleMarginEnd titleMarginStart titleMarginTop titleMargins titleTextAppearance titleTextColor -styleable View android_theme android_focusable paddingEnd paddingStart theme -styleable ViewBackgroundHelper android_background backgroundTint backgroundTintMode -styleable ViewStubCompat android_id android_layout android_inflatedId -xml rn_dev_preferences diff --git a/android/app/build/outputs/apk/debug/app-debug.apk b/android/app/build/outputs/apk/debug/app-debug.apk deleted file mode 100644 index d0f98df..0000000 Binary files a/android/app/build/outputs/apk/debug/app-debug.apk and /dev/null differ diff --git a/android/app/build/outputs/apk/debug/output-metadata.json b/android/app/build/outputs/apk/debug/output-metadata.json deleted file mode 100644 index 679d7aa..0000000 --- a/android/app/build/outputs/apk/debug/output-metadata.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": 2, - "artifactType": { - "type": "APK", - "kind": "Directory" - }, - "applicationId": "com.reactnativeapp", - "variantName": "processDebugResources", - "elements": [ - { - "type": "SINGLE", - "filters": [], - "versionCode": 1, - "versionName": "1.0", - "outputFile": "app-debug.apk" - } - ] -} \ No newline at end of file diff --git a/android/app/build/outputs/logs/manifest-merger-debug-report.txt b/android/app/build/outputs/logs/manifest-merger-debug-report.txt deleted file mode 100644 index 928239e..0000000 --- a/android/app/build/outputs/logs/manifest-merger-debug-report.txt +++ /dev/null @@ -1,252 +0,0 @@ --- Merging decision tree log --- -manifest -ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:1:1-25:12 -INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:1:1-25:12 -INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:1:1-25:12 -INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:1:1-25:12 -MERGED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:1:1-25:12 -MERGED from [com.facebook.flipper:flipper:0.75.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a8f6015f96666ab8d93bfe5b64998bc8/jetified-flipper-0.75.1/AndroidManifest.xml:8:1-18:12 -MERGED from [com.facebook.flipper:flipper-network-plugin:0.75.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d8279ebfbcca51b68586de1b9bc17210/jetified-flipper-network-plugin-0.75.1/AndroidManifest.xml:8:1-15:12 -MERGED from [com.facebook.flipper:flipper-fresco-plugin:0.75.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/13e0ca18817a9e59a8c4a94704ec8c3c/jetified-flipper-fresco-plugin-0.75.1/AndroidManifest.xml:8:1-15:12 -MERGED from [com.facebook.react:react-native:0.64.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a56511b037fb04f244c71df782e66ef7/jetified-react-native-0.64.0/AndroidManifest.xml:2:1-13:12 -MERGED from [androidx.swiperefreshlayout:swiperefreshlayout:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/5c64f35c4f864d4cd139ccbbff91ceb9/swiperefreshlayout-1.0.0/AndroidManifest.xml:17:1-22:12 -MERGED from [org.webkit:android-jsc:r245459] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/65337ca8c0783fc27be60d476a5f6b75/jetified-android-jsc-r245459/AndroidManifest.xml:2:1-11:12 -MERGED from [com.facebook.fresco:flipper:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/84c6a932a42f35f9b796c5d67e6eb742/jetified-flipper-2.2.0/AndroidManifest.xml:2:1-9:12 -MERGED from [com.facebook.fresco:stetho:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/5f2c193a45b1b439ec8f5a8edcb37f33/jetified-stetho-2.2.0/AndroidManifest.xml:2:1-9:12 -MERGED from [com.facebook.fresco:fresco:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/336cee0c87f467fe6bfb36840b0630b2/jetified-fresco-2.2.0/AndroidManifest.xml:2:1-9:12 -MERGED from [com.facebook.fresco:drawee:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/8850ed829d25245e8497182323bc73d2/jetified-drawee-2.2.0/AndroidManifest.xml:2:1-9:12 -MERGED from [com.facebook.fresco:nativeimagefilters:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/cedca5e04b0c20fa79ac1887f71f3325/jetified-nativeimagefilters-2.2.0/AndroidManifest.xml:2:1-9:12 -MERGED from [com.facebook.fresco:memory-type-native:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/e5db14b71da4d91c0ca7d2ee268e707a/jetified-memory-type-native-2.2.0/AndroidManifest.xml:2:1-9:12 -MERGED from [com.facebook.fresco:memory-type-java:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/3c0394800bb3c89c17ec23de03c5f2ca/jetified-memory-type-java-2.2.0/AndroidManifest.xml:2:1-9:12 -MERGED from [com.facebook.fresco:imagepipeline-native:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/cf4b730f71bf97441bdf4ebe8cfeeb88/jetified-imagepipeline-native-2.2.0/AndroidManifest.xml:2:1-9:12 -MERGED from [com.facebook.fresco:soloader:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/c35a46a0a862651f1e0a89250dcee30d/jetified-soloader-2.2.0/AndroidManifest.xml:2:1-9:12 -MERGED from [com.facebook.soloader:soloader:0.10.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/5fb5c0c623111e89d0cb2cc6cbe55df8/jetified-soloader-0.10.1/AndroidManifest.xml:2:1-13:12 -MERGED from [androidx.appcompat:appcompat:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/AndroidManifest.xml:17:1-24:12 -MERGED from [androidx.sqlite:sqlite-framework:2.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/ce476dc2f1f7d59691ad234de1ec2fb1/sqlite-framework-2.1.0/AndroidManifest.xml:17:1-24:12 -MERGED from [com.facebook.fresco:imagepipeline-okhttp3:2.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/f66a3370e9e4f8cb0ae0c6936c538c41/jetified-imagepipeline-okhttp3-2.0.0/AndroidManifest.xml:2:1-9:12 -MERGED from [com.facebook.fresco:memory-type-ashmem:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/fc37ff7af2e3c5de8e592a9550a0df07/jetified-memory-type-ashmem-2.2.0/AndroidManifest.xml:2:1-9:12 -MERGED from [com.facebook.fresco:imagepipeline:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/cda5d9a1a957ef402e55e5ba5c5bfd6d/jetified-imagepipeline-2.2.0/AndroidManifest.xml:2:1-9:12 -MERGED from [com.facebook.fresco:nativeimagetranscoder:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/8f540c10f5114d05b8ee24db3e19e1f8/jetified-nativeimagetranscoder-2.2.0/AndroidManifest.xml:2:1-9:12 -MERGED from [com.facebook.fresco:imagepipeline-base:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/b51f59890c1c9ada8eed6d21cecc075e/jetified-imagepipeline-base-2.2.0/AndroidManifest.xml:2:1-9:12 -MERGED from [androidx.appcompat:appcompat-resources:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/baebfc24ee3e9d675a4614c1f27f118a/jetified-appcompat-resources-1.1.0/AndroidManifest.xml:17:1-24:12 -MERGED from [androidx.vectordrawable:vectordrawable-animated:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/2ee35bfe9d2e9019f071c4a047a96db2/vectordrawable-animated-1.1.0/AndroidManifest.xml:17:1-24:12 -MERGED from [androidx.interpolator:interpolator:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/6e0f82970a69a6b386ee45a08ac362fe/interpolator-1.0.0/AndroidManifest.xml:17:1-22:12 -MERGED from [androidx.fragment:fragment:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/ba80674a1a5fdce2b1b29eea5683af77/fragment-1.1.0/AndroidManifest.xml:17:1-24:12 -MERGED from [androidx.drawerlayout:drawerlayout:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/22a5d9f52d495a432176451a4c4ba982/drawerlayout-1.0.0/AndroidManifest.xml:17:1-22:12 -MERGED from [androidx.viewpager:viewpager:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/2f70304b103eacfab05dbe55739e869f/viewpager-1.0.0/AndroidManifest.xml:17:1-22:12 -MERGED from [androidx.loader:loader:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/49dee3543bc65746b6bba9f83aa0b18a/loader-1.0.0/AndroidManifest.xml:17:1-22:12 -MERGED from [androidx.activity:activity:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/68865d38a53fb5c240061f062e474515/jetified-activity-1.0.0/AndroidManifest.xml:17:1-24:12 -MERGED from [androidx.vectordrawable:vectordrawable:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/361553562ce35cf8cf447832c4a7d1ec/vectordrawable-1.1.0/AndroidManifest.xml:17:1-24:12 -MERGED from [androidx.customview:customview:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/86cf751735e9e9dd0416cce35c4a71a1/customview-1.0.0/AndroidManifest.xml:17:1-22:12 -MERGED from [androidx.core:core:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/AndroidManifest.xml:17:1-26:12 -MERGED from [androidx.cursoradapter:cursoradapter:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/bae4382a703142a8f82a100a412243f1/cursoradapter-1.0.0/AndroidManifest.xml:17:1-22:12 -MERGED from [androidx.sqlite:sqlite:2.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/74153744c3b76afb34d0c28a686a981b/sqlite-2.1.0/AndroidManifest.xml:17:1-24:12 -MERGED from [androidx.versionedparcelable:versionedparcelable:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/af9af86a2035b10a0514f89f66cf8a9a/versionedparcelable-1.1.0/AndroidManifest.xml:17:1-27:12 -MERGED from [androidx.lifecycle:lifecycle-runtime:2.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/e30defb91871c7bd72c698d035733320/lifecycle-runtime-2.1.0/AndroidManifest.xml:17:1-22:12 -MERGED from [androidx.lifecycle:lifecycle-viewmodel:2.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/2b6a4e71d38d3b36d0c903aac26cfd25/lifecycle-viewmodel-2.1.0/AndroidManifest.xml:17:1-22:12 -MERGED from [androidx.savedstate:savedstate:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/29e9e6ac99026fff5bb21139b2ad74ac/jetified-savedstate-1.0.0/AndroidManifest.xml:17:1-24:12 -MERGED from [androidx.lifecycle:lifecycle-livedata:2.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/15faa7fdc535e832982b4615d300cb77/lifecycle-livedata-2.0.0/AndroidManifest.xml:17:1-22:12 -MERGED from [androidx.lifecycle:lifecycle-livedata-core:2.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/033c1099bb4cd11be9138377da501d59/lifecycle-livedata-core-2.0.0/AndroidManifest.xml:17:1-22:12 -MERGED from [androidx.arch.core:core-runtime:2.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/943631e3c5a6dfa67bece88add1d3fe3/core-runtime-2.0.0/AndroidManifest.xml:17:1-22:12 -MERGED from [com.facebook.fresco:fbcore:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/5ff10ad0f2bea4b2419e86a549e99aac/jetified-fbcore-2.2.0/AndroidManifest.xml:2:1-9:12 -MERGED from [com.facebook.fresco:ui-common:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/ffdaca04e33e18187dfc99a2b0ddad3b/jetified-ui-common-2.2.0/AndroidManifest.xml:2:1-9:12 -INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml:2:1-13:12 -INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml:2:1-13:12 -INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml:2:1-13:12 - package - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:2:3-31 - INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:2:3-31 - INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml - android:versionName - INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:1:1-25:12 - INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml - xmlns:tools - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml:3:5-51 - android:versionCode - INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:1:1-25:12 - INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml - xmlns:android - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:1:11-69 -uses-permission#android.permission.INTERNET -ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:4:5-67 -MERGED from [com.facebook.flipper:flipper:0.75.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a8f6015f96666ab8d93bfe5b64998bc8/jetified-flipper-0.75.1/AndroidManifest.xml:15:5-67 -MERGED from [com.facebook.flipper:flipper:0.75.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a8f6015f96666ab8d93bfe5b64998bc8/jetified-flipper-0.75.1/AndroidManifest.xml:15:5-67 - android:name - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:4:22-64 -application -ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:6:5-24:19 -MERGED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:6:5-24:19 -MERGED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:6:5-24:19 -MERGED from [com.facebook.react:react-native:0.64.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a56511b037fb04f244c71df782e66ef7/jetified-react-native-0.64.0/AndroidManifest.xml:11:5-20 -MERGED from [com.facebook.react:react-native:0.64.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a56511b037fb04f244c71df782e66ef7/jetified-react-native-0.64.0/AndroidManifest.xml:11:5-20 -MERGED from [com.facebook.soloader:soloader:0.10.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/5fb5c0c623111e89d0cb2cc6cbe55df8/jetified-soloader-0.10.1/AndroidManifest.xml:11:5-20 -MERGED from [com.facebook.soloader:soloader:0.10.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/5fb5c0c623111e89d0cb2cc6cbe55df8/jetified-soloader-0.10.1/AndroidManifest.xml:11:5-20 -MERGED from [androidx.core:core:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/AndroidManifest.xml:24:5-89 -MERGED from [androidx.core:core:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/AndroidManifest.xml:24:5-89 -MERGED from [androidx.versionedparcelable:versionedparcelable:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/af9af86a2035b10a0514f89f66cf8a9a/versionedparcelable-1.1.0/AndroidManifest.xml:24:5-25:19 -MERGED from [androidx.versionedparcelable:versionedparcelable:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/af9af86a2035b10a0514f89f66cf8a9a/versionedparcelable-1.1.0/AndroidManifest.xml:24:5-25:19 - android:appComponentFactory - ADDED from [androidx.core:core:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/AndroidManifest.xml:24:18-86 - android:label - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:8:7-39 - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:8:7-39 - tools:ignore - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml:10:9-48 - android:roundIcon - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:10:7-52 - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:10:7-52 - tools:targetApi - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml:9:9-29 - android:icon - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:9:7-41 - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:9:7-41 - android:allowBackup - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:11:7-34 - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:11:7-34 - android:theme - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:12:7-38 - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:12:7-38 - android:usesCleartextTraffic - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml:8:9-44 - android:name - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:7:7-38 - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:7:7-38 -activity#com.reactnativeapp.MainActivity -ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:13:7-23:18 - android:label - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:15:9-41 - android:launchMode - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:17:9-40 - android:windowSoftInputMode - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:18:9-51 - android:configChanges - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:16:9-86 - android:name - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:14:9-37 -intent-filter#action:name:android.intent.action.MAIN+category:name:android.intent.category.LAUNCHER -ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:19:9-22:25 -action#android.intent.action.MAIN -ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:20:13-65 - android:name - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:20:21-62 -category#android.intent.category.LAUNCHER -ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:21:13-73 - android:name - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml:21:23-70 -uses-sdk -INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml reason: use-sdk injection requested -INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml -INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml -MERGED from [com.facebook.flipper:flipper:0.75.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a8f6015f96666ab8d93bfe5b64998bc8/jetified-flipper-0.75.1/AndroidManifest.xml:11:5-13:41 -MERGED from [com.facebook.flipper:flipper:0.75.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a8f6015f96666ab8d93bfe5b64998bc8/jetified-flipper-0.75.1/AndroidManifest.xml:11:5-13:41 -MERGED from [com.facebook.flipper:flipper-network-plugin:0.75.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d8279ebfbcca51b68586de1b9bc17210/jetified-flipper-network-plugin-0.75.1/AndroidManifest.xml:11:5-13:41 -MERGED from [com.facebook.flipper:flipper-network-plugin:0.75.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d8279ebfbcca51b68586de1b9bc17210/jetified-flipper-network-plugin-0.75.1/AndroidManifest.xml:11:5-13:41 -MERGED from [com.facebook.flipper:flipper-fresco-plugin:0.75.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/13e0ca18817a9e59a8c4a94704ec8c3c/jetified-flipper-fresco-plugin-0.75.1/AndroidManifest.xml:11:5-13:41 -MERGED from [com.facebook.flipper:flipper-fresco-plugin:0.75.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/13e0ca18817a9e59a8c4a94704ec8c3c/jetified-flipper-fresco-plugin-0.75.1/AndroidManifest.xml:11:5-13:41 -MERGED from [com.facebook.react:react-native:0.64.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a56511b037fb04f244c71df782e66ef7/jetified-react-native-0.64.0/AndroidManifest.xml:7:5-9:41 -MERGED from [com.facebook.react:react-native:0.64.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a56511b037fb04f244c71df782e66ef7/jetified-react-native-0.64.0/AndroidManifest.xml:7:5-9:41 -MERGED from [androidx.swiperefreshlayout:swiperefreshlayout:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/5c64f35c4f864d4cd139ccbbff91ceb9/swiperefreshlayout-1.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.swiperefreshlayout:swiperefreshlayout:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/5c64f35c4f864d4cd139ccbbff91ceb9/swiperefreshlayout-1.0.0/AndroidManifest.xml:20:5-44 -MERGED from [org.webkit:android-jsc:r245459] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/65337ca8c0783fc27be60d476a5f6b75/jetified-android-jsc-r245459/AndroidManifest.xml:7:5-9:41 -MERGED from [org.webkit:android-jsc:r245459] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/65337ca8c0783fc27be60d476a5f6b75/jetified-android-jsc-r245459/AndroidManifest.xml:7:5-9:41 -MERGED from [com.facebook.fresco:flipper:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/84c6a932a42f35f9b796c5d67e6eb742/jetified-flipper-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:flipper:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/84c6a932a42f35f9b796c5d67e6eb742/jetified-flipper-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:stetho:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/5f2c193a45b1b439ec8f5a8edcb37f33/jetified-stetho-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:stetho:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/5f2c193a45b1b439ec8f5a8edcb37f33/jetified-stetho-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:fresco:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/336cee0c87f467fe6bfb36840b0630b2/jetified-fresco-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:fresco:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/336cee0c87f467fe6bfb36840b0630b2/jetified-fresco-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:drawee:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/8850ed829d25245e8497182323bc73d2/jetified-drawee-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:drawee:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/8850ed829d25245e8497182323bc73d2/jetified-drawee-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:nativeimagefilters:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/cedca5e04b0c20fa79ac1887f71f3325/jetified-nativeimagefilters-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:nativeimagefilters:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/cedca5e04b0c20fa79ac1887f71f3325/jetified-nativeimagefilters-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:memory-type-native:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/e5db14b71da4d91c0ca7d2ee268e707a/jetified-memory-type-native-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:memory-type-native:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/e5db14b71da4d91c0ca7d2ee268e707a/jetified-memory-type-native-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:memory-type-java:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/3c0394800bb3c89c17ec23de03c5f2ca/jetified-memory-type-java-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:memory-type-java:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/3c0394800bb3c89c17ec23de03c5f2ca/jetified-memory-type-java-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:imagepipeline-native:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/cf4b730f71bf97441bdf4ebe8cfeeb88/jetified-imagepipeline-native-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:imagepipeline-native:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/cf4b730f71bf97441bdf4ebe8cfeeb88/jetified-imagepipeline-native-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:soloader:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/c35a46a0a862651f1e0a89250dcee30d/jetified-soloader-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:soloader:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/c35a46a0a862651f1e0a89250dcee30d/jetified-soloader-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.soloader:soloader:0.10.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/5fb5c0c623111e89d0cb2cc6cbe55df8/jetified-soloader-0.10.1/AndroidManifest.xml:7:5-9:41 -MERGED from [com.facebook.soloader:soloader:0.10.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/5fb5c0c623111e89d0cb2cc6cbe55df8/jetified-soloader-0.10.1/AndroidManifest.xml:7:5-9:41 -MERGED from [androidx.appcompat:appcompat:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.appcompat:appcompat:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d14dbad7340cad958a2e361a440b498d/appcompat-1.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.sqlite:sqlite-framework:2.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/ce476dc2f1f7d59691ad234de1ec2fb1/sqlite-framework-2.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.sqlite:sqlite-framework:2.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/ce476dc2f1f7d59691ad234de1ec2fb1/sqlite-framework-2.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [com.facebook.fresco:imagepipeline-okhttp3:2.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/f66a3370e9e4f8cb0ae0c6936c538c41/jetified-imagepipeline-okhttp3-2.0.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:imagepipeline-okhttp3:2.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/f66a3370e9e4f8cb0ae0c6936c538c41/jetified-imagepipeline-okhttp3-2.0.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:memory-type-ashmem:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/fc37ff7af2e3c5de8e592a9550a0df07/jetified-memory-type-ashmem-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:memory-type-ashmem:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/fc37ff7af2e3c5de8e592a9550a0df07/jetified-memory-type-ashmem-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:imagepipeline:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/cda5d9a1a957ef402e55e5ba5c5bfd6d/jetified-imagepipeline-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:imagepipeline:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/cda5d9a1a957ef402e55e5ba5c5bfd6d/jetified-imagepipeline-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:nativeimagetranscoder:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/8f540c10f5114d05b8ee24db3e19e1f8/jetified-nativeimagetranscoder-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:nativeimagetranscoder:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/8f540c10f5114d05b8ee24db3e19e1f8/jetified-nativeimagetranscoder-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:imagepipeline-base:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/b51f59890c1c9ada8eed6d21cecc075e/jetified-imagepipeline-base-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:imagepipeline-base:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/b51f59890c1c9ada8eed6d21cecc075e/jetified-imagepipeline-base-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [androidx.appcompat:appcompat-resources:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/baebfc24ee3e9d675a4614c1f27f118a/jetified-appcompat-resources-1.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.appcompat:appcompat-resources:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/baebfc24ee3e9d675a4614c1f27f118a/jetified-appcompat-resources-1.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.vectordrawable:vectordrawable-animated:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/2ee35bfe9d2e9019f071c4a047a96db2/vectordrawable-animated-1.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.vectordrawable:vectordrawable-animated:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/2ee35bfe9d2e9019f071c4a047a96db2/vectordrawable-animated-1.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.interpolator:interpolator:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/6e0f82970a69a6b386ee45a08ac362fe/interpolator-1.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.interpolator:interpolator:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/6e0f82970a69a6b386ee45a08ac362fe/interpolator-1.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.fragment:fragment:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/ba80674a1a5fdce2b1b29eea5683af77/fragment-1.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.fragment:fragment:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/ba80674a1a5fdce2b1b29eea5683af77/fragment-1.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.drawerlayout:drawerlayout:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/22a5d9f52d495a432176451a4c4ba982/drawerlayout-1.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.drawerlayout:drawerlayout:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/22a5d9f52d495a432176451a4c4ba982/drawerlayout-1.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.viewpager:viewpager:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/2f70304b103eacfab05dbe55739e869f/viewpager-1.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.viewpager:viewpager:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/2f70304b103eacfab05dbe55739e869f/viewpager-1.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.loader:loader:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/49dee3543bc65746b6bba9f83aa0b18a/loader-1.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.loader:loader:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/49dee3543bc65746b6bba9f83aa0b18a/loader-1.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.activity:activity:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/68865d38a53fb5c240061f062e474515/jetified-activity-1.0.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.activity:activity:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/68865d38a53fb5c240061f062e474515/jetified-activity-1.0.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.vectordrawable:vectordrawable:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/361553562ce35cf8cf447832c4a7d1ec/vectordrawable-1.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.vectordrawable:vectordrawable:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/361553562ce35cf8cf447832c4a7d1ec/vectordrawable-1.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.customview:customview:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/86cf751735e9e9dd0416cce35c4a71a1/customview-1.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.customview:customview:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/86cf751735e9e9dd0416cce35c4a71a1/customview-1.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.core:core:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.core:core:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/d67cd79abd1ca209502f51c69d23182b/core-1.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.cursoradapter:cursoradapter:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/bae4382a703142a8f82a100a412243f1/cursoradapter-1.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.cursoradapter:cursoradapter:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/bae4382a703142a8f82a100a412243f1/cursoradapter-1.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.sqlite:sqlite:2.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/74153744c3b76afb34d0c28a686a981b/sqlite-2.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.sqlite:sqlite:2.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/74153744c3b76afb34d0c28a686a981b/sqlite-2.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.versionedparcelable:versionedparcelable:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/af9af86a2035b10a0514f89f66cf8a9a/versionedparcelable-1.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.versionedparcelable:versionedparcelable:1.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/af9af86a2035b10a0514f89f66cf8a9a/versionedparcelable-1.1.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.lifecycle:lifecycle-runtime:2.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/e30defb91871c7bd72c698d035733320/lifecycle-runtime-2.1.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.lifecycle:lifecycle-runtime:2.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/e30defb91871c7bd72c698d035733320/lifecycle-runtime-2.1.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.lifecycle:lifecycle-viewmodel:2.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/2b6a4e71d38d3b36d0c903aac26cfd25/lifecycle-viewmodel-2.1.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.lifecycle:lifecycle-viewmodel:2.1.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/2b6a4e71d38d3b36d0c903aac26cfd25/lifecycle-viewmodel-2.1.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.savedstate:savedstate:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/29e9e6ac99026fff5bb21139b2ad74ac/jetified-savedstate-1.0.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.savedstate:savedstate:1.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/29e9e6ac99026fff5bb21139b2ad74ac/jetified-savedstate-1.0.0/AndroidManifest.xml:20:5-22:41 -MERGED from [androidx.lifecycle:lifecycle-livedata:2.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/15faa7fdc535e832982b4615d300cb77/lifecycle-livedata-2.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.lifecycle:lifecycle-livedata:2.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/15faa7fdc535e832982b4615d300cb77/lifecycle-livedata-2.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.lifecycle:lifecycle-livedata-core:2.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/033c1099bb4cd11be9138377da501d59/lifecycle-livedata-core-2.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.lifecycle:lifecycle-livedata-core:2.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/033c1099bb4cd11be9138377da501d59/lifecycle-livedata-core-2.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.arch.core:core-runtime:2.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/943631e3c5a6dfa67bece88add1d3fe3/core-runtime-2.0.0/AndroidManifest.xml:20:5-44 -MERGED from [androidx.arch.core:core-runtime:2.0.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/943631e3c5a6dfa67bece88add1d3fe3/core-runtime-2.0.0/AndroidManifest.xml:20:5-44 -MERGED from [com.facebook.fresco:fbcore:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/5ff10ad0f2bea4b2419e86a549e99aac/jetified-fbcore-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:fbcore:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/5ff10ad0f2bea4b2419e86a549e99aac/jetified-fbcore-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:ui-common:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/ffdaca04e33e18187dfc99a2b0ddad3b/jetified-ui-common-2.2.0/AndroidManifest.xml:5:5-7:41 -MERGED from [com.facebook.fresco:ui-common:2.2.0] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/ffdaca04e33e18187dfc99a2b0ddad3b/jetified-ui-common-2.2.0/AndroidManifest.xml:5:5-7:41 -INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml -INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml - android:targetSdkVersion - INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml - INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml - android:minSdkVersion - INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/main/AndroidManifest.xml - INJECTED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml -uses-permission#android.permission.SYSTEM_ALERT_WINDOW -ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml:5:5-77 - android:name - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml:5:22-75 -activity#com.facebook.react.devsupport.DevSettingsActivity -ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml:11:9-86 - android:name - ADDED from /Users/rahul.kumar1/Documents/projects/React Native/myapp/android/app/src/debug/AndroidManifest.xml:11:19-83 -uses-permission#android.permission.ACCESS_WIFI_STATE -ADDED from [com.facebook.flipper:flipper:0.75.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a8f6015f96666ab8d93bfe5b64998bc8/jetified-flipper-0.75.1/AndroidManifest.xml:16:5-76 - android:name - ADDED from [com.facebook.flipper:flipper:0.75.1] /Users/rahul.kumar1/.gradle/caches/transforms-2/files-2.1/a8f6015f96666ab8d93bfe5b64998bc8/jetified-flipper-0.75.1/AndroidManifest.xml:16:22-73 diff --git a/android/app/build/tmp/compileDebugJavaWithJavac/source-classes-mapping.txt b/android/app/build/tmp/compileDebugJavaWithJavac/source-classes-mapping.txt deleted file mode 100644 index 224b539..0000000 --- a/android/app/build/tmp/compileDebugJavaWithJavac/source-classes-mapping.txt +++ /dev/null @@ -1,14 +0,0 @@ -com/reactnativeapp/MainActivity.java - com.reactnativeapp.MainActivity -com/reactnativeapp/MainApplication.java - com.reactnativeapp.MainApplication - com.reactnativeapp.MainApplication$1 -com/reactnativeapp/ReactNativeFlipper.java - com.reactnativeapp.ReactNativeFlipper - com.reactnativeapp.ReactNativeFlipper$1 - com.reactnativeapp.ReactNativeFlipper$2 - com.reactnativeapp.ReactNativeFlipper$2$1 -com/reactnativeapp/BuildConfig.java - com.reactnativeapp.BuildConfig -com/facebook/react/PackageList.java - com.facebook.react.PackageList diff --git a/android/app/src/debug/java/com/reactnativeapp/ReactNativeFlipper.java b/android/app/src/debug/java/com/myapp/ReactNativeFlipper.java similarity index 99% rename from android/app/src/debug/java/com/reactnativeapp/ReactNativeFlipper.java rename to android/app/src/debug/java/com/myapp/ReactNativeFlipper.java index cc87b67..6489648 100644 --- a/android/app/src/debug/java/com/reactnativeapp/ReactNativeFlipper.java +++ b/android/app/src/debug/java/com/myapp/ReactNativeFlipper.java @@ -4,7 +4,7 @@ *

This source code is licensed under the MIT license found in the LICENSE file in the root * directory of this source tree. */ -package com.reactnativeapp; +package com.myapp; import android.content.Context; import com.facebook.flipper.android.AndroidFlipperClient; diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index fd5a7ea..e278a51 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.myapp"> diff --git a/android/app/src/main/assets/fonts/cursive.ttf b/android/app/src/main/assets/fonts/cursive.ttf deleted file mode 100644 index ef0bf92..0000000 Binary files a/android/app/src/main/assets/fonts/cursive.ttf and /dev/null differ diff --git a/android/app/src/main/assets/fonts/muli.ttf b/android/app/src/main/assets/fonts/muli.ttf deleted file mode 100644 index c39e8eb..0000000 Binary files a/android/app/src/main/assets/fonts/muli.ttf and /dev/null differ diff --git a/android/app/src/main/java/com/reactnativeapp/MainActivity.java b/android/app/src/main/java/com/myapp/MainActivity.java similarity index 83% rename from android/app/src/main/java/com/reactnativeapp/MainActivity.java rename to android/app/src/main/java/com/myapp/MainActivity.java index 2665ed4..5df500f 100644 --- a/android/app/src/main/java/com/reactnativeapp/MainActivity.java +++ b/android/app/src/main/java/com/myapp/MainActivity.java @@ -1,4 +1,4 @@ -package com.reactnativeapp; +package com.myapp; import com.facebook.react.ReactActivity; @@ -10,6 +10,6 @@ public class MainActivity extends ReactActivity { */ @Override protected String getMainComponentName() { - return "reactNativeApp"; + return "myapp"; } } diff --git a/android/app/src/main/java/com/reactnativeapp/MainApplication.java b/android/app/src/main/java/com/myapp/MainApplication.java similarity index 95% rename from android/app/src/main/java/com/reactnativeapp/MainApplication.java rename to android/app/src/main/java/com/myapp/MainApplication.java index c4d610f..dc0901c 100644 --- a/android/app/src/main/java/com/reactnativeapp/MainApplication.java +++ b/android/app/src/main/java/com/myapp/MainApplication.java @@ -1,4 +1,4 @@ -package com.reactnativeapp; +package com.myapp; import android.app.Application; import android.content.Context; @@ -62,7 +62,7 @@ private static void initializeFlipper( We use reflection here to pick up the class that initializes Flipper, since Flipper library is not available in release mode */ - Class aClass = Class.forName("com.reactnativeapp.ReactNativeFlipper"); + Class aClass = Class.forName("com.myapp.ReactNativeFlipper"); aClass .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class) .invoke(null, context, reactInstanceManager); diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 53a2efa..59e17b6 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,3 +1,3 @@ - reactNativeApp + myapp diff --git a/android/gradle.properties b/android/gradle.properties index d21d03f..f75240c 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -26,3 +26,5 @@ android.enableJetifier=true # Version of flipper SDK to use with React Native FLIPPER_VERSION=0.75.1 + + diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 14e30f7..ad0959a 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -3,3 +3,4 @@ distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists + diff --git a/android/gradlew.bat b/android/gradlew.bat index ac1b06f..107acd3 100644 --- a/android/gradlew.bat +++ b/android/gradlew.bat @@ -1,89 +1,89 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@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 Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@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="-Xmx64m" "-Xms64m" - -@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 execute - -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 execute - -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 - -: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 %* - -: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 +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@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 Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@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="-Xmx64m" "-Xms64m" + +@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 execute + +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 execute + +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 + +: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 %* + +: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/local.properties b/android/local.properties deleted file mode 100644 index 528c9b9..0000000 --- a/android/local.properties +++ /dev/null @@ -1 +0,0 @@ -sdk.dir = /Users/rahul.kumar1/Library/Android/sdk diff --git a/android/settings.gradle b/android/settings.gradle index ffdd19b..02dfe60 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1,3 +1,3 @@ -rootProject.name = 'reactNativeApp' +rootProject.name = 'myapp' apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) include ':app' diff --git a/app.json b/app.json index 9f6cd1c..3832973 100644 --- a/app.json +++ b/app.json @@ -1,4 +1,4 @@ { - "name": "reactNativeApp", - "displayName": "reactNativeApp" + "name": "myapp", + "displayName": "myapp" } \ No newline at end of file diff --git a/index.js b/index.js index 8b1b4d5..a850d03 100644 --- a/index.js +++ b/index.js @@ -2,8 +2,8 @@ * @format */ -import { AppRegistry } from 'react-native'; -import { App } from './App'; -import { name as appName } from './app.json'; +import {AppRegistry} from 'react-native'; +import App from './App'; +import {name as appName} from './app.json'; -AppRegistry.registerComponent(appName, () => App); \ No newline at end of file +AppRegistry.registerComponent(appName, () => App); diff --git a/ios/Podfile b/ios/Podfile index 22d3231..c3e8e20 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -3,7 +3,7 @@ require_relative '../node_modules/@react-native-community/cli-platform-ios/nativ platform :ios, '10.0' -target 'reactNativeApp' do +target 'myapp' do config = use_native_modules! use_react_native!( @@ -12,7 +12,7 @@ target 'reactNativeApp' do :hermes_enabled => false ) - target 'reactNativeAppTests' do + target 'myappTests' do inherit! :complete # Pods for testing end diff --git a/ios/Pods/CocoaAsyncSocket/LICENSE.txt b/ios/Pods/CocoaAsyncSocket/LICENSE.txt deleted file mode 100644 index ed3d60f..0000000 --- a/ios/Pods/CocoaAsyncSocket/LICENSE.txt +++ /dev/null @@ -1,35 +0,0 @@ -This library is in the public domain. -However, not all organizations are allowed to use such a license. -For example, Germany doesn't recognize the Public Domain and one is not allowed to use libraries under such license (or similar). - -Thus, the library is now dual licensed, -and one is allowed to choose which license they would like to use. - -################################################## -License Option #1 : -################################################## - -Public Domain - -################################################## -License Option #2 : -################################################## - -Software License Agreement (BSD License) - -Copyright (c) 2017, Deusty, LLC -All rights reserved. - -Redistribution and use of this software in source and binary forms, -with or without modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above - copyright notice, this list of conditions and the - following disclaimer. - -* Neither the name of Deusty LLC nor the names of its - contributors may be used to endorse or promote products - derived from this software without specific prior - written permission of Deusty LLC. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/ios/Pods/CocoaAsyncSocket/README.markdown b/ios/Pods/CocoaAsyncSocket/README.markdown deleted file mode 100644 index 155a8da..0000000 --- a/ios/Pods/CocoaAsyncSocket/README.markdown +++ /dev/null @@ -1,121 +0,0 @@ -# CocoaAsyncSocket -[![Build Status](https://travis-ci.org/robbiehanson/CocoaAsyncSocket.svg?branch=master)](https://travis-ci.org/robbiehanson/CocoaAsyncSocket) [![Version Status](https://img.shields.io/cocoapods/v/CocoaAsyncSocket.svg?style=flat)](http://cocoadocs.org/docsets/CocoaAsyncSocket) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Platform](http://img.shields.io/cocoapods/p/CocoaAsyncSocket.svg?style=flat)](http://cocoapods.org/?q=CocoaAsyncSocket) [![license Public Domain](https://img.shields.io/badge/license-Public%20Domain-orange.svg?style=flat)](https://en.wikipedia.org/wiki/Public_domain) - - -CocoaAsyncSocket provides easy-to-use and powerful asynchronous socket libraries for macOS, iOS, and tvOS. The classes are described below. - -## Installation - -#### CocoaPods - -Install using [CocoaPods](https://cocoapods.org) by adding this line to your Podfile: - -````ruby -use_frameworks! # Add this if you are targeting iOS 8+ or using Swift -pod 'CocoaAsyncSocket' -```` - -#### Carthage - -CocoaAsyncSocket is [Carthage](https://github.com/Carthage/Carthage) compatible. To include it add the following line to your `Cartfile` - -```bash -github "robbiehanson/CocoaAsyncSocket" "master" -``` - -The project is currently configured to build for **iOS**, **tvOS** and **Mac**. After building with carthage the resultant frameworks will be stored in: - -* `Carthage/Build/iOS/CocoaAsyncSocket.framework` -* `Carthage/Build/tvOS/CocoaAsyncSocket.framework` -* `Carthage/Build/Mac/CocoaAsyncSocket.framework` - -Select the correct framework(s) and drag it into your project. - -#### Swift Package Manager - -Simply add the package dependency to your Package.swift and depend on "CocoaAsyncSocket" in the necessary targets: -```swift -dependencies: [ - .package(url: "https://github.com/robbiehanson/CocoaAsyncSocket", from: "7.6.4") -] -``` - -#### Manual - -You can also include it into your project by adding the source files directly, but you should probably be using a dependency manager to keep up to date. - -### Importing - -Using Objective-C: - -```obj-c -// When using Clang Modules: -@import CocoaAsyncSocket; - -// or when not: -#import "GCDAsyncSocket.h" // for TCP -#import "GCDAsyncUdpSocket.h" // for UDP -``` - -Using Swift: - -```swift -import CocoaAsyncSocket -``` - -## TCP - -**GCDAsyncSocket** is a TCP/IP socket networking library built atop Grand Central Dispatch. Here are the key features available: - -- Native Objective-C, fully self-contained in one class.
- _No need to muck around with sockets or streams. This class handles everything for you._ - -- Full delegate support
- _Errors, connections, read completions, write completions, progress, and disconnections all result in a call to your delegate method._ - -- Queued non-blocking reads and writes, with optional timeouts.
- _You tell it what to read or write, and it handles everything for you. Queueing, buffering, and searching for termination sequences within the stream - all handled for you automatically._ - -- Automatic socket acceptance.
- _Spin up a server socket, tell it to accept connections, and it will call you with new instances of itself for each connection._ - -- Support for TCP streams over IPv4 and IPv6.
- _Automatically connect to IPv4 or IPv6 hosts. Automatically accept incoming connections over both IPv4 and IPv6 with a single instance of this class. No more worrying about multiple sockets._ - -- Support for TLS / SSL
- _Secure your socket with ease using just a single method call. Available for both client and server sockets._ - -- Fully GCD based and Thread-Safe
- _It runs entirely within its own GCD dispatch_queue, and is completely thread-safe. Further, the delegate methods are all invoked asynchronously onto a dispatch_queue of your choosing. This means parallel operation of your socket code, and your delegate/processing code._ - -## UDP - -**GCDAsyncUdpSocket** is a UDP/IP socket networking library built atop Grand Central Dispatch. Here are the key features available: - -- Native Objective-C, fully self-contained in one class.
- _No need to muck around with low-level sockets. This class handles everything for you._ - -- Full delegate support.
- _Errors, send completions, receive completions, and disconnections all result in a call to your delegate method._ - -- Queued non-blocking send and receive operations, with optional timeouts.
- _You tell it what to send or receive, and it handles everything for you. Queueing, buffering, waiting and checking errno - all handled for you automatically._ - -- Support for IPv4 and IPv6.
- _Automatically send/recv using IPv4 and/or IPv6. No more worrying about multiple sockets._ - -- Fully GCD based and Thread-Safe
- _It runs entirely within its own GCD dispatch_queue, and is completely thread-safe. Further, the delegate methods are all invoked asynchronously onto a dispatch_queue of your choosing. This means parallel operation of your socket code, and your delegate/processing code._ - -*** - -For those new(ish) to networking, it's recommended you **[read the wiki](https://github.com/robbiehanson/CocoaAsyncSocket/wiki)**.
_Sockets might not work exactly like you think they do..._ - -**Still got questions?** Try the **[CocoaAsyncSocket Mailing List](https://groups.google.com/group/cocoaasyncsocket)**. -*** - -Love the project? Wanna buy me a ☕️  ? (or a 🍺  😀 ): - -[![donation-bitcoin](https://bitpay.com/img/donate-sm.png)](https://onename.com/robbiehanson) -[![donation-paypal](https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=2M8C699FQ8AW2) - diff --git a/ios/Pods/CocoaAsyncSocket/Source/GCD/GCDAsyncSocket.h b/ios/Pods/CocoaAsyncSocket/Source/GCD/GCDAsyncSocket.h deleted file mode 100644 index c339f8a..0000000 --- a/ios/Pods/CocoaAsyncSocket/Source/GCD/GCDAsyncSocket.h +++ /dev/null @@ -1,1226 +0,0 @@ -// -// GCDAsyncSocket.h -// -// This class is in the public domain. -// Originally created by Robbie Hanson in Q3 2010. -// Updated and maintained by Deusty LLC and the Apple development community. -// -// https://github.com/robbiehanson/CocoaAsyncSocket -// - -#import -#import -#import -#import -#import - -#include // AF_INET, AF_INET6 - -@class GCDAsyncReadPacket; -@class GCDAsyncWritePacket; -@class GCDAsyncSocketPreBuffer; -@protocol GCDAsyncSocketDelegate; - -NS_ASSUME_NONNULL_BEGIN - -extern NSString *const GCDAsyncSocketException; -extern NSString *const GCDAsyncSocketErrorDomain; - -extern NSString *const GCDAsyncSocketQueueName; -extern NSString *const GCDAsyncSocketThreadName; - -extern NSString *const GCDAsyncSocketManuallyEvaluateTrust; -#if TARGET_OS_IPHONE -extern NSString *const GCDAsyncSocketUseCFStreamForTLS; -#endif -#define GCDAsyncSocketSSLPeerName (NSString *)kCFStreamSSLPeerName -#define GCDAsyncSocketSSLCertificates (NSString *)kCFStreamSSLCertificates -#define GCDAsyncSocketSSLIsServer (NSString *)kCFStreamSSLIsServer -extern NSString *const GCDAsyncSocketSSLPeerID; -extern NSString *const GCDAsyncSocketSSLProtocolVersionMin; -extern NSString *const GCDAsyncSocketSSLProtocolVersionMax; -extern NSString *const GCDAsyncSocketSSLSessionOptionFalseStart; -extern NSString *const GCDAsyncSocketSSLSessionOptionSendOneByteRecord; -extern NSString *const GCDAsyncSocketSSLCipherSuites; -extern NSString *const GCDAsyncSocketSSLALPN; -#if !TARGET_OS_IPHONE -extern NSString *const GCDAsyncSocketSSLDiffieHellmanParameters; -#endif - -#define GCDAsyncSocketLoggingContext 65535 - - -typedef NS_ERROR_ENUM(GCDAsyncSocketErrorDomain, GCDAsyncSocketError) { - GCDAsyncSocketNoError = 0, // Never used - GCDAsyncSocketBadConfigError, // Invalid configuration - GCDAsyncSocketBadParamError, // Invalid parameter was passed - GCDAsyncSocketConnectTimeoutError, // A connect operation timed out - GCDAsyncSocketReadTimeoutError, // A read operation timed out - GCDAsyncSocketWriteTimeoutError, // A write operation timed out - GCDAsyncSocketReadMaxedOutError, // Reached set maxLength without completing - GCDAsyncSocketClosedError, // The remote peer closed the connection - GCDAsyncSocketOtherError, // Description provided in userInfo -}; - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - - -@interface GCDAsyncSocket : NSObject - -/** - * GCDAsyncSocket uses the standard delegate paradigm, - * but executes all delegate callbacks on a given delegate dispatch queue. - * This allows for maximum concurrency, while at the same time providing easy thread safety. - * - * You MUST set a delegate AND delegate dispatch queue before attempting to - * use the socket, or you will get an error. - * - * The socket queue is optional. - * If you pass NULL, GCDAsyncSocket will automatically create it's own socket queue. - * If you choose to provide a socket queue, the socket queue must not be a concurrent queue. - * If you choose to provide a socket queue, and the socket queue has a configured target queue, - * then please see the discussion for the method markSocketQueueTargetQueue. - * - * The delegate queue and socket queue can optionally be the same. -**/ -- (instancetype)init; -- (instancetype)initWithSocketQueue:(nullable dispatch_queue_t)sq; -- (instancetype)initWithDelegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq; -- (instancetype)initWithDelegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq socketQueue:(nullable dispatch_queue_t)sq NS_DESIGNATED_INITIALIZER; - -/** - * Create GCDAsyncSocket from already connect BSD socket file descriptor -**/ -+ (nullable instancetype)socketFromConnectedSocketFD:(int)socketFD socketQueue:(nullable dispatch_queue_t)sq error:(NSError**)error; - -+ (nullable instancetype)socketFromConnectedSocketFD:(int)socketFD delegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq error:(NSError**)error; - -+ (nullable instancetype)socketFromConnectedSocketFD:(int)socketFD delegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq socketQueue:(nullable dispatch_queue_t)sq error:(NSError **)error; - -#pragma mark Configuration - -@property (atomic, weak, readwrite, nullable) id delegate; -#if OS_OBJECT_USE_OBJC -@property (atomic, strong, readwrite, nullable) dispatch_queue_t delegateQueue; -#else -@property (atomic, assign, readwrite, nullable) dispatch_queue_t delegateQueue; -#endif - -- (void)getDelegate:(id __nullable * __nullable)delegatePtr delegateQueue:(dispatch_queue_t __nullable * __nullable)delegateQueuePtr; -- (void)setDelegate:(nullable id)delegate delegateQueue:(nullable dispatch_queue_t)delegateQueue; - -/** - * If you are setting the delegate to nil within the delegate's dealloc method, - * you may need to use the synchronous versions below. -**/ -- (void)synchronouslySetDelegate:(nullable id)delegate; -- (void)synchronouslySetDelegateQueue:(nullable dispatch_queue_t)delegateQueue; -- (void)synchronouslySetDelegate:(nullable id)delegate delegateQueue:(nullable dispatch_queue_t)delegateQueue; - -/** - * By default, both IPv4 and IPv6 are enabled. - * - * For accepting incoming connections, this means GCDAsyncSocket automatically supports both protocols, - * and can simulataneously accept incoming connections on either protocol. - * - * For outgoing connections, this means GCDAsyncSocket can connect to remote hosts running either protocol. - * If a DNS lookup returns only IPv4 results, GCDAsyncSocket will automatically use IPv4. - * If a DNS lookup returns only IPv6 results, GCDAsyncSocket will automatically use IPv6. - * If a DNS lookup returns both IPv4 and IPv6 results, the preferred protocol will be chosen. - * By default, the preferred protocol is IPv4, but may be configured as desired. -**/ - -@property (atomic, assign, readwrite, getter=isIPv4Enabled) BOOL IPv4Enabled; -@property (atomic, assign, readwrite, getter=isIPv6Enabled) BOOL IPv6Enabled; - -@property (atomic, assign, readwrite, getter=isIPv4PreferredOverIPv6) BOOL IPv4PreferredOverIPv6; - -/** - * When connecting to both IPv4 and IPv6 using Happy Eyeballs (RFC 6555) https://tools.ietf.org/html/rfc6555 - * this is the delay between connecting to the preferred protocol and the fallback protocol. - * - * Defaults to 300ms. -**/ -@property (atomic, assign, readwrite) NSTimeInterval alternateAddressDelay; - -/** - * User data allows you to associate arbitrary information with the socket. - * This data is not used internally by socket in any way. -**/ -@property (atomic, strong, readwrite, nullable) id userData; - -#pragma mark Accepting - -/** - * Tells the socket to begin listening and accepting connections on the given port. - * When a connection is accepted, a new instance of GCDAsyncSocket will be spawned to handle it, - * and the socket:didAcceptNewSocket: delegate method will be invoked. - * - * The socket will listen on all available interfaces (e.g. wifi, ethernet, etc) -**/ -- (BOOL)acceptOnPort:(uint16_t)port error:(NSError **)errPtr; - -/** - * This method is the same as acceptOnPort:error: with the - * additional option of specifying which interface to listen on. - * - * For example, you could specify that the socket should only accept connections over ethernet, - * and not other interfaces such as wifi. - * - * The interface may be specified by name (e.g. "en1" or "lo0") or by IP address (e.g. "192.168.4.34"). - * You may also use the special strings "localhost" or "loopback" to specify that - * the socket only accept connections from the local machine. - * - * You can see the list of interfaces via the command line utility "ifconfig", - * or programmatically via the getifaddrs() function. - * - * To accept connections on any interface pass nil, or simply use the acceptOnPort:error: method. -**/ -- (BOOL)acceptOnInterface:(nullable NSString *)interface port:(uint16_t)port error:(NSError **)errPtr; - -/** - * Tells the socket to begin listening and accepting connections on the unix domain at the given url. - * When a connection is accepted, a new instance of GCDAsyncSocket will be spawned to handle it, - * and the socket:didAcceptNewSocket: delegate method will be invoked. - * - * The socket will listen on all available interfaces (e.g. wifi, ethernet, etc) - **/ -- (BOOL)acceptOnUrl:(NSURL *)url error:(NSError **)errPtr; - -#pragma mark Connecting - -/** - * Connects to the given host and port. - * - * This method invokes connectToHost:onPort:viaInterface:withTimeout:error: - * and uses the default interface, and no timeout. -**/ -- (BOOL)connectToHost:(NSString *)host onPort:(uint16_t)port error:(NSError **)errPtr; - -/** - * Connects to the given host and port with an optional timeout. - * - * This method invokes connectToHost:onPort:viaInterface:withTimeout:error: and uses the default interface. -**/ -- (BOOL)connectToHost:(NSString *)host - onPort:(uint16_t)port - withTimeout:(NSTimeInterval)timeout - error:(NSError **)errPtr; - -/** - * Connects to the given host & port, via the optional interface, with an optional timeout. - * - * The host may be a domain name (e.g. "deusty.com") or an IP address string (e.g. "192.168.0.2"). - * The host may also be the special strings "localhost" or "loopback" to specify connecting - * to a service on the local machine. - * - * The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35"). - * The interface may also be used to specify the local port (see below). - * - * To not time out use a negative time interval. - * - * This method will return NO if an error is detected, and set the error pointer (if one was given). - * Possible errors would be a nil host, invalid interface, or socket is already connected. - * - * If no errors are detected, this method will start a background connect operation and immediately return YES. - * The delegate callbacks are used to notify you when the socket connects, or if the host was unreachable. - * - * Since this class supports queued reads and writes, you can immediately start reading and/or writing. - * All read/write operations will be queued, and upon socket connection, - * the operations will be dequeued and processed in order. - * - * The interface may optionally contain a port number at the end of the string, separated by a colon. - * This allows you to specify the local port that should be used for the outgoing connection. (read paragraph to end) - * To specify both interface and local port: "en1:8082" or "192.168.4.35:2424". - * To specify only local port: ":8082". - * Please note this is an advanced feature, and is somewhat hidden on purpose. - * You should understand that 99.999% of the time you should NOT specify the local port for an outgoing connection. - * If you think you need to, there is a very good chance you have a fundamental misunderstanding somewhere. - * Local ports do NOT need to match remote ports. In fact, they almost never do. - * This feature is here for networking professionals using very advanced techniques. -**/ -- (BOOL)connectToHost:(NSString *)host - onPort:(uint16_t)port - viaInterface:(nullable NSString *)interface - withTimeout:(NSTimeInterval)timeout - error:(NSError **)errPtr; - -/** - * Connects to the given address, specified as a sockaddr structure wrapped in a NSData object. - * For example, a NSData object returned from NSNetService's addresses method. - * - * If you have an existing struct sockaddr you can convert it to a NSData object like so: - * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len]; - * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len]; - * - * This method invokes connectToAddress:remoteAddr viaInterface:nil withTimeout:-1 error:errPtr. -**/ -- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr; - -/** - * This method is the same as connectToAddress:error: with an additional timeout option. - * To not time out use a negative time interval, or simply use the connectToAddress:error: method. -**/ -- (BOOL)connectToAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr; - -/** - * Connects to the given address, using the specified interface and timeout. - * - * The address is specified as a sockaddr structure wrapped in a NSData object. - * For example, a NSData object returned from NSNetService's addresses method. - * - * If you have an existing struct sockaddr you can convert it to a NSData object like so: - * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len]; - * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len]; - * - * The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35"). - * The interface may also be used to specify the local port (see below). - * - * The timeout is optional. To not time out use a negative time interval. - * - * This method will return NO if an error is detected, and set the error pointer (if one was given). - * Possible errors would be a nil host, invalid interface, or socket is already connected. - * - * If no errors are detected, this method will start a background connect operation and immediately return YES. - * The delegate callbacks are used to notify you when the socket connects, or if the host was unreachable. - * - * Since this class supports queued reads and writes, you can immediately start reading and/or writing. - * All read/write operations will be queued, and upon socket connection, - * the operations will be dequeued and processed in order. - * - * The interface may optionally contain a port number at the end of the string, separated by a colon. - * This allows you to specify the local port that should be used for the outgoing connection. (read paragraph to end) - * To specify both interface and local port: "en1:8082" or "192.168.4.35:2424". - * To specify only local port: ":8082". - * Please note this is an advanced feature, and is somewhat hidden on purpose. - * You should understand that 99.999% of the time you should NOT specify the local port for an outgoing connection. - * If you think you need to, there is a very good chance you have a fundamental misunderstanding somewhere. - * Local ports do NOT need to match remote ports. In fact, they almost never do. - * This feature is here for networking professionals using very advanced techniques. -**/ -- (BOOL)connectToAddress:(NSData *)remoteAddr - viaInterface:(nullable NSString *)interface - withTimeout:(NSTimeInterval)timeout - error:(NSError **)errPtr; -/** - * Connects to the unix domain socket at the given url, using the specified timeout. - */ -- (BOOL)connectToUrl:(NSURL *)url withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr; - -/** - * Iterates over the given NetService's addresses in order, and invokes connectToAddress:error:. Stops at the - * first invocation that succeeds and returns YES; otherwise returns NO. - */ -- (BOOL)connectToNetService:(NSNetService *)netService error:(NSError **)errPtr; - -#pragma mark Disconnecting - -/** - * Disconnects immediately (synchronously). Any pending reads or writes are dropped. - * - * If the socket is not already disconnected, an invocation to the socketDidDisconnect:withError: delegate method - * will be queued onto the delegateQueue asynchronously (behind any previously queued delegate methods). - * In other words, the disconnected delegate method will be invoked sometime shortly after this method returns. - * - * Please note the recommended way of releasing a GCDAsyncSocket instance (e.g. in a dealloc method) - * [asyncSocket setDelegate:nil]; - * [asyncSocket disconnect]; - * [asyncSocket release]; - * - * If you plan on disconnecting the socket, and then immediately asking it to connect again, - * you'll likely want to do so like this: - * [asyncSocket setDelegate:nil]; - * [asyncSocket disconnect]; - * [asyncSocket setDelegate:self]; - * [asyncSocket connect...]; -**/ -- (void)disconnect; - -/** - * Disconnects after all pending reads have completed. - * After calling this, the read and write methods will do nothing. - * The socket will disconnect even if there are still pending writes. -**/ -- (void)disconnectAfterReading; - -/** - * Disconnects after all pending writes have completed. - * After calling this, the read and write methods will do nothing. - * The socket will disconnect even if there are still pending reads. -**/ -- (void)disconnectAfterWriting; - -/** - * Disconnects after all pending reads and writes have completed. - * After calling this, the read and write methods will do nothing. -**/ -- (void)disconnectAfterReadingAndWriting; - -#pragma mark Diagnostics - -/** - * Returns whether the socket is disconnected or connected. - * - * A disconnected socket may be recycled. - * That is, it can be used again for connecting or listening. - * - * If a socket is in the process of connecting, it may be neither disconnected nor connected. -**/ -@property (atomic, readonly) BOOL isDisconnected; -@property (atomic, readonly) BOOL isConnected; - -/** - * Returns the local or remote host and port to which this socket is connected, or nil and 0 if not connected. - * The host will be an IP address. -**/ -@property (atomic, readonly, nullable) NSString *connectedHost; -@property (atomic, readonly) uint16_t connectedPort; -@property (atomic, readonly, nullable) NSURL *connectedUrl; - -@property (atomic, readonly, nullable) NSString *localHost; -@property (atomic, readonly) uint16_t localPort; - -/** - * Returns the local or remote address to which this socket is connected, - * specified as a sockaddr structure wrapped in a NSData object. - * - * @seealso connectedHost - * @seealso connectedPort - * @seealso localHost - * @seealso localPort -**/ -@property (atomic, readonly, nullable) NSData *connectedAddress; -@property (atomic, readonly, nullable) NSData *localAddress; - -/** - * Returns whether the socket is IPv4 or IPv6. - * An accepting socket may be both. -**/ -@property (atomic, readonly) BOOL isIPv4; -@property (atomic, readonly) BOOL isIPv6; - -/** - * Returns whether or not the socket has been secured via SSL/TLS. - * - * See also the startTLS method. -**/ -@property (atomic, readonly) BOOL isSecure; - -#pragma mark Reading - -// The readData and writeData methods won't block (they are asynchronous). -// -// When a read is complete the socket:didReadData:withTag: delegate method is dispatched on the delegateQueue. -// When a write is complete the socket:didWriteDataWithTag: delegate method is dispatched on the delegateQueue. -// -// You may optionally set a timeout for any read/write operation. (To not timeout, use a negative time interval.) -// If a read/write opertion times out, the corresponding "socket:shouldTimeout..." delegate method -// is called to optionally allow you to extend the timeout. -// Upon a timeout, the "socket:didDisconnectWithError:" method is called -// -// The tag is for your convenience. -// You can use it as an array index, step number, state id, pointer, etc. - -/** - * Reads the first available bytes that become available on the socket. - * - * If the timeout value is negative, the read operation will not use a timeout. -**/ -- (void)readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag; - -/** - * Reads the first available bytes that become available on the socket. - * The bytes will be appended to the given byte buffer starting at the given offset. - * The given buffer will automatically be increased in size if needed. - * - * If the timeout value is negative, the read operation will not use a timeout. - * If the buffer is nil, the socket will create a buffer for you. - * - * If the bufferOffset is greater than the length of the given buffer, - * the method will do nothing, and the delegate will not be called. - * - * If you pass a buffer, you must not alter it in any way while the socket is using it. - * After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer. - * That is, it will reference the bytes that were appended to the given buffer via - * the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO]. -**/ -- (void)readDataWithTimeout:(NSTimeInterval)timeout - buffer:(nullable NSMutableData *)buffer - bufferOffset:(NSUInteger)offset - tag:(long)tag; - -/** - * Reads the first available bytes that become available on the socket. - * The bytes will be appended to the given byte buffer starting at the given offset. - * The given buffer will automatically be increased in size if needed. - * A maximum of length bytes will be read. - * - * If the timeout value is negative, the read operation will not use a timeout. - * If the buffer is nil, a buffer will automatically be created for you. - * If maxLength is zero, no length restriction is enforced. - * - * If the bufferOffset is greater than the length of the given buffer, - * the method will do nothing, and the delegate will not be called. - * - * If you pass a buffer, you must not alter it in any way while the socket is using it. - * After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer. - * That is, it will reference the bytes that were appended to the given buffer via - * the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO]. -**/ -- (void)readDataWithTimeout:(NSTimeInterval)timeout - buffer:(nullable NSMutableData *)buffer - bufferOffset:(NSUInteger)offset - maxLength:(NSUInteger)length - tag:(long)tag; - -/** - * Reads the given number of bytes. - * - * If the timeout value is negative, the read operation will not use a timeout. - * - * If the length is 0, this method does nothing and the delegate is not called. -**/ -- (void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag; - -/** - * Reads the given number of bytes. - * The bytes will be appended to the given byte buffer starting at the given offset. - * The given buffer will automatically be increased in size if needed. - * - * If the timeout value is negative, the read operation will not use a timeout. - * If the buffer is nil, a buffer will automatically be created for you. - * - * If the length is 0, this method does nothing and the delegate is not called. - * If the bufferOffset is greater than the length of the given buffer, - * the method will do nothing, and the delegate will not be called. - * - * If you pass a buffer, you must not alter it in any way while AsyncSocket is using it. - * After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer. - * That is, it will reference the bytes that were appended to the given buffer via - * the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO]. -**/ -- (void)readDataToLength:(NSUInteger)length - withTimeout:(NSTimeInterval)timeout - buffer:(nullable NSMutableData *)buffer - bufferOffset:(NSUInteger)offset - tag:(long)tag; - -/** - * Reads bytes until (and including) the passed "data" parameter, which acts as a separator. - * - * If the timeout value is negative, the read operation will not use a timeout. - * - * If you pass nil or zero-length data as the "data" parameter, - * the method will do nothing (except maybe print a warning), and the delegate will not be called. - * - * To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter. - * If you're developing your own custom protocol, be sure your separator can not occur naturally as - * part of the data between separators. - * For example, imagine you want to send several small documents over a socket. - * Using CRLF as a separator is likely unwise, as a CRLF could easily exist within the documents. - * In this particular example, it would be better to use a protocol similar to HTTP with - * a header that includes the length of the document. - * Also be careful that your separator cannot occur naturally as part of the encoding for a character. - * - * The given data (separator) parameter should be immutable. - * For performance reasons, the socket will retain it, not copy it. - * So if it is immutable, don't modify it while the socket is using it. -**/ -- (void)readDataToData:(nullable NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag; - -/** - * Reads bytes until (and including) the passed "data" parameter, which acts as a separator. - * The bytes will be appended to the given byte buffer starting at the given offset. - * The given buffer will automatically be increased in size if needed. - * - * If the timeout value is negative, the read operation will not use a timeout. - * If the buffer is nil, a buffer will automatically be created for you. - * - * If the bufferOffset is greater than the length of the given buffer, - * the method will do nothing (except maybe print a warning), and the delegate will not be called. - * - * If you pass a buffer, you must not alter it in any way while the socket is using it. - * After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer. - * That is, it will reference the bytes that were appended to the given buffer via - * the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO]. - * - * To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter. - * If you're developing your own custom protocol, be sure your separator can not occur naturally as - * part of the data between separators. - * For example, imagine you want to send several small documents over a socket. - * Using CRLF as a separator is likely unwise, as a CRLF could easily exist within the documents. - * In this particular example, it would be better to use a protocol similar to HTTP with - * a header that includes the length of the document. - * Also be careful that your separator cannot occur naturally as part of the encoding for a character. - * - * The given data (separator) parameter should be immutable. - * For performance reasons, the socket will retain it, not copy it. - * So if it is immutable, don't modify it while the socket is using it. -**/ -- (void)readDataToData:(NSData *)data - withTimeout:(NSTimeInterval)timeout - buffer:(nullable NSMutableData *)buffer - bufferOffset:(NSUInteger)offset - tag:(long)tag; - -/** - * Reads bytes until (and including) the passed "data" parameter, which acts as a separator. - * - * If the timeout value is negative, the read operation will not use a timeout. - * - * If maxLength is zero, no length restriction is enforced. - * Otherwise if maxLength bytes are read without completing the read, - * it is treated similarly to a timeout - the socket is closed with a GCDAsyncSocketReadMaxedOutError. - * The read will complete successfully if exactly maxLength bytes are read and the given data is found at the end. - * - * If you pass nil or zero-length data as the "data" parameter, - * the method will do nothing (except maybe print a warning), and the delegate will not be called. - * If you pass a maxLength parameter that is less than the length of the data parameter, - * the method will do nothing (except maybe print a warning), and the delegate will not be called. - * - * To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter. - * If you're developing your own custom protocol, be sure your separator can not occur naturally as - * part of the data between separators. - * For example, imagine you want to send several small documents over a socket. - * Using CRLF as a separator is likely unwise, as a CRLF could easily exist within the documents. - * In this particular example, it would be better to use a protocol similar to HTTP with - * a header that includes the length of the document. - * Also be careful that your separator cannot occur naturally as part of the encoding for a character. - * - * The given data (separator) parameter should be immutable. - * For performance reasons, the socket will retain it, not copy it. - * So if it is immutable, don't modify it while the socket is using it. -**/ -- (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout maxLength:(NSUInteger)length tag:(long)tag; - -/** - * Reads bytes until (and including) the passed "data" parameter, which acts as a separator. - * The bytes will be appended to the given byte buffer starting at the given offset. - * The given buffer will automatically be increased in size if needed. - * - * If the timeout value is negative, the read operation will not use a timeout. - * If the buffer is nil, a buffer will automatically be created for you. - * - * If maxLength is zero, no length restriction is enforced. - * Otherwise if maxLength bytes are read without completing the read, - * it is treated similarly to a timeout - the socket is closed with a GCDAsyncSocketReadMaxedOutError. - * The read will complete successfully if exactly maxLength bytes are read and the given data is found at the end. - * - * If you pass a maxLength parameter that is less than the length of the data (separator) parameter, - * the method will do nothing (except maybe print a warning), and the delegate will not be called. - * If the bufferOffset is greater than the length of the given buffer, - * the method will do nothing (except maybe print a warning), and the delegate will not be called. - * - * If you pass a buffer, you must not alter it in any way while the socket is using it. - * After completion, the data returned in socket:didReadData:withTag: will be a subset of the given buffer. - * That is, it will reference the bytes that were appended to the given buffer via - * the method [NSData dataWithBytesNoCopy:length:freeWhenDone:NO]. - * - * To read a line from the socket, use the line separator (e.g. CRLF for HTTP, see below) as the "data" parameter. - * If you're developing your own custom protocol, be sure your separator can not occur naturally as - * part of the data between separators. - * For example, imagine you want to send several small documents over a socket. - * Using CRLF as a separator is likely unwise, as a CRLF could easily exist within the documents. - * In this particular example, it would be better to use a protocol similar to HTTP with - * a header that includes the length of the document. - * Also be careful that your separator cannot occur naturally as part of the encoding for a character. - * - * The given data (separator) parameter should be immutable. - * For performance reasons, the socket will retain it, not copy it. - * So if it is immutable, don't modify it while the socket is using it. -**/ -- (void)readDataToData:(NSData *)data - withTimeout:(NSTimeInterval)timeout - buffer:(nullable NSMutableData *)buffer - bufferOffset:(NSUInteger)offset - maxLength:(NSUInteger)length - tag:(long)tag; - -/** - * Returns progress of the current read, from 0.0 to 1.0, or NaN if no current read (use isnan() to check). - * The parameters "tag", "done" and "total" will be filled in if they aren't NULL. -**/ -- (float)progressOfReadReturningTag:(nullable long *)tagPtr bytesDone:(nullable NSUInteger *)donePtr total:(nullable NSUInteger *)totalPtr; - -#pragma mark Writing - -/** - * Writes data to the socket, and calls the delegate when finished. - * - * If you pass in nil or zero-length data, this method does nothing and the delegate will not be called. - * If the timeout value is negative, the write operation will not use a timeout. - * - * Thread-Safety Note: - * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while - * the socket is writing it. In other words, it's not safe to alter the data until after the delegate method - * socket:didWriteDataWithTag: is invoked signifying that this particular write operation has completed. - * This is due to the fact that GCDAsyncSocket does NOT copy the data. It simply retains it. - * This is for performance reasons. Often times, if NSMutableData is passed, it is because - * a request/response was built up in memory. Copying this data adds an unwanted/unneeded overhead. - * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket - * completes writing the bytes (which is NOT immediately after this method returns, but rather at a later time - * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method. -**/ -- (void)writeData:(nullable NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag; - -/** - * Returns progress of the current write, from 0.0 to 1.0, or NaN if no current write (use isnan() to check). - * The parameters "tag", "done" and "total" will be filled in if they aren't NULL. -**/ -- (float)progressOfWriteReturningTag:(nullable long *)tagPtr bytesDone:(nullable NSUInteger *)donePtr total:(nullable NSUInteger *)totalPtr; - -#pragma mark Security - -/** - * Secures the connection using SSL/TLS. - * - * This method may be called at any time, and the TLS handshake will occur after all pending reads and writes - * are finished. This allows one the option of sending a protocol dependent StartTLS message, and queuing - * the upgrade to TLS at the same time, without having to wait for the write to finish. - * Any reads or writes scheduled after this method is called will occur over the secured connection. - * - * ==== The available TOP-LEVEL KEYS are: - * - * - GCDAsyncSocketManuallyEvaluateTrust - * The value must be of type NSNumber, encapsulating a BOOL value. - * If you set this to YES, then the underlying SecureTransport system will not evaluate the SecTrustRef of the peer. - * Instead it will pause at the moment evaulation would typically occur, - * and allow us to handle the security evaluation however we see fit. - * So GCDAsyncSocket will invoke the delegate method socket:shouldTrustPeer: passing the SecTrustRef. - * - * Note that if you set this option, then all other configuration keys are ignored. - * Evaluation will be completely up to you during the socket:didReceiveTrust:completionHandler: delegate method. - * - * For more information on trust evaluation see: - * Apple's Technical Note TN2232 - HTTPS Server Trust Evaluation - * https://developer.apple.com/library/ios/technotes/tn2232/_index.html - * - * If unspecified, the default value is NO. - * - * - GCDAsyncSocketUseCFStreamForTLS (iOS only) - * The value must be of type NSNumber, encapsulating a BOOL value. - * By default GCDAsyncSocket will use the SecureTransport layer to perform encryption. - * This gives us more control over the security protocol (many more configuration options), - * plus it allows us to optimize things like sys calls and buffer allocation. - * - * However, if you absolutely must, you can instruct GCDAsyncSocket to use the old-fashioned encryption - * technique by going through the CFStream instead. So instead of using SecureTransport, GCDAsyncSocket - * will instead setup a CFRead/CFWriteStream. And then set the kCFStreamPropertySSLSettings property - * (via CFReadStreamSetProperty / CFWriteStreamSetProperty) and will pass the given options to this method. - * - * Thus all the other keys in the given dictionary will be ignored by GCDAsyncSocket, - * and will passed directly CFReadStreamSetProperty / CFWriteStreamSetProperty. - * For more infomation on these keys, please see the documentation for kCFStreamPropertySSLSettings. - * - * If unspecified, the default value is NO. - * - * ==== The available CONFIGURATION KEYS are: - * - * - kCFStreamSSLPeerName - * The value must be of type NSString. - * It should match the name in the X.509 certificate given by the remote party. - * See Apple's documentation for SSLSetPeerDomainName. - * - * - kCFStreamSSLCertificates - * The value must be of type NSArray. - * See Apple's documentation for SSLSetCertificate. - * - * - kCFStreamSSLIsServer - * The value must be of type NSNumber, encapsulationg a BOOL value. - * See Apple's documentation for SSLCreateContext for iOS. - * This is optional for iOS. If not supplied, a NO value is the default. - * This is not needed for Mac OS X, and the value is ignored. - * - * - GCDAsyncSocketSSLPeerID - * The value must be of type NSData. - * You must set this value if you want to use TLS session resumption. - * See Apple's documentation for SSLSetPeerID. - * - * - GCDAsyncSocketSSLProtocolVersionMin - * - GCDAsyncSocketSSLProtocolVersionMax - * The value(s) must be of type NSNumber, encapsulting a SSLProtocol value. - * See Apple's documentation for SSLSetProtocolVersionMin & SSLSetProtocolVersionMax. - * See also the SSLProtocol typedef. - * - * - GCDAsyncSocketSSLSessionOptionFalseStart - * The value must be of type NSNumber, encapsulating a BOOL value. - * See Apple's documentation for kSSLSessionOptionFalseStart. - * - * - GCDAsyncSocketSSLSessionOptionSendOneByteRecord - * The value must be of type NSNumber, encapsulating a BOOL value. - * See Apple's documentation for kSSLSessionOptionSendOneByteRecord. - * - * - GCDAsyncSocketSSLCipherSuites - * The values must be of type NSArray. - * Each item within the array must be a NSNumber, encapsulating an SSLCipherSuite. - * See Apple's documentation for SSLSetEnabledCiphers. - * See also the SSLCipherSuite typedef. - * - * - GCDAsyncSocketSSLDiffieHellmanParameters (Mac OS X only) - * The value must be of type NSData. - * See Apple's documentation for SSLSetDiffieHellmanParams. - * - * ==== The following UNAVAILABLE KEYS are: (with throw an exception) - * - * - kCFStreamSSLAllowsAnyRoot (UNAVAILABLE) - * You MUST use manual trust evaluation instead (see GCDAsyncSocketManuallyEvaluateTrust). - * Corresponding deprecated method: SSLSetAllowsAnyRoot - * - * - kCFStreamSSLAllowsExpiredRoots (UNAVAILABLE) - * You MUST use manual trust evaluation instead (see GCDAsyncSocketManuallyEvaluateTrust). - * Corresponding deprecated method: SSLSetAllowsExpiredRoots - * - * - kCFStreamSSLAllowsExpiredCertificates (UNAVAILABLE) - * You MUST use manual trust evaluation instead (see GCDAsyncSocketManuallyEvaluateTrust). - * Corresponding deprecated method: SSLSetAllowsExpiredCerts - * - * - kCFStreamSSLValidatesCertificateChain (UNAVAILABLE) - * You MUST use manual trust evaluation instead (see GCDAsyncSocketManuallyEvaluateTrust). - * Corresponding deprecated method: SSLSetEnableCertVerify - * - * - kCFStreamSSLLevel (UNAVAILABLE) - * You MUST use GCDAsyncSocketSSLProtocolVersionMin & GCDAsyncSocketSSLProtocolVersionMin instead. - * Corresponding deprecated method: SSLSetProtocolVersionEnabled - * - * - * Please refer to Apple's documentation for corresponding SSLFunctions. - * - * If you pass in nil or an empty dictionary, the default settings will be used. - * - * IMPORTANT SECURITY NOTE: - * The default settings will check to make sure the remote party's certificate is signed by a - * trusted 3rd party certificate agency (e.g. verisign) and that the certificate is not expired. - * However it will not verify the name on the certificate unless you - * give it a name to verify against via the kCFStreamSSLPeerName key. - * The security implications of this are important to understand. - * Imagine you are attempting to create a secure connection to MySecureServer.com, - * but your socket gets directed to MaliciousServer.com because of a hacked DNS server. - * If you simply use the default settings, and MaliciousServer.com has a valid certificate, - * the default settings will not detect any problems since the certificate is valid. - * To properly secure your connection in this particular scenario you - * should set the kCFStreamSSLPeerName property to "MySecureServer.com". - * - * You can also perform additional validation in socketDidSecure. -**/ -- (void)startTLS:(nullable NSDictionary *)tlsSettings; - -#pragma mark Advanced - -/** - * Traditionally sockets are not closed until the conversation is over. - * However, it is technically possible for the remote enpoint to close its write stream. - * Our socket would then be notified that there is no more data to be read, - * but our socket would still be writeable and the remote endpoint could continue to receive our data. - * - * The argument for this confusing functionality stems from the idea that a client could shut down its - * write stream after sending a request to the server, thus notifying the server there are to be no further requests. - * In practice, however, this technique did little to help server developers. - * - * To make matters worse, from a TCP perspective there is no way to tell the difference from a read stream close - * and a full socket close. They both result in the TCP stack receiving a FIN packet. The only way to tell - * is by continuing to write to the socket. If it was only a read stream close, then writes will continue to work. - * Otherwise an error will be occur shortly (when the remote end sends us a RST packet). - * - * In addition to the technical challenges and confusion, many high level socket/stream API's provide - * no support for dealing with the problem. If the read stream is closed, the API immediately declares the - * socket to be closed, and shuts down the write stream as well. In fact, this is what Apple's CFStream API does. - * It might sound like poor design at first, but in fact it simplifies development. - * - * The vast majority of the time if the read stream is closed it's because the remote endpoint closed its socket. - * Thus it actually makes sense to close the socket at this point. - * And in fact this is what most networking developers want and expect to happen. - * However, if you are writing a server that interacts with a plethora of clients, - * you might encounter a client that uses the discouraged technique of shutting down its write stream. - * If this is the case, you can set this property to NO, - * and make use of the socketDidCloseReadStream delegate method. - * - * The default value is YES. -**/ -@property (atomic, assign, readwrite) BOOL autoDisconnectOnClosedReadStream; - -/** - * GCDAsyncSocket maintains thread safety by using an internal serial dispatch_queue. - * In most cases, the instance creates this queue itself. - * However, to allow for maximum flexibility, the internal queue may be passed in the init method. - * This allows for some advanced options such as controlling socket priority via target queues. - * However, when one begins to use target queues like this, they open the door to some specific deadlock issues. - * - * For example, imagine there are 2 queues: - * dispatch_queue_t socketQueue; - * dispatch_queue_t socketTargetQueue; - * - * If you do this (pseudo-code): - * socketQueue.targetQueue = socketTargetQueue; - * - * Then all socketQueue operations will actually get run on the given socketTargetQueue. - * This is fine and works great in most situations. - * But if you run code directly from within the socketTargetQueue that accesses the socket, - * you could potentially get deadlock. Imagine the following code: - * - * - (BOOL)socketHasSomething - * { - * __block BOOL result = NO; - * dispatch_block_t block = ^{ - * result = [self someInternalMethodToBeRunOnlyOnSocketQueue]; - * } - * if (is_executing_on_queue(socketQueue)) - * block(); - * else - * dispatch_sync(socketQueue, block); - * - * return result; - * } - * - * What happens if you call this method from the socketTargetQueue? The result is deadlock. - * This is because the GCD API offers no mechanism to discover a queue's targetQueue. - * Thus we have no idea if our socketQueue is configured with a targetQueue. - * If we had this information, we could easily avoid deadlock. - * But, since these API's are missing or unfeasible, you'll have to explicitly set it. - * - * IF you pass a socketQueue via the init method, - * AND you've configured the passed socketQueue with a targetQueue, - * THEN you should pass the end queue in the target hierarchy. - * - * For example, consider the following queue hierarchy: - * socketQueue -> ipQueue -> moduleQueue - * - * This example demonstrates priority shaping within some server. - * All incoming client connections from the same IP address are executed on the same target queue. - * And all connections for a particular module are executed on the same target queue. - * Thus, the priority of all networking for the entire module can be changed on the fly. - * Additionally, networking traffic from a single IP cannot monopolize the module. - * - * Here's how you would accomplish something like that: - * - (dispatch_queue_t)newSocketQueueForConnectionFromAddress:(NSData *)address onSocket:(GCDAsyncSocket *)sock - * { - * dispatch_queue_t socketQueue = dispatch_queue_create("", NULL); - * dispatch_queue_t ipQueue = [self ipQueueForAddress:address]; - * - * dispatch_set_target_queue(socketQueue, ipQueue); - * dispatch_set_target_queue(iqQueue, moduleQueue); - * - * return socketQueue; - * } - * - (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket - * { - * [clientConnections addObject:newSocket]; - * [newSocket markSocketQueueTargetQueue:moduleQueue]; - * } - * - * Note: This workaround is ONLY needed if you intend to execute code directly on the ipQueue or moduleQueue. - * This is often NOT the case, as such queues are used solely for execution shaping. -**/ -- (void)markSocketQueueTargetQueue:(dispatch_queue_t)socketQueuesPreConfiguredTargetQueue; -- (void)unmarkSocketQueueTargetQueue:(dispatch_queue_t)socketQueuesPreviouslyConfiguredTargetQueue; - -/** - * It's not thread-safe to access certain variables from outside the socket's internal queue. - * - * For example, the socket file descriptor. - * File descriptors are simply integers which reference an index in the per-process file table. - * However, when one requests a new file descriptor (by opening a file or socket), - * the file descriptor returned is guaranteed to be the lowest numbered unused descriptor. - * So if we're not careful, the following could be possible: - * - * - Thread A invokes a method which returns the socket's file descriptor. - * - The socket is closed via the socket's internal queue on thread B. - * - Thread C opens a file, and subsequently receives the file descriptor that was previously the socket's FD. - * - Thread A is now accessing/altering the file instead of the socket. - * - * In addition to this, other variables are not actually objects, - * and thus cannot be retained/released or even autoreleased. - * An example is the sslContext, of type SSLContextRef, which is actually a malloc'd struct. - * - * Although there are internal variables that make it difficult to maintain thread-safety, - * it is important to provide access to these variables - * to ensure this class can be used in a wide array of environments. - * This method helps to accomplish this by invoking the current block on the socket's internal queue. - * The methods below can be invoked from within the block to access - * those generally thread-unsafe internal variables in a thread-safe manner. - * The given block will be invoked synchronously on the socket's internal queue. - * - * If you save references to any protected variables and use them outside the block, you do so at your own peril. -**/ -- (void)performBlock:(dispatch_block_t)block; - -/** - * These methods are only available from within the context of a performBlock: invocation. - * See the documentation for the performBlock: method above. - * - * Provides access to the socket's file descriptor(s). - * If the socket is a server socket (is accepting incoming connections), - * it might actually have multiple internal socket file descriptors - one for IPv4 and one for IPv6. -**/ -- (int)socketFD; -- (int)socket4FD; -- (int)socket6FD; - -#if TARGET_OS_IPHONE - -/** - * These methods are only available from within the context of a performBlock: invocation. - * See the documentation for the performBlock: method above. - * - * Provides access to the socket's internal CFReadStream/CFWriteStream. - * - * These streams are only used as workarounds for specific iOS shortcomings: - * - * - Apple has decided to keep the SecureTransport framework private is iOS. - * This means the only supplied way to do SSL/TLS is via CFStream or some other API layered on top of it. - * Thus, in order to provide SSL/TLS support on iOS we are forced to rely on CFStream, - * instead of the preferred and faster and more powerful SecureTransport. - * - * - If a socket doesn't have backgrounding enabled, and that socket is closed while the app is backgrounded, - * Apple only bothers to notify us via the CFStream API. - * The faster and more powerful GCD API isn't notified properly in this case. - * - * See also: (BOOL)enableBackgroundingOnSocket -**/ -- (nullable CFReadStreamRef)readStream; -- (nullable CFWriteStreamRef)writeStream; - -/** - * This method is only available from within the context of a performBlock: invocation. - * See the documentation for the performBlock: method above. - * - * Configures the socket to allow it to operate when the iOS application has been backgrounded. - * In other words, this method creates a read & write stream, and invokes: - * - * CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); - * CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); - * - * Returns YES if successful, NO otherwise. - * - * Note: Apple does not officially support backgrounding server sockets. - * That is, if your socket is accepting incoming connections, Apple does not officially support - * allowing iOS applications to accept incoming connections while an app is backgrounded. - * - * Example usage: - * - * - (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port - * { - * [asyncSocket performBlock:^{ - * [asyncSocket enableBackgroundingOnSocket]; - * }]; - * } -**/ -- (BOOL)enableBackgroundingOnSocket; - -#endif - -/** - * This method is only available from within the context of a performBlock: invocation. - * See the documentation for the performBlock: method above. - * - * Provides access to the socket's SSLContext, if SSL/TLS has been started on the socket. -**/ -- (nullable SSLContextRef)sslContext; - -#pragma mark Utilities - -/** - * The address lookup utility used by the class. - * This method is synchronous, so it's recommended you use it on a background thread/queue. - * - * The special strings "localhost" and "loopback" return the loopback address for IPv4 and IPv6. - * - * @returns - * A mutable array with all IPv4 and IPv6 addresses returned by getaddrinfo. - * The addresses are specifically for TCP connections. - * You can filter the addresses, if needed, using the other utility methods provided by the class. -**/ -+ (nullable NSMutableArray *)lookupHost:(NSString *)host port:(uint16_t)port error:(NSError **)errPtr; - -/** - * Extracting host and port information from raw address data. -**/ - -+ (nullable NSString *)hostFromAddress:(NSData *)address; -+ (uint16_t)portFromAddress:(NSData *)address; - -+ (BOOL)isIPv4Address:(NSData *)address; -+ (BOOL)isIPv6Address:(NSData *)address; - -+ (BOOL)getHost:( NSString * __nullable * __nullable)hostPtr port:(nullable uint16_t *)portPtr fromAddress:(NSData *)address; - -+ (BOOL)getHost:(NSString * __nullable * __nullable)hostPtr port:(nullable uint16_t *)portPtr family:(nullable sa_family_t *)afPtr fromAddress:(NSData *)address; - -/** - * A few common line separators, for use with the readDataToData:... methods. -**/ -+ (NSData *)CRLFData; // 0x0D0A -+ (NSData *)CRData; // 0x0D -+ (NSData *)LFData; // 0x0A -+ (NSData *)ZeroData; // 0x00 - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@protocol GCDAsyncSocketDelegate -@optional - -/** - * This method is called immediately prior to socket:didAcceptNewSocket:. - * It optionally allows a listening socket to specify the socketQueue for a new accepted socket. - * If this method is not implemented, or returns NULL, the new accepted socket will create its own default queue. - * - * Since you cannot autorelease a dispatch_queue, - * this method uses the "new" prefix in its name to specify that the returned queue has been retained. - * - * Thus you could do something like this in the implementation: - * return dispatch_queue_create("MyQueue", NULL); - * - * If you are placing multiple sockets on the same queue, - * then care should be taken to increment the retain count each time this method is invoked. - * - * For example, your implementation might look something like this: - * dispatch_retain(myExistingQueue); - * return myExistingQueue; -**/ -- (nullable dispatch_queue_t)newSocketQueueForConnectionFromAddress:(NSData *)address onSocket:(GCDAsyncSocket *)sock; - -/** - * Called when a socket accepts a connection. - * Another socket is automatically spawned to handle it. - * - * You must retain the newSocket if you wish to handle the connection. - * Otherwise the newSocket instance will be released and the spawned connection will be closed. - * - * By default the new socket will have the same delegate and delegateQueue. - * You may, of course, change this at any time. -**/ -- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket; - -/** - * Called when a socket connects and is ready for reading and writing. - * The host parameter will be an IP address, not a DNS name. -**/ -- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(uint16_t)port; - -/** - * Called when a socket connects and is ready for reading and writing. - * The host parameter will be an IP address, not a DNS name. - **/ -- (void)socket:(GCDAsyncSocket *)sock didConnectToUrl:(NSURL *)url; - -/** - * Called when a socket has completed reading the requested data into memory. - * Not called if there is an error. -**/ -- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag; - -/** - * Called when a socket has read in data, but has not yet completed the read. - * This would occur if using readToData: or readToLength: methods. - * It may be used for things such as updating progress bars. -**/ -- (void)socket:(GCDAsyncSocket *)sock didReadPartialDataOfLength:(NSUInteger)partialLength tag:(long)tag; - -/** - * Called when a socket has completed writing the requested data. Not called if there is an error. -**/ -- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag; - -/** - * Called when a socket has written some data, but has not yet completed the entire write. - * It may be used for things such as updating progress bars. -**/ -- (void)socket:(GCDAsyncSocket *)sock didWritePartialDataOfLength:(NSUInteger)partialLength tag:(long)tag; - -/** - * Called if a read operation has reached its timeout without completing. - * This method allows you to optionally extend the timeout. - * If you return a positive time interval (> 0) the read's timeout will be extended by the given amount. - * If you don't implement this method, or return a non-positive time interval (<= 0) the read will timeout as usual. - * - * The elapsed parameter is the sum of the original timeout, plus any additions previously added via this method. - * The length parameter is the number of bytes that have been read so far for the read operation. - * - * Note that this method may be called multiple times for a single read if you return positive numbers. -**/ -- (NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag - elapsed:(NSTimeInterval)elapsed - bytesDone:(NSUInteger)length; - -/** - * Called if a write operation has reached its timeout without completing. - * This method allows you to optionally extend the timeout. - * If you return a positive time interval (> 0) the write's timeout will be extended by the given amount. - * If you don't implement this method, or return a non-positive time interval (<= 0) the write will timeout as usual. - * - * The elapsed parameter is the sum of the original timeout, plus any additions previously added via this method. - * The length parameter is the number of bytes that have been written so far for the write operation. - * - * Note that this method may be called multiple times for a single write if you return positive numbers. -**/ -- (NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutWriteWithTag:(long)tag - elapsed:(NSTimeInterval)elapsed - bytesDone:(NSUInteger)length; - -/** - * Conditionally called if the read stream closes, but the write stream may still be writeable. - * - * This delegate method is only called if autoDisconnectOnClosedReadStream has been set to NO. - * See the discussion on the autoDisconnectOnClosedReadStream method for more information. -**/ -- (void)socketDidCloseReadStream:(GCDAsyncSocket *)sock; - -/** - * Called when a socket disconnects with or without error. - * - * If you call the disconnect method, and the socket wasn't already disconnected, - * then an invocation of this delegate method will be enqueued on the delegateQueue - * before the disconnect method returns. - * - * Note: If the GCDAsyncSocket instance is deallocated while it is still connected, - * and the delegate is not also deallocated, then this method will be invoked, - * but the sock parameter will be nil. (It must necessarily be nil since it is no longer available.) - * This is a generally rare, but is possible if one writes code like this: - * - * asyncSocket = nil; // I'm implicitly disconnecting the socket - * - * In this case it may preferrable to nil the delegate beforehand, like this: - * - * asyncSocket.delegate = nil; // Don't invoke my delegate method - * asyncSocket = nil; // I'm implicitly disconnecting the socket - * - * Of course, this depends on how your state machine is configured. -**/ -- (void)socketDidDisconnect:(GCDAsyncSocket *)sock withError:(nullable NSError *)err; - -/** - * Called after the socket has successfully completed SSL/TLS negotiation. - * This method is not called unless you use the provided startTLS method. - * - * If a SSL/TLS negotiation fails (invalid certificate, etc) then the socket will immediately close, - * and the socketDidDisconnect:withError: delegate method will be called with the specific SSL error code. -**/ -- (void)socketDidSecure:(GCDAsyncSocket *)sock; - -/** - * Allows a socket delegate to hook into the TLS handshake and manually validate the peer it's connecting to. - * - * This is only called if startTLS is invoked with options that include: - * - GCDAsyncSocketManuallyEvaluateTrust == YES - * - * Typically the delegate will use SecTrustEvaluate (and related functions) to properly validate the peer. - * - * Note from Apple's documentation: - * Because [SecTrustEvaluate] might look on the network for certificates in the certificate chain, - * [it] might block while attempting network access. You should never call it from your main thread; - * call it only from within a function running on a dispatch queue or on a separate thread. - * - * Thus this method uses a completionHandler block rather than a normal return value. - * The completionHandler block is thread-safe, and may be invoked from a background queue/thread. - * It is safe to invoke the completionHandler block even if the socket has been closed. -**/ -- (void)socket:(GCDAsyncSocket *)sock didReceiveTrust:(SecTrustRef)trust - completionHandler:(void (^)(BOOL shouldTrustPeer))completionHandler; - -@end -NS_ASSUME_NONNULL_END diff --git a/ios/Pods/CocoaAsyncSocket/Source/GCD/GCDAsyncSocket.m b/ios/Pods/CocoaAsyncSocket/Source/GCD/GCDAsyncSocket.m deleted file mode 100755 index f3d1c17..0000000 --- a/ios/Pods/CocoaAsyncSocket/Source/GCD/GCDAsyncSocket.m +++ /dev/null @@ -1,8526 +0,0 @@ -// -// GCDAsyncSocket.m -// -// This class is in the public domain. -// Originally created by Robbie Hanson in Q4 2010. -// Updated and maintained by Deusty LLC and the Apple development community. -// -// https://github.com/robbiehanson/CocoaAsyncSocket -// - -#import "GCDAsyncSocket.h" - -#if TARGET_OS_IPHONE -#import -#endif - -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import - -#if ! __has_feature(objc_arc) -#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). -// For more information see: https://github.com/robbiehanson/CocoaAsyncSocket/wiki/ARC -#endif - - -#ifndef GCDAsyncSocketLoggingEnabled -#define GCDAsyncSocketLoggingEnabled 0 -#endif - -#if GCDAsyncSocketLoggingEnabled - -// Logging Enabled - See log level below - -// Logging uses the CocoaLumberjack framework (which is also GCD based). -// https://github.com/robbiehanson/CocoaLumberjack -// -// It allows us to do a lot of logging without significantly slowing down the code. -#import "DDLog.h" - -#define LogAsync YES -#define LogContext GCDAsyncSocketLoggingContext - -#define LogObjc(flg, frmt, ...) LOG_OBJC_MAYBE(LogAsync, logLevel, flg, LogContext, frmt, ##__VA_ARGS__) -#define LogC(flg, frmt, ...) LOG_C_MAYBE(LogAsync, logLevel, flg, LogContext, frmt, ##__VA_ARGS__) - -#define LogError(frmt, ...) LogObjc(LOG_FLAG_ERROR, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) -#define LogWarn(frmt, ...) LogObjc(LOG_FLAG_WARN, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) -#define LogInfo(frmt, ...) LogObjc(LOG_FLAG_INFO, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) -#define LogVerbose(frmt, ...) LogObjc(LOG_FLAG_VERBOSE, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) - -#define LogCError(frmt, ...) LogC(LOG_FLAG_ERROR, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) -#define LogCWarn(frmt, ...) LogC(LOG_FLAG_WARN, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) -#define LogCInfo(frmt, ...) LogC(LOG_FLAG_INFO, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) -#define LogCVerbose(frmt, ...) LogC(LOG_FLAG_VERBOSE, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) - -#define LogTrace() LogObjc(LOG_FLAG_VERBOSE, @"%@: %@", THIS_FILE, THIS_METHOD) -#define LogCTrace() LogC(LOG_FLAG_VERBOSE, @"%@: %s", THIS_FILE, __FUNCTION__) - -#ifndef GCDAsyncSocketLogLevel -#define GCDAsyncSocketLogLevel LOG_LEVEL_VERBOSE -#endif - -// Log levels : off, error, warn, info, verbose -static const int logLevel = GCDAsyncSocketLogLevel; - -#else - -// Logging Disabled - -#define LogError(frmt, ...) {} -#define LogWarn(frmt, ...) {} -#define LogInfo(frmt, ...) {} -#define LogVerbose(frmt, ...) {} - -#define LogCError(frmt, ...) {} -#define LogCWarn(frmt, ...) {} -#define LogCInfo(frmt, ...) {} -#define LogCVerbose(frmt, ...) {} - -#define LogTrace() {} -#define LogCTrace(frmt, ...) {} - -#endif - -/** - * Seeing a return statements within an inner block - * can sometimes be mistaken for a return point of the enclosing method. - * This makes inline blocks a bit easier to read. -**/ -#define return_from_block return - -/** - * A socket file descriptor is really just an integer. - * It represents the index of the socket within the kernel. - * This makes invalid file descriptor comparisons easier to read. -**/ -#define SOCKET_NULL -1 - - -NSString *const GCDAsyncSocketException = @"GCDAsyncSocketException"; -NSString *const GCDAsyncSocketErrorDomain = @"GCDAsyncSocketErrorDomain"; - -NSString *const GCDAsyncSocketQueueName = @"GCDAsyncSocket"; -NSString *const GCDAsyncSocketThreadName = @"GCDAsyncSocket-CFStream"; - -NSString *const GCDAsyncSocketManuallyEvaluateTrust = @"GCDAsyncSocketManuallyEvaluateTrust"; -#if TARGET_OS_IPHONE -NSString *const GCDAsyncSocketUseCFStreamForTLS = @"GCDAsyncSocketUseCFStreamForTLS"; -#endif -NSString *const GCDAsyncSocketSSLPeerID = @"GCDAsyncSocketSSLPeerID"; -NSString *const GCDAsyncSocketSSLProtocolVersionMin = @"GCDAsyncSocketSSLProtocolVersionMin"; -NSString *const GCDAsyncSocketSSLProtocolVersionMax = @"GCDAsyncSocketSSLProtocolVersionMax"; -NSString *const GCDAsyncSocketSSLSessionOptionFalseStart = @"GCDAsyncSocketSSLSessionOptionFalseStart"; -NSString *const GCDAsyncSocketSSLSessionOptionSendOneByteRecord = @"GCDAsyncSocketSSLSessionOptionSendOneByteRecord"; -NSString *const GCDAsyncSocketSSLCipherSuites = @"GCDAsyncSocketSSLCipherSuites"; -NSString *const GCDAsyncSocketSSLALPN = @"GCDAsyncSocketSSLALPN"; -#if !TARGET_OS_IPHONE -NSString *const GCDAsyncSocketSSLDiffieHellmanParameters = @"GCDAsyncSocketSSLDiffieHellmanParameters"; -#endif - -enum GCDAsyncSocketFlags -{ - kSocketStarted = 1 << 0, // If set, socket has been started (accepting/connecting) - kConnected = 1 << 1, // If set, the socket is connected - kForbidReadsWrites = 1 << 2, // If set, no new reads or writes are allowed - kReadsPaused = 1 << 3, // If set, reads are paused due to possible timeout - kWritesPaused = 1 << 4, // If set, writes are paused due to possible timeout - kDisconnectAfterReads = 1 << 5, // If set, disconnect after no more reads are queued - kDisconnectAfterWrites = 1 << 6, // If set, disconnect after no more writes are queued - kSocketCanAcceptBytes = 1 << 7, // If set, we know socket can accept bytes. If unset, it's unknown. - kReadSourceSuspended = 1 << 8, // If set, the read source is suspended - kWriteSourceSuspended = 1 << 9, // If set, the write source is suspended - kQueuedTLS = 1 << 10, // If set, we've queued an upgrade to TLS - kStartingReadTLS = 1 << 11, // If set, we're waiting for TLS negotiation to complete - kStartingWriteTLS = 1 << 12, // If set, we're waiting for TLS negotiation to complete - kSocketSecure = 1 << 13, // If set, socket is using secure communication via SSL/TLS - kSocketHasReadEOF = 1 << 14, // If set, we have read EOF from socket - kReadStreamClosed = 1 << 15, // If set, we've read EOF plus prebuffer has been drained - kDealloc = 1 << 16, // If set, the socket is being deallocated -#if TARGET_OS_IPHONE - kAddedStreamsToRunLoop = 1 << 17, // If set, CFStreams have been added to listener thread - kUsingCFStreamForTLS = 1 << 18, // If set, we're forced to use CFStream instead of SecureTransport - kSecureSocketHasBytesAvailable = 1 << 19, // If set, CFReadStream has notified us of bytes available -#endif -}; - -enum GCDAsyncSocketConfig -{ - kIPv4Disabled = 1 << 0, // If set, IPv4 is disabled - kIPv6Disabled = 1 << 1, // If set, IPv6 is disabled - kPreferIPv6 = 1 << 2, // If set, IPv6 is preferred over IPv4 - kAllowHalfDuplexConnection = 1 << 3, // If set, the socket will stay open even if the read stream closes -}; - -#if TARGET_OS_IPHONE - static NSThread *cfstreamThread; // Used for CFStreams - - - static uint64_t cfstreamThreadRetainCount; // setup & teardown - static dispatch_queue_t cfstreamThreadSetupQueue; // setup & teardown -#endif - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * A PreBuffer is used when there is more data available on the socket - * than is being requested by current read request. - * In this case we slurp up all data from the socket (to minimize sys calls), - * and store additional yet unread data in a "prebuffer". - * - * The prebuffer is entirely drained before we read from the socket again. - * In other words, a large chunk of data is written is written to the prebuffer. - * The prebuffer is then drained via a series of one or more reads (for subsequent read request(s)). - * - * A ring buffer was once used for this purpose. - * But a ring buffer takes up twice as much memory as needed (double the size for mirroring). - * In fact, it generally takes up more than twice the needed size as everything has to be rounded up to vm_page_size. - * And since the prebuffer is always completely drained after being written to, a full ring buffer isn't needed. - * - * The current design is very simple and straight-forward, while also keeping memory requirements lower. -**/ - -@interface GCDAsyncSocketPreBuffer : NSObject -{ - uint8_t *preBuffer; - size_t preBufferSize; - - uint8_t *readPointer; - uint8_t *writePointer; -} - -- (instancetype)initWithCapacity:(size_t)numBytes NS_DESIGNATED_INITIALIZER; - -- (void)ensureCapacityForWrite:(size_t)numBytes; - -- (size_t)availableBytes; -- (uint8_t *)readBuffer; - -- (void)getReadBuffer:(uint8_t **)bufferPtr availableBytes:(size_t *)availableBytesPtr; - -- (size_t)availableSpace; -- (uint8_t *)writeBuffer; - -- (void)getWriteBuffer:(uint8_t **)bufferPtr availableSpace:(size_t *)availableSpacePtr; - -- (void)didRead:(size_t)bytesRead; -- (void)didWrite:(size_t)bytesWritten; - -- (void)reset; - -@end - -@implementation GCDAsyncSocketPreBuffer - -// Cover the superclass' designated initializer -- (instancetype)init NS_UNAVAILABLE -{ - NSAssert(0, @"Use the designated initializer"); - return nil; -} - -- (instancetype)initWithCapacity:(size_t)numBytes -{ - if ((self = [super init])) - { - preBufferSize = numBytes; - preBuffer = malloc(preBufferSize); - - readPointer = preBuffer; - writePointer = preBuffer; - } - return self; -} - -- (void)dealloc -{ - if (preBuffer) - free(preBuffer); -} - -- (void)ensureCapacityForWrite:(size_t)numBytes -{ - size_t availableSpace = [self availableSpace]; - - if (numBytes > availableSpace) - { - size_t additionalBytes = numBytes - availableSpace; - - size_t newPreBufferSize = preBufferSize + additionalBytes; - uint8_t *newPreBuffer = realloc(preBuffer, newPreBufferSize); - - size_t readPointerOffset = readPointer - preBuffer; - size_t writePointerOffset = writePointer - preBuffer; - - preBuffer = newPreBuffer; - preBufferSize = newPreBufferSize; - - readPointer = preBuffer + readPointerOffset; - writePointer = preBuffer + writePointerOffset; - } -} - -- (size_t)availableBytes -{ - return writePointer - readPointer; -} - -- (uint8_t *)readBuffer -{ - return readPointer; -} - -- (void)getReadBuffer:(uint8_t **)bufferPtr availableBytes:(size_t *)availableBytesPtr -{ - if (bufferPtr) *bufferPtr = readPointer; - if (availableBytesPtr) *availableBytesPtr = [self availableBytes]; -} - -- (void)didRead:(size_t)bytesRead -{ - readPointer += bytesRead; - - if (readPointer == writePointer) - { - // The prebuffer has been drained. Reset pointers. - readPointer = preBuffer; - writePointer = preBuffer; - } -} - -- (size_t)availableSpace -{ - return preBufferSize - (writePointer - preBuffer); -} - -- (uint8_t *)writeBuffer -{ - return writePointer; -} - -- (void)getWriteBuffer:(uint8_t **)bufferPtr availableSpace:(size_t *)availableSpacePtr -{ - if (bufferPtr) *bufferPtr = writePointer; - if (availableSpacePtr) *availableSpacePtr = [self availableSpace]; -} - -- (void)didWrite:(size_t)bytesWritten -{ - writePointer += bytesWritten; -} - -- (void)reset -{ - readPointer = preBuffer; - writePointer = preBuffer; -} - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * The GCDAsyncReadPacket encompasses the instructions for any given read. - * The content of a read packet allows the code to determine if we're: - * - reading to a certain length - * - reading to a certain separator - * - or simply reading the first chunk of available data -**/ -@interface GCDAsyncReadPacket : NSObject -{ - @public - NSMutableData *buffer; - NSUInteger startOffset; - NSUInteger bytesDone; - NSUInteger maxLength; - NSTimeInterval timeout; - NSUInteger readLength; - NSData *term; - BOOL bufferOwner; - NSUInteger originalBufferLength; - long tag; -} -- (instancetype)initWithData:(NSMutableData *)d - startOffset:(NSUInteger)s - maxLength:(NSUInteger)m - timeout:(NSTimeInterval)t - readLength:(NSUInteger)l - terminator:(NSData *)e - tag:(long)i NS_DESIGNATED_INITIALIZER; - -- (void)ensureCapacityForAdditionalDataOfLength:(NSUInteger)bytesToRead; - -- (NSUInteger)optimalReadLengthWithDefault:(NSUInteger)defaultValue shouldPreBuffer:(BOOL *)shouldPreBufferPtr; - -- (NSUInteger)readLengthForNonTermWithHint:(NSUInteger)bytesAvailable; -- (NSUInteger)readLengthForTermWithHint:(NSUInteger)bytesAvailable shouldPreBuffer:(BOOL *)shouldPreBufferPtr; -- (NSUInteger)readLengthForTermWithPreBuffer:(GCDAsyncSocketPreBuffer *)preBuffer found:(BOOL *)foundPtr; - -- (NSInteger)searchForTermAfterPreBuffering:(ssize_t)numBytes; - -@end - -@implementation GCDAsyncReadPacket - -// Cover the superclass' designated initializer -- (instancetype)init NS_UNAVAILABLE -{ - NSAssert(0, @"Use the designated initializer"); - return nil; -} - -- (instancetype)initWithData:(NSMutableData *)d - startOffset:(NSUInteger)s - maxLength:(NSUInteger)m - timeout:(NSTimeInterval)t - readLength:(NSUInteger)l - terminator:(NSData *)e - tag:(long)i -{ - if((self = [super init])) - { - bytesDone = 0; - maxLength = m; - timeout = t; - readLength = l; - term = [e copy]; - tag = i; - - if (d) - { - buffer = d; - startOffset = s; - bufferOwner = NO; - originalBufferLength = [d length]; - } - else - { - if (readLength > 0) - buffer = [[NSMutableData alloc] initWithLength:readLength]; - else - buffer = [[NSMutableData alloc] initWithLength:0]; - - startOffset = 0; - bufferOwner = YES; - originalBufferLength = 0; - } - } - return self; -} - -/** - * Increases the length of the buffer (if needed) to ensure a read of the given size will fit. -**/ -- (void)ensureCapacityForAdditionalDataOfLength:(NSUInteger)bytesToRead -{ - NSUInteger buffSize = [buffer length]; - NSUInteger buffUsed = startOffset + bytesDone; - - NSUInteger buffSpace = buffSize - buffUsed; - - if (bytesToRead > buffSpace) - { - NSUInteger buffInc = bytesToRead - buffSpace; - - [buffer increaseLengthBy:buffInc]; - } -} - -/** - * This method is used when we do NOT know how much data is available to be read from the socket. - * This method returns the default value unless it exceeds the specified readLength or maxLength. - * - * Furthermore, the shouldPreBuffer decision is based upon the packet type, - * and whether the returned value would fit in the current buffer without requiring a resize of the buffer. -**/ -- (NSUInteger)optimalReadLengthWithDefault:(NSUInteger)defaultValue shouldPreBuffer:(BOOL *)shouldPreBufferPtr -{ - NSUInteger result; - - if (readLength > 0) - { - // Read a specific length of data - result = readLength - bytesDone; - - // There is no need to prebuffer since we know exactly how much data we need to read. - // Even if the buffer isn't currently big enough to fit this amount of data, - // it would have to be resized eventually anyway. - - if (shouldPreBufferPtr) - *shouldPreBufferPtr = NO; - } - else - { - // Either reading until we find a specified terminator, - // or we're simply reading all available data. - // - // In other words, one of: - // - // - readDataToData packet - // - readDataWithTimeout packet - - if (maxLength > 0) - result = MIN(defaultValue, (maxLength - bytesDone)); - else - result = defaultValue; - - // Since we don't know the size of the read in advance, - // the shouldPreBuffer decision is based upon whether the returned value would fit - // in the current buffer without requiring a resize of the buffer. - // - // This is because, in all likelyhood, the amount read from the socket will be less than the default value. - // Thus we should avoid over-allocating the read buffer when we can simply use the pre-buffer instead. - - if (shouldPreBufferPtr) - { - NSUInteger buffSize = [buffer length]; - NSUInteger buffUsed = startOffset + bytesDone; - - NSUInteger buffSpace = buffSize - buffUsed; - - if (buffSpace >= result) - *shouldPreBufferPtr = NO; - else - *shouldPreBufferPtr = YES; - } - } - - return result; -} - -/** - * For read packets without a set terminator, returns the amount of data - * that can be read without exceeding the readLength or maxLength. - * - * The given parameter indicates the number of bytes estimated to be available on the socket, - * which is taken into consideration during the calculation. - * - * The given hint MUST be greater than zero. -**/ -- (NSUInteger)readLengthForNonTermWithHint:(NSUInteger)bytesAvailable -{ - NSAssert(term == nil, @"This method does not apply to term reads"); - NSAssert(bytesAvailable > 0, @"Invalid parameter: bytesAvailable"); - - if (readLength > 0) - { - // Read a specific length of data - - return MIN(bytesAvailable, (readLength - bytesDone)); - - // No need to avoid resizing the buffer. - // If the user provided their own buffer, - // and told us to read a certain length of data that exceeds the size of the buffer, - // then it is clear that our code will resize the buffer during the read operation. - // - // This method does not actually do any resizing. - // The resizing will happen elsewhere if needed. - } - else - { - // Read all available data - - NSUInteger result = bytesAvailable; - - if (maxLength > 0) - { - result = MIN(result, (maxLength - bytesDone)); - } - - // No need to avoid resizing the buffer. - // If the user provided their own buffer, - // and told us to read all available data without giving us a maxLength, - // then it is clear that our code might resize the buffer during the read operation. - // - // This method does not actually do any resizing. - // The resizing will happen elsewhere if needed. - - return result; - } -} - -/** - * For read packets with a set terminator, returns the amount of data - * that can be read without exceeding the maxLength. - * - * The given parameter indicates the number of bytes estimated to be available on the socket, - * which is taken into consideration during the calculation. - * - * To optimize memory allocations, mem copies, and mem moves - * the shouldPreBuffer boolean value will indicate if the data should be read into a prebuffer first, - * or if the data can be read directly into the read packet's buffer. -**/ -- (NSUInteger)readLengthForTermWithHint:(NSUInteger)bytesAvailable shouldPreBuffer:(BOOL *)shouldPreBufferPtr -{ - NSAssert(term != nil, @"This method does not apply to non-term reads"); - NSAssert(bytesAvailable > 0, @"Invalid parameter: bytesAvailable"); - - - NSUInteger result = bytesAvailable; - - if (maxLength > 0) - { - result = MIN(result, (maxLength - bytesDone)); - } - - // Should the data be read into the read packet's buffer, or into a pre-buffer first? - // - // One would imagine the preferred option is the faster one. - // So which one is faster? - // - // Reading directly into the packet's buffer requires: - // 1. Possibly resizing packet buffer (malloc/realloc) - // 2. Filling buffer (read) - // 3. Searching for term (memcmp) - // 4. Possibly copying overflow into prebuffer (malloc/realloc, memcpy) - // - // Reading into prebuffer first: - // 1. Possibly resizing prebuffer (malloc/realloc) - // 2. Filling buffer (read) - // 3. Searching for term (memcmp) - // 4. Copying underflow into packet buffer (malloc/realloc, memcpy) - // 5. Removing underflow from prebuffer (memmove) - // - // Comparing the performance of the two we can see that reading - // data into the prebuffer first is slower due to the extra memove. - // - // However: - // The implementation of NSMutableData is open source via core foundation's CFMutableData. - // Decreasing the length of a mutable data object doesn't cause a realloc. - // In other words, the capacity of a mutable data object can grow, but doesn't shrink. - // - // This means the prebuffer will rarely need a realloc. - // The packet buffer, on the other hand, may often need a realloc. - // This is especially true if we are the buffer owner. - // Furthermore, if we are constantly realloc'ing the packet buffer, - // and then moving the overflow into the prebuffer, - // then we're consistently over-allocating memory for each term read. - // And now we get into a bit of a tradeoff between speed and memory utilization. - // - // The end result is that the two perform very similarly. - // And we can answer the original question very simply by another means. - // - // If we can read all the data directly into the packet's buffer without resizing it first, - // then we do so. Otherwise we use the prebuffer. - - if (shouldPreBufferPtr) - { - NSUInteger buffSize = [buffer length]; - NSUInteger buffUsed = startOffset + bytesDone; - - if ((buffSize - buffUsed) >= result) - *shouldPreBufferPtr = NO; - else - *shouldPreBufferPtr = YES; - } - - return result; -} - -/** - * For read packets with a set terminator, - * returns the amount of data that can be read from the given preBuffer, - * without going over a terminator or the maxLength. - * - * It is assumed the terminator has not already been read. -**/ -- (NSUInteger)readLengthForTermWithPreBuffer:(GCDAsyncSocketPreBuffer *)preBuffer found:(BOOL *)foundPtr -{ - NSAssert(term != nil, @"This method does not apply to non-term reads"); - NSAssert([preBuffer availableBytes] > 0, @"Invoked with empty pre buffer!"); - - // We know that the terminator, as a whole, doesn't exist in our own buffer. - // But it is possible that a _portion_ of it exists in our buffer. - // So we're going to look for the terminator starting with a portion of our own buffer. - // - // Example: - // - // term length = 3 bytes - // bytesDone = 5 bytes - // preBuffer length = 5 bytes - // - // If we append the preBuffer to our buffer, - // it would look like this: - // - // --------------------- - // |B|B|B|B|B|P|P|P|P|P| - // --------------------- - // - // So we start our search here: - // - // --------------------- - // |B|B|B|B|B|P|P|P|P|P| - // -------^-^-^--------- - // - // And move forwards... - // - // --------------------- - // |B|B|B|B|B|P|P|P|P|P| - // ---------^-^-^------- - // - // Until we find the terminator or reach the end. - // - // --------------------- - // |B|B|B|B|B|P|P|P|P|P| - // ---------------^-^-^- - - BOOL found = NO; - - NSUInteger termLength = [term length]; - NSUInteger preBufferLength = [preBuffer availableBytes]; - - if ((bytesDone + preBufferLength) < termLength) - { - // Not enough data for a full term sequence yet - return preBufferLength; - } - - NSUInteger maxPreBufferLength; - if (maxLength > 0) { - maxPreBufferLength = MIN(preBufferLength, (maxLength - bytesDone)); - - // Note: maxLength >= termLength - } - else { - maxPreBufferLength = preBufferLength; - } - - uint8_t seq[termLength]; - const void *termBuf = [term bytes]; - - NSUInteger bufLen = MIN(bytesDone, (termLength - 1)); - uint8_t *buf = (uint8_t *)[buffer mutableBytes] + startOffset + bytesDone - bufLen; - - NSUInteger preLen = termLength - bufLen; - const uint8_t *pre = [preBuffer readBuffer]; - - NSUInteger loopCount = bufLen + maxPreBufferLength - termLength + 1; // Plus one. See example above. - - NSUInteger result = maxPreBufferLength; - - NSUInteger i; - for (i = 0; i < loopCount; i++) - { - if (bufLen > 0) - { - // Combining bytes from buffer and preBuffer - - memcpy(seq, buf, bufLen); - memcpy(seq + bufLen, pre, preLen); - - if (memcmp(seq, termBuf, termLength) == 0) - { - result = preLen; - found = YES; - break; - } - - buf++; - bufLen--; - preLen++; - } - else - { - // Comparing directly from preBuffer - - if (memcmp(pre, termBuf, termLength) == 0) - { - NSUInteger preOffset = pre - [preBuffer readBuffer]; // pointer arithmetic - - result = preOffset + termLength; - found = YES; - break; - } - - pre++; - } - } - - // There is no need to avoid resizing the buffer in this particular situation. - - if (foundPtr) *foundPtr = found; - return result; -} - -/** - * For read packets with a set terminator, scans the packet buffer for the term. - * It is assumed the terminator had not been fully read prior to the new bytes. - * - * If the term is found, the number of excess bytes after the term are returned. - * If the term is not found, this method will return -1. - * - * Note: A return value of zero means the term was found at the very end. - * - * Prerequisites: - * The given number of bytes have been added to the end of our buffer. - * Our bytesDone variable has NOT been changed due to the prebuffered bytes. -**/ -- (NSInteger)searchForTermAfterPreBuffering:(ssize_t)numBytes -{ - NSAssert(term != nil, @"This method does not apply to non-term reads"); - - // The implementation of this method is very similar to the above method. - // See the above method for a discussion of the algorithm used here. - - uint8_t *buff = [buffer mutableBytes]; - NSUInteger buffLength = bytesDone + numBytes; - - const void *termBuff = [term bytes]; - NSUInteger termLength = [term length]; - - // Note: We are dealing with unsigned integers, - // so make sure the math doesn't go below zero. - - NSUInteger i = ((buffLength - numBytes) >= termLength) ? (buffLength - numBytes - termLength + 1) : 0; - - while (i + termLength <= buffLength) - { - uint8_t *subBuffer = buff + startOffset + i; - - if (memcmp(subBuffer, termBuff, termLength) == 0) - { - return buffLength - (i + termLength); - } - - i++; - } - - return -1; -} - - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * The GCDAsyncWritePacket encompasses the instructions for any given write. -**/ -@interface GCDAsyncWritePacket : NSObject -{ - @public - NSData *buffer; - NSUInteger bytesDone; - long tag; - NSTimeInterval timeout; -} -- (instancetype)initWithData:(NSData *)d timeout:(NSTimeInterval)t tag:(long)i NS_DESIGNATED_INITIALIZER; -@end - -@implementation GCDAsyncWritePacket - -// Cover the superclass' designated initializer -- (instancetype)init NS_UNAVAILABLE -{ - NSAssert(0, @"Use the designated initializer"); - return nil; -} - -- (instancetype)initWithData:(NSData *)d timeout:(NSTimeInterval)t tag:(long)i -{ - if((self = [super init])) - { - buffer = d; // Retain not copy. For performance as documented in header file. - bytesDone = 0; - timeout = t; - tag = i; - } - return self; -} - - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * The GCDAsyncSpecialPacket encompasses special instructions for interruptions in the read/write queues. - * This class my be altered to support more than just TLS in the future. -**/ -@interface GCDAsyncSpecialPacket : NSObject -{ - @public - NSDictionary *tlsSettings; -} -- (instancetype)initWithTLSSettings:(NSDictionary *)settings NS_DESIGNATED_INITIALIZER; -@end - -@implementation GCDAsyncSpecialPacket - -// Cover the superclass' designated initializer -- (instancetype)init NS_UNAVAILABLE -{ - NSAssert(0, @"Use the designated initializer"); - return nil; -} - -- (instancetype)initWithTLSSettings:(NSDictionary *)settings -{ - if((self = [super init])) - { - tlsSettings = [settings copy]; - } - return self; -} - - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@implementation GCDAsyncSocket -{ - uint32_t flags; - uint16_t config; - - __weak id delegate; - dispatch_queue_t delegateQueue; - - int socket4FD; - int socket6FD; - int socketUN; - NSURL *socketUrl; - int stateIndex; - NSData * connectInterface4; - NSData * connectInterface6; - NSData * connectInterfaceUN; - - dispatch_queue_t socketQueue; - - dispatch_source_t accept4Source; - dispatch_source_t accept6Source; - dispatch_source_t acceptUNSource; - dispatch_source_t connectTimer; - dispatch_source_t readSource; - dispatch_source_t writeSource; - dispatch_source_t readTimer; - dispatch_source_t writeTimer; - - NSMutableArray *readQueue; - NSMutableArray *writeQueue; - - GCDAsyncReadPacket *currentRead; - GCDAsyncWritePacket *currentWrite; - - unsigned long socketFDBytesAvailable; - - GCDAsyncSocketPreBuffer *preBuffer; - -#if TARGET_OS_IPHONE - CFStreamClientContext streamContext; - CFReadStreamRef readStream; - CFWriteStreamRef writeStream; -#endif - SSLContextRef sslContext; - GCDAsyncSocketPreBuffer *sslPreBuffer; - size_t sslWriteCachedLength; - OSStatus sslErrCode; - OSStatus lastSSLHandshakeError; - - void *IsOnSocketQueueOrTargetQueueKey; - - id userData; - NSTimeInterval alternateAddressDelay; -} - -- (instancetype)init -{ - return [self initWithDelegate:nil delegateQueue:NULL socketQueue:NULL]; -} - -- (instancetype)initWithSocketQueue:(dispatch_queue_t)sq -{ - return [self initWithDelegate:nil delegateQueue:NULL socketQueue:sq]; -} - -- (instancetype)initWithDelegate:(id)aDelegate delegateQueue:(dispatch_queue_t)dq -{ - return [self initWithDelegate:aDelegate delegateQueue:dq socketQueue:NULL]; -} - -- (instancetype)initWithDelegate:(id)aDelegate delegateQueue:(dispatch_queue_t)dq socketQueue:(dispatch_queue_t)sq -{ - if((self = [super init])) - { - delegate = aDelegate; - delegateQueue = dq; - - #if !OS_OBJECT_USE_OBJC - if (dq) dispatch_retain(dq); - #endif - - socket4FD = SOCKET_NULL; - socket6FD = SOCKET_NULL; - socketUN = SOCKET_NULL; - socketUrl = nil; - stateIndex = 0; - - if (sq) - { - NSAssert(sq != dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), - @"The given socketQueue parameter must not be a concurrent queue."); - NSAssert(sq != dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), - @"The given socketQueue parameter must not be a concurrent queue."); - NSAssert(sq != dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), - @"The given socketQueue parameter must not be a concurrent queue."); - - socketQueue = sq; - #if !OS_OBJECT_USE_OBJC - dispatch_retain(sq); - #endif - } - else - { - socketQueue = dispatch_queue_create([GCDAsyncSocketQueueName UTF8String], NULL); - } - - // The dispatch_queue_set_specific() and dispatch_get_specific() functions take a "void *key" parameter. - // From the documentation: - // - // > Keys are only compared as pointers and are never dereferenced. - // > Thus, you can use a pointer to a static variable for a specific subsystem or - // > any other value that allows you to identify the value uniquely. - // - // We're just going to use the memory address of an ivar. - // Specifically an ivar that is explicitly named for our purpose to make the code more readable. - // - // However, it feels tedious (and less readable) to include the "&" all the time: - // dispatch_get_specific(&IsOnSocketQueueOrTargetQueueKey) - // - // So we're going to make it so it doesn't matter if we use the '&' or not, - // by assigning the value of the ivar to the address of the ivar. - // Thus: IsOnSocketQueueOrTargetQueueKey == &IsOnSocketQueueOrTargetQueueKey; - - IsOnSocketQueueOrTargetQueueKey = &IsOnSocketQueueOrTargetQueueKey; - - void *nonNullUnusedPointer = (__bridge void *)self; - dispatch_queue_set_specific(socketQueue, IsOnSocketQueueOrTargetQueueKey, nonNullUnusedPointer, NULL); - - readQueue = [[NSMutableArray alloc] initWithCapacity:5]; - currentRead = nil; - - writeQueue = [[NSMutableArray alloc] initWithCapacity:5]; - currentWrite = nil; - - preBuffer = [[GCDAsyncSocketPreBuffer alloc] initWithCapacity:(1024 * 4)]; - alternateAddressDelay = 0.3; - } - return self; -} - -- (void)dealloc -{ - LogInfo(@"%@ - %@ (start)", THIS_METHOD, self); - - // Set dealloc flag. - // This is used by closeWithError to ensure we don't accidentally retain ourself. - flags |= kDealloc; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - [self closeWithError:nil]; - } - else - { - dispatch_sync(socketQueue, ^{ - [self closeWithError:nil]; - }); - } - - delegate = nil; - - #if !OS_OBJECT_USE_OBJC - if (delegateQueue) dispatch_release(delegateQueue); - #endif - delegateQueue = NULL; - - #if !OS_OBJECT_USE_OBJC - if (socketQueue) dispatch_release(socketQueue); - #endif - socketQueue = NULL; - - LogInfo(@"%@ - %@ (finish)", THIS_METHOD, self); -} - -#pragma mark - - -+ (nullable instancetype)socketFromConnectedSocketFD:(int)socketFD socketQueue:(nullable dispatch_queue_t)sq error:(NSError**)error { - return [self socketFromConnectedSocketFD:socketFD delegate:nil delegateQueue:NULL socketQueue:sq error:error]; -} - -+ (nullable instancetype)socketFromConnectedSocketFD:(int)socketFD delegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq error:(NSError**)error { - return [self socketFromConnectedSocketFD:socketFD delegate:aDelegate delegateQueue:dq socketQueue:NULL error:error]; -} - -+ (nullable instancetype)socketFromConnectedSocketFD:(int)socketFD delegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq socketQueue:(nullable dispatch_queue_t)sq error:(NSError* __autoreleasing *)error -{ - __block BOOL errorOccured = NO; - - GCDAsyncSocket *socket = [[[self class] alloc] initWithDelegate:aDelegate delegateQueue:dq socketQueue:sq]; - - dispatch_sync(socket->socketQueue, ^{ @autoreleasepool { - struct sockaddr addr; - socklen_t addr_size = sizeof(struct sockaddr); - int retVal = getpeername(socketFD, (struct sockaddr *)&addr, &addr_size); - if (retVal) - { - NSString *errMsg = NSLocalizedStringWithDefaultValue(@"GCDAsyncSocketOtherError", - @"GCDAsyncSocket", [NSBundle mainBundle], - @"Attempt to create socket from socket FD failed. getpeername() failed", nil); - - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - errorOccured = YES; - if (error) - *error = [NSError errorWithDomain:GCDAsyncSocketErrorDomain code:GCDAsyncSocketOtherError userInfo:userInfo]; - return; - } - - if (addr.sa_family == AF_INET) - { - socket->socket4FD = socketFD; - } - else if (addr.sa_family == AF_INET6) - { - socket->socket6FD = socketFD; - } - else - { - NSString *errMsg = NSLocalizedStringWithDefaultValue(@"GCDAsyncSocketOtherError", - @"GCDAsyncSocket", [NSBundle mainBundle], - @"Attempt to create socket from socket FD failed. socket FD is neither IPv4 nor IPv6", nil); - - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - errorOccured = YES; - if (error) - *error = [NSError errorWithDomain:GCDAsyncSocketErrorDomain code:GCDAsyncSocketOtherError userInfo:userInfo]; - return; - } - - socket->flags = kSocketStarted; - [socket didConnect:socket->stateIndex]; - }}); - - return errorOccured? nil: socket; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Configuration -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (id)delegate -{ - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - return delegate; - } - else - { - __block id result; - - dispatch_sync(socketQueue, ^{ - result = self->delegate; - }); - - return result; - } -} - -- (void)setDelegate:(id)newDelegate synchronously:(BOOL)synchronously -{ - dispatch_block_t block = ^{ - self->delegate = newDelegate; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) { - block(); - } - else { - if (synchronously) - dispatch_sync(socketQueue, block); - else - dispatch_async(socketQueue, block); - } -} - -- (void)setDelegate:(id)newDelegate -{ - [self setDelegate:newDelegate synchronously:NO]; -} - -- (void)synchronouslySetDelegate:(id)newDelegate -{ - [self setDelegate:newDelegate synchronously:YES]; -} - -- (dispatch_queue_t)delegateQueue -{ - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - return delegateQueue; - } - else - { - __block dispatch_queue_t result; - - dispatch_sync(socketQueue, ^{ - result = self->delegateQueue; - }); - - return result; - } -} - -- (void)setDelegateQueue:(dispatch_queue_t)newDelegateQueue synchronously:(BOOL)synchronously -{ - dispatch_block_t block = ^{ - - #if !OS_OBJECT_USE_OBJC - if (self->delegateQueue) dispatch_release(self->delegateQueue); - if (newDelegateQueue) dispatch_retain(newDelegateQueue); - #endif - - self->delegateQueue = newDelegateQueue; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) { - block(); - } - else { - if (synchronously) - dispatch_sync(socketQueue, block); - else - dispatch_async(socketQueue, block); - } -} - -- (void)setDelegateQueue:(dispatch_queue_t)newDelegateQueue -{ - [self setDelegateQueue:newDelegateQueue synchronously:NO]; -} - -- (void)synchronouslySetDelegateQueue:(dispatch_queue_t)newDelegateQueue -{ - [self setDelegateQueue:newDelegateQueue synchronously:YES]; -} - -- (void)getDelegate:(id *)delegatePtr delegateQueue:(dispatch_queue_t *)delegateQueuePtr -{ - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - if (delegatePtr) *delegatePtr = delegate; - if (delegateQueuePtr) *delegateQueuePtr = delegateQueue; - } - else - { - __block id dPtr = NULL; - __block dispatch_queue_t dqPtr = NULL; - - dispatch_sync(socketQueue, ^{ - dPtr = self->delegate; - dqPtr = self->delegateQueue; - }); - - if (delegatePtr) *delegatePtr = dPtr; - if (delegateQueuePtr) *delegateQueuePtr = dqPtr; - } -} - -- (void)setDelegate:(id)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue synchronously:(BOOL)synchronously -{ - dispatch_block_t block = ^{ - - self->delegate = newDelegate; - - #if !OS_OBJECT_USE_OBJC - if (self->delegateQueue) dispatch_release(self->delegateQueue); - if (newDelegateQueue) dispatch_retain(newDelegateQueue); - #endif - - self->delegateQueue = newDelegateQueue; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) { - block(); - } - else { - if (synchronously) - dispatch_sync(socketQueue, block); - else - dispatch_async(socketQueue, block); - } -} - -- (void)setDelegate:(id)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue -{ - [self setDelegate:newDelegate delegateQueue:newDelegateQueue synchronously:NO]; -} - -- (void)synchronouslySetDelegate:(id)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue -{ - [self setDelegate:newDelegate delegateQueue:newDelegateQueue synchronously:YES]; -} - -- (BOOL)isIPv4Enabled -{ - // Note: YES means kIPv4Disabled is OFF - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - return ((config & kIPv4Disabled) == 0); - } - else - { - __block BOOL result; - - dispatch_sync(socketQueue, ^{ - result = ((self->config & kIPv4Disabled) == 0); - }); - - return result; - } -} - -- (void)setIPv4Enabled:(BOOL)flag -{ - // Note: YES means kIPv4Disabled is OFF - - dispatch_block_t block = ^{ - - if (flag) - self->config &= ~kIPv4Disabled; - else - self->config |= kIPv4Disabled; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -- (BOOL)isIPv6Enabled -{ - // Note: YES means kIPv6Disabled is OFF - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - return ((config & kIPv6Disabled) == 0); - } - else - { - __block BOOL result; - - dispatch_sync(socketQueue, ^{ - result = ((self->config & kIPv6Disabled) == 0); - }); - - return result; - } -} - -- (void)setIPv6Enabled:(BOOL)flag -{ - // Note: YES means kIPv6Disabled is OFF - - dispatch_block_t block = ^{ - - if (flag) - self->config &= ~kIPv6Disabled; - else - self->config |= kIPv6Disabled; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -- (BOOL)isIPv4PreferredOverIPv6 -{ - // Note: YES means kPreferIPv6 is OFF - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - return ((config & kPreferIPv6) == 0); - } - else - { - __block BOOL result; - - dispatch_sync(socketQueue, ^{ - result = ((self->config & kPreferIPv6) == 0); - }); - - return result; - } -} - -- (void)setIPv4PreferredOverIPv6:(BOOL)flag -{ - // Note: YES means kPreferIPv6 is OFF - - dispatch_block_t block = ^{ - - if (flag) - self->config &= ~kPreferIPv6; - else - self->config |= kPreferIPv6; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -- (NSTimeInterval) alternateAddressDelay { - __block NSTimeInterval delay; - dispatch_block_t block = ^{ - delay = self->alternateAddressDelay; - }; - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - return delay; -} - -- (void) setAlternateAddressDelay:(NSTimeInterval)delay { - dispatch_block_t block = ^{ - self->alternateAddressDelay = delay; - }; - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -- (id)userData -{ - __block id result = nil; - - dispatch_block_t block = ^{ - - result = self->userData; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -- (void)setUserData:(id)arbitraryUserData -{ - dispatch_block_t block = ^{ - - if (self->userData != arbitraryUserData) - { - self->userData = arbitraryUserData; - } - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Accepting -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (BOOL)acceptOnPort:(uint16_t)port error:(NSError **)errPtr -{ - return [self acceptOnInterface:nil port:port error:errPtr]; -} - -- (BOOL)acceptOnInterface:(NSString *)inInterface port:(uint16_t)port error:(NSError **)errPtr -{ - LogTrace(); - - // Just in-case interface parameter is immutable. - NSString *interface = [inInterface copy]; - - __block BOOL result = NO; - __block NSError *err = nil; - - // CreateSocket Block - // This block will be invoked within the dispatch block below. - - int(^createSocket)(int, NSData*) = ^int (int domain, NSData *interfaceAddr) { - - int socketFD = socket(domain, SOCK_STREAM, 0); - - if (socketFD == SOCKET_NULL) - { - NSString *reason = @"Error in socket() function"; - err = [self errorWithErrno:errno reason:reason]; - - return SOCKET_NULL; - } - - int status; - - // Set socket options - - status = fcntl(socketFD, F_SETFL, O_NONBLOCK); - if (status == -1) - { - NSString *reason = @"Error enabling non-blocking IO on socket (fcntl)"; - err = [self errorWithErrno:errno reason:reason]; - - LogVerbose(@"close(socketFD)"); - close(socketFD); - return SOCKET_NULL; - } - - int reuseOn = 1; - status = setsockopt(socketFD, SOL_SOCKET, SO_REUSEADDR, &reuseOn, sizeof(reuseOn)); - if (status == -1) - { - NSString *reason = @"Error enabling address reuse (setsockopt)"; - err = [self errorWithErrno:errno reason:reason]; - - LogVerbose(@"close(socketFD)"); - close(socketFD); - return SOCKET_NULL; - } - - // Bind socket - - status = bind(socketFD, (const struct sockaddr *)[interfaceAddr bytes], (socklen_t)[interfaceAddr length]); - if (status == -1) - { - NSString *reason = @"Error in bind() function"; - err = [self errorWithErrno:errno reason:reason]; - - LogVerbose(@"close(socketFD)"); - close(socketFD); - return SOCKET_NULL; - } - - // Listen - - status = listen(socketFD, 1024); - if (status == -1) - { - NSString *reason = @"Error in listen() function"; - err = [self errorWithErrno:errno reason:reason]; - - LogVerbose(@"close(socketFD)"); - close(socketFD); - return SOCKET_NULL; - } - - return socketFD; - }; - - // Create dispatch block and run on socketQueue - - dispatch_block_t block = ^{ @autoreleasepool { - - if (self->delegate == nil) // Must have delegate set - { - NSString *msg = @"Attempting to accept without a delegate. Set a delegate first."; - err = [self badConfigError:msg]; - - return_from_block; - } - - if (self->delegateQueue == NULL) // Must have delegate queue set - { - NSString *msg = @"Attempting to accept without a delegate queue. Set a delegate queue first."; - err = [self badConfigError:msg]; - - return_from_block; - } - - BOOL isIPv4Disabled = (self->config & kIPv4Disabled) ? YES : NO; - BOOL isIPv6Disabled = (self->config & kIPv6Disabled) ? YES : NO; - - if (isIPv4Disabled && isIPv6Disabled) // Must have IPv4 or IPv6 enabled - { - NSString *msg = @"Both IPv4 and IPv6 have been disabled. Must enable at least one protocol first."; - err = [self badConfigError:msg]; - - return_from_block; - } - - if (![self isDisconnected]) // Must be disconnected - { - NSString *msg = @"Attempting to accept while connected or accepting connections. Disconnect first."; - err = [self badConfigError:msg]; - - return_from_block; - } - - // Clear queues (spurious read/write requests post disconnect) - [self->readQueue removeAllObjects]; - [self->writeQueue removeAllObjects]; - - // Resolve interface from description - - NSMutableData *interface4 = nil; - NSMutableData *interface6 = nil; - - [self getInterfaceAddress4:&interface4 address6:&interface6 fromDescription:interface port:port]; - - if ((interface4 == nil) && (interface6 == nil)) - { - NSString *msg = @"Unknown interface. Specify valid interface by name (e.g. \"en1\") or IP address."; - err = [self badParamError:msg]; - - return_from_block; - } - - if (isIPv4Disabled && (interface6 == nil)) - { - NSString *msg = @"IPv4 has been disabled and specified interface doesn't support IPv6."; - err = [self badParamError:msg]; - - return_from_block; - } - - if (isIPv6Disabled && (interface4 == nil)) - { - NSString *msg = @"IPv6 has been disabled and specified interface doesn't support IPv4."; - err = [self badParamError:msg]; - - return_from_block; - } - - BOOL enableIPv4 = !isIPv4Disabled && (interface4 != nil); - BOOL enableIPv6 = !isIPv6Disabled && (interface6 != nil); - - // Create sockets, configure, bind, and listen - - if (enableIPv4) - { - LogVerbose(@"Creating IPv4 socket"); - self->socket4FD = createSocket(AF_INET, interface4); - - if (self->socket4FD == SOCKET_NULL) - { - return_from_block; - } - } - - if (enableIPv6) - { - LogVerbose(@"Creating IPv6 socket"); - - if (enableIPv4 && (port == 0)) - { - // No specific port was specified, so we allowed the OS to pick an available port for us. - // Now we need to make sure the IPv6 socket listens on the same port as the IPv4 socket. - - struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)[interface6 mutableBytes]; - addr6->sin6_port = htons([self localPort4]); - } - - self->socket6FD = createSocket(AF_INET6, interface6); - - if (self->socket6FD == SOCKET_NULL) - { - if (self->socket4FD != SOCKET_NULL) - { - LogVerbose(@"close(socket4FD)"); - close(self->socket4FD); - self->socket4FD = SOCKET_NULL; - } - - return_from_block; - } - } - - // Create accept sources - - if (enableIPv4) - { - self->accept4Source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, self->socket4FD, 0, self->socketQueue); - - int socketFD = self->socket4FD; - dispatch_source_t acceptSource = self->accept4Source; - - __weak GCDAsyncSocket *weakSelf = self; - - dispatch_source_set_event_handler(self->accept4Source, ^{ @autoreleasepool { - #pragma clang diagnostic push - #pragma clang diagnostic warning "-Wimplicit-retain-self" - - __strong GCDAsyncSocket *strongSelf = weakSelf; - if (strongSelf == nil) return_from_block; - - LogVerbose(@"event4Block"); - - unsigned long i = 0; - unsigned long numPendingConnections = dispatch_source_get_data(acceptSource); - - LogVerbose(@"numPendingConnections: %lu", numPendingConnections); - - while ([strongSelf doAccept:socketFD] && (++i < numPendingConnections)); - - #pragma clang diagnostic pop - }}); - - - dispatch_source_set_cancel_handler(self->accept4Source, ^{ - #pragma clang diagnostic push - #pragma clang diagnostic warning "-Wimplicit-retain-self" - - #if !OS_OBJECT_USE_OBJC - LogVerbose(@"dispatch_release(accept4Source)"); - dispatch_release(acceptSource); - #endif - - LogVerbose(@"close(socket4FD)"); - close(socketFD); - - #pragma clang diagnostic pop - }); - - LogVerbose(@"dispatch_resume(accept4Source)"); - dispatch_resume(self->accept4Source); - } - - if (enableIPv6) - { - self->accept6Source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, self->socket6FD, 0, self->socketQueue); - - int socketFD = self->socket6FD; - dispatch_source_t acceptSource = self->accept6Source; - - __weak GCDAsyncSocket *weakSelf = self; - - dispatch_source_set_event_handler(self->accept6Source, ^{ @autoreleasepool { - #pragma clang diagnostic push - #pragma clang diagnostic warning "-Wimplicit-retain-self" - - __strong GCDAsyncSocket *strongSelf = weakSelf; - if (strongSelf == nil) return_from_block; - - LogVerbose(@"event6Block"); - - unsigned long i = 0; - unsigned long numPendingConnections = dispatch_source_get_data(acceptSource); - - LogVerbose(@"numPendingConnections: %lu", numPendingConnections); - - while ([strongSelf doAccept:socketFD] && (++i < numPendingConnections)); - - #pragma clang diagnostic pop - }}); - - dispatch_source_set_cancel_handler(self->accept6Source, ^{ - #pragma clang diagnostic push - #pragma clang diagnostic warning "-Wimplicit-retain-self" - - #if !OS_OBJECT_USE_OBJC - LogVerbose(@"dispatch_release(accept6Source)"); - dispatch_release(acceptSource); - #endif - - LogVerbose(@"close(socket6FD)"); - close(socketFD); - - #pragma clang diagnostic pop - }); - - LogVerbose(@"dispatch_resume(accept6Source)"); - dispatch_resume(self->accept6Source); - } - - self->flags |= kSocketStarted; - - result = YES; - }}; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - if (result == NO) - { - LogInfo(@"Error in accept: %@", err); - - if (errPtr) - *errPtr = err; - } - - return result; -} - -- (BOOL)acceptOnUrl:(NSURL *)url error:(NSError **)errPtr -{ - LogTrace(); - - __block BOOL result = NO; - __block NSError *err = nil; - - // CreateSocket Block - // This block will be invoked within the dispatch block below. - - int(^createSocket)(int, NSData*) = ^int (int domain, NSData *interfaceAddr) { - - int socketFD = socket(domain, SOCK_STREAM, 0); - - if (socketFD == SOCKET_NULL) - { - NSString *reason = @"Error in socket() function"; - err = [self errorWithErrno:errno reason:reason]; - - return SOCKET_NULL; - } - - int status; - - // Set socket options - - status = fcntl(socketFD, F_SETFL, O_NONBLOCK); - if (status == -1) - { - NSString *reason = @"Error enabling non-blocking IO on socket (fcntl)"; - err = [self errorWithErrno:errno reason:reason]; - - LogVerbose(@"close(socketFD)"); - close(socketFD); - return SOCKET_NULL; - } - - int reuseOn = 1; - status = setsockopt(socketFD, SOL_SOCKET, SO_REUSEADDR, &reuseOn, sizeof(reuseOn)); - if (status == -1) - { - NSString *reason = @"Error enabling address reuse (setsockopt)"; - err = [self errorWithErrno:errno reason:reason]; - - LogVerbose(@"close(socketFD)"); - close(socketFD); - return SOCKET_NULL; - } - - // Bind socket - - status = bind(socketFD, (const struct sockaddr *)[interfaceAddr bytes], (socklen_t)[interfaceAddr length]); - if (status == -1) - { - NSString *reason = @"Error in bind() function"; - err = [self errorWithErrno:errno reason:reason]; - - LogVerbose(@"close(socketFD)"); - close(socketFD); - return SOCKET_NULL; - } - - // Listen - - status = listen(socketFD, 1024); - if (status == -1) - { - NSString *reason = @"Error in listen() function"; - err = [self errorWithErrno:errno reason:reason]; - - LogVerbose(@"close(socketFD)"); - close(socketFD); - return SOCKET_NULL; - } - - return socketFD; - }; - - // Create dispatch block and run on socketQueue - - dispatch_block_t block = ^{ @autoreleasepool { - - if (self->delegate == nil) // Must have delegate set - { - NSString *msg = @"Attempting to accept without a delegate. Set a delegate first."; - err = [self badConfigError:msg]; - - return_from_block; - } - - if (self->delegateQueue == NULL) // Must have delegate queue set - { - NSString *msg = @"Attempting to accept without a delegate queue. Set a delegate queue first."; - err = [self badConfigError:msg]; - - return_from_block; - } - - if (![self isDisconnected]) // Must be disconnected - { - NSString *msg = @"Attempting to accept while connected or accepting connections. Disconnect first."; - err = [self badConfigError:msg]; - - return_from_block; - } - - // Clear queues (spurious read/write requests post disconnect) - [self->readQueue removeAllObjects]; - [self->writeQueue removeAllObjects]; - - // Remove a previous socket - - NSError *error = nil; - NSFileManager *fileManager = [NSFileManager defaultManager]; - NSString *urlPath = url.path; - if (urlPath && [fileManager fileExistsAtPath:urlPath]) { - if (![fileManager removeItemAtURL:url error:&error]) { - NSString *msg = @"Could not remove previous unix domain socket at given url."; - err = [self otherError:msg]; - - return_from_block; - } - } - - // Resolve interface from description - - NSData *interface = [self getInterfaceAddressFromUrl:url]; - - if (interface == nil) - { - NSString *msg = @"Invalid unix domain url. Specify a valid file url that does not exist (e.g. \"file:///tmp/socket\")"; - err = [self badParamError:msg]; - - return_from_block; - } - - // Create sockets, configure, bind, and listen - - LogVerbose(@"Creating unix domain socket"); - self->socketUN = createSocket(AF_UNIX, interface); - - if (self->socketUN == SOCKET_NULL) - { - return_from_block; - } - - self->socketUrl = url; - - // Create accept sources - - self->acceptUNSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, self->socketUN, 0, self->socketQueue); - - int socketFD = self->socketUN; - dispatch_source_t acceptSource = self->acceptUNSource; - - __weak GCDAsyncSocket *weakSelf = self; - - dispatch_source_set_event_handler(self->acceptUNSource, ^{ @autoreleasepool { - - __strong GCDAsyncSocket *strongSelf = weakSelf; - - LogVerbose(@"eventUNBlock"); - - unsigned long i = 0; - unsigned long numPendingConnections = dispatch_source_get_data(acceptSource); - - LogVerbose(@"numPendingConnections: %lu", numPendingConnections); - - while ([strongSelf doAccept:socketFD] && (++i < numPendingConnections)); - }}); - - dispatch_source_set_cancel_handler(self->acceptUNSource, ^{ - -#if !OS_OBJECT_USE_OBJC - LogVerbose(@"dispatch_release(acceptUNSource)"); - dispatch_release(acceptSource); -#endif - - LogVerbose(@"close(socketUN)"); - close(socketFD); - }); - - LogVerbose(@"dispatch_resume(acceptUNSource)"); - dispatch_resume(self->acceptUNSource); - - self->flags |= kSocketStarted; - - result = YES; - }}; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - if (result == NO) - { - LogInfo(@"Error in accept: %@", err); - - if (errPtr) - *errPtr = err; - } - - return result; -} - -- (BOOL)doAccept:(int)parentSocketFD -{ - LogTrace(); - - int socketType; - int childSocketFD; - NSData *childSocketAddress; - - if (parentSocketFD == socket4FD) - { - socketType = 0; - - struct sockaddr_in addr; - socklen_t addrLen = sizeof(addr); - - childSocketFD = accept(parentSocketFD, (struct sockaddr *)&addr, &addrLen); - - if (childSocketFD == -1) - { - LogWarn(@"Accept failed with error: %@", [self errnoError]); - return NO; - } - - childSocketAddress = [NSData dataWithBytes:&addr length:addrLen]; - } - else if (parentSocketFD == socket6FD) - { - socketType = 1; - - struct sockaddr_in6 addr; - socklen_t addrLen = sizeof(addr); - - childSocketFD = accept(parentSocketFD, (struct sockaddr *)&addr, &addrLen); - - if (childSocketFD == -1) - { - LogWarn(@"Accept failed with error: %@", [self errnoError]); - return NO; - } - - childSocketAddress = [NSData dataWithBytes:&addr length:addrLen]; - } - else // if (parentSocketFD == socketUN) - { - socketType = 2; - - struct sockaddr_un addr; - socklen_t addrLen = sizeof(addr); - - childSocketFD = accept(parentSocketFD, (struct sockaddr *)&addr, &addrLen); - - if (childSocketFD == -1) - { - LogWarn(@"Accept failed with error: %@", [self errnoError]); - return NO; - } - - childSocketAddress = [NSData dataWithBytes:&addr length:addrLen]; - } - - // Enable non-blocking IO on the socket - - int result = fcntl(childSocketFD, F_SETFL, O_NONBLOCK); - if (result == -1) - { - LogWarn(@"Error enabling non-blocking IO on accepted socket (fcntl)"); - LogVerbose(@"close(childSocketFD)"); - close(childSocketFD); - return NO; - } - - // Prevent SIGPIPE signals - - int nosigpipe = 1; - setsockopt(childSocketFD, SOL_SOCKET, SO_NOSIGPIPE, &nosigpipe, sizeof(nosigpipe)); - - // Notify delegate - - if (delegateQueue) - { - __strong id theDelegate = delegate; - - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - // Query delegate for custom socket queue - - dispatch_queue_t childSocketQueue = NULL; - - if ([theDelegate respondsToSelector:@selector(newSocketQueueForConnectionFromAddress:onSocket:)]) - { - childSocketQueue = [theDelegate newSocketQueueForConnectionFromAddress:childSocketAddress - onSocket:self]; - } - - // Create GCDAsyncSocket instance for accepted socket - - GCDAsyncSocket *acceptedSocket = [[[self class] alloc] initWithDelegate:theDelegate - delegateQueue:self->delegateQueue - socketQueue:childSocketQueue]; - - if (socketType == 0) - acceptedSocket->socket4FD = childSocketFD; - else if (socketType == 1) - acceptedSocket->socket6FD = childSocketFD; - else - acceptedSocket->socketUN = childSocketFD; - - acceptedSocket->flags = (kSocketStarted | kConnected); - - // Setup read and write sources for accepted socket - - dispatch_async(acceptedSocket->socketQueue, ^{ @autoreleasepool { - - [acceptedSocket setupReadAndWriteSourcesForNewlyConnectedSocket:childSocketFD]; - }}); - - // Notify delegate - - if ([theDelegate respondsToSelector:@selector(socket:didAcceptNewSocket:)]) - { - [theDelegate socket:self didAcceptNewSocket:acceptedSocket]; - } - - // Release the socket queue returned from the delegate (it was retained by acceptedSocket) - #if !OS_OBJECT_USE_OBJC - if (childSocketQueue) dispatch_release(childSocketQueue); - #endif - - // The accepted socket should have been retained by the delegate. - // Otherwise it gets properly released when exiting the block. - }}); - } - - return YES; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Connecting -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * This method runs through the various checks required prior to a connection attempt. - * It is shared between the connectToHost and connectToAddress methods. - * -**/ -- (BOOL)preConnectWithInterface:(NSString *)interface error:(NSError **)errPtr -{ - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - if (delegate == nil) // Must have delegate set - { - if (errPtr) - { - NSString *msg = @"Attempting to connect without a delegate. Set a delegate first."; - *errPtr = [self badConfigError:msg]; - } - return NO; - } - - if (delegateQueue == NULL) // Must have delegate queue set - { - if (errPtr) - { - NSString *msg = @"Attempting to connect without a delegate queue. Set a delegate queue first."; - *errPtr = [self badConfigError:msg]; - } - return NO; - } - - if (![self isDisconnected]) // Must be disconnected - { - if (errPtr) - { - NSString *msg = @"Attempting to connect while connected or accepting connections. Disconnect first."; - *errPtr = [self badConfigError:msg]; - } - return NO; - } - - BOOL isIPv4Disabled = (config & kIPv4Disabled) ? YES : NO; - BOOL isIPv6Disabled = (config & kIPv6Disabled) ? YES : NO; - - if (isIPv4Disabled && isIPv6Disabled) // Must have IPv4 or IPv6 enabled - { - if (errPtr) - { - NSString *msg = @"Both IPv4 and IPv6 have been disabled. Must enable at least one protocol first."; - *errPtr = [self badConfigError:msg]; - } - return NO; - } - - if (interface) - { - NSMutableData *interface4 = nil; - NSMutableData *interface6 = nil; - - [self getInterfaceAddress4:&interface4 address6:&interface6 fromDescription:interface port:0]; - - if ((interface4 == nil) && (interface6 == nil)) - { - if (errPtr) - { - NSString *msg = @"Unknown interface. Specify valid interface by name (e.g. \"en1\") or IP address."; - *errPtr = [self badParamError:msg]; - } - return NO; - } - - if (isIPv4Disabled && (interface6 == nil)) - { - if (errPtr) - { - NSString *msg = @"IPv4 has been disabled and specified interface doesn't support IPv6."; - *errPtr = [self badParamError:msg]; - } - return NO; - } - - if (isIPv6Disabled && (interface4 == nil)) - { - if (errPtr) - { - NSString *msg = @"IPv6 has been disabled and specified interface doesn't support IPv4."; - *errPtr = [self badParamError:msg]; - } - return NO; - } - - connectInterface4 = interface4; - connectInterface6 = interface6; - } - - // Clear queues (spurious read/write requests post disconnect) - [readQueue removeAllObjects]; - [writeQueue removeAllObjects]; - - return YES; -} - -- (BOOL)preConnectWithUrl:(NSURL *)url error:(NSError **)errPtr -{ - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - if (delegate == nil) // Must have delegate set - { - if (errPtr) - { - NSString *msg = @"Attempting to connect without a delegate. Set a delegate first."; - *errPtr = [self badConfigError:msg]; - } - return NO; - } - - if (delegateQueue == NULL) // Must have delegate queue set - { - if (errPtr) - { - NSString *msg = @"Attempting to connect without a delegate queue. Set a delegate queue first."; - *errPtr = [self badConfigError:msg]; - } - return NO; - } - - if (![self isDisconnected]) // Must be disconnected - { - if (errPtr) - { - NSString *msg = @"Attempting to connect while connected or accepting connections. Disconnect first."; - *errPtr = [self badConfigError:msg]; - } - return NO; - } - - NSData *interface = [self getInterfaceAddressFromUrl:url]; - - if (interface == nil) - { - if (errPtr) - { - NSString *msg = @"Unknown interface. Specify valid interface by name (e.g. \"en1\") or IP address."; - *errPtr = [self badParamError:msg]; - } - return NO; - } - - connectInterfaceUN = interface; - - // Clear queues (spurious read/write requests post disconnect) - [readQueue removeAllObjects]; - [writeQueue removeAllObjects]; - - return YES; -} - -- (BOOL)connectToHost:(NSString*)host onPort:(uint16_t)port error:(NSError **)errPtr -{ - return [self connectToHost:host onPort:port withTimeout:-1 error:errPtr]; -} - -- (BOOL)connectToHost:(NSString *)host - onPort:(uint16_t)port - withTimeout:(NSTimeInterval)timeout - error:(NSError **)errPtr -{ - return [self connectToHost:host onPort:port viaInterface:nil withTimeout:timeout error:errPtr]; -} - -- (BOOL)connectToHost:(NSString *)inHost - onPort:(uint16_t)port - viaInterface:(NSString *)inInterface - withTimeout:(NSTimeInterval)timeout - error:(NSError **)errPtr -{ - LogTrace(); - - // Just in case immutable objects were passed - NSString *host = [inHost copy]; - NSString *interface = [inInterface copy]; - - __block BOOL result = NO; - __block NSError *preConnectErr = nil; - - dispatch_block_t block = ^{ @autoreleasepool { - - // Check for problems with host parameter - - if ([host length] == 0) - { - NSString *msg = @"Invalid host parameter (nil or \"\"). Should be a domain name or IP address string."; - preConnectErr = [self badParamError:msg]; - - return_from_block; - } - - // Run through standard pre-connect checks - - if (![self preConnectWithInterface:interface error:&preConnectErr]) - { - return_from_block; - } - - // We've made it past all the checks. - // It's time to start the connection process. - - self->flags |= kSocketStarted; - - LogVerbose(@"Dispatching DNS lookup..."); - - // It's possible that the given host parameter is actually a NSMutableString. - // So we want to copy it now, within this block that will be executed synchronously. - // This way the asynchronous lookup block below doesn't have to worry about it changing. - - NSString *hostCpy = [host copy]; - - int aStateIndex = self->stateIndex; - __weak GCDAsyncSocket *weakSelf = self; - - dispatch_queue_t globalConcurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); - dispatch_async(globalConcurrentQueue, ^{ @autoreleasepool { - #pragma clang diagnostic push - #pragma clang diagnostic warning "-Wimplicit-retain-self" - - NSError *lookupErr = nil; - NSMutableArray *addresses = [[self class] lookupHost:hostCpy port:port error:&lookupErr]; - - __strong GCDAsyncSocket *strongSelf = weakSelf; - if (strongSelf == nil) return_from_block; - - if (lookupErr) - { - dispatch_async(strongSelf->socketQueue, ^{ @autoreleasepool { - - [strongSelf lookup:aStateIndex didFail:lookupErr]; - }}); - } - else - { - NSData *address4 = nil; - NSData *address6 = nil; - - for (NSData *address in addresses) - { - if (!address4 && [[self class] isIPv4Address:address]) - { - address4 = address; - } - else if (!address6 && [[self class] isIPv6Address:address]) - { - address6 = address; - } - } - - dispatch_async(strongSelf->socketQueue, ^{ @autoreleasepool { - - [strongSelf lookup:aStateIndex didSucceedWithAddress4:address4 address6:address6]; - }}); - } - - #pragma clang diagnostic pop - }}); - - [self startConnectTimeout:timeout]; - - result = YES; - }}; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - - if (errPtr) *errPtr = preConnectErr; - return result; -} - -- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr -{ - return [self connectToAddress:remoteAddr viaInterface:nil withTimeout:-1 error:errPtr]; -} - -- (BOOL)connectToAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr -{ - return [self connectToAddress:remoteAddr viaInterface:nil withTimeout:timeout error:errPtr]; -} - -- (BOOL)connectToAddress:(NSData *)inRemoteAddr - viaInterface:(NSString *)inInterface - withTimeout:(NSTimeInterval)timeout - error:(NSError **)errPtr -{ - LogTrace(); - - // Just in case immutable objects were passed - NSData *remoteAddr = [inRemoteAddr copy]; - NSString *interface = [inInterface copy]; - - __block BOOL result = NO; - __block NSError *err = nil; - - dispatch_block_t block = ^{ @autoreleasepool { - - // Check for problems with remoteAddr parameter - - NSData *address4 = nil; - NSData *address6 = nil; - - if ([remoteAddr length] >= sizeof(struct sockaddr)) - { - const struct sockaddr *sockaddr = (const struct sockaddr *)[remoteAddr bytes]; - - if (sockaddr->sa_family == AF_INET) - { - if ([remoteAddr length] == sizeof(struct sockaddr_in)) - { - address4 = remoteAddr; - } - } - else if (sockaddr->sa_family == AF_INET6) - { - if ([remoteAddr length] == sizeof(struct sockaddr_in6)) - { - address6 = remoteAddr; - } - } - } - - if ((address4 == nil) && (address6 == nil)) - { - NSString *msg = @"A valid IPv4 or IPv6 address was not given"; - err = [self badParamError:msg]; - - return_from_block; - } - - BOOL isIPv4Disabled = (self->config & kIPv4Disabled) ? YES : NO; - BOOL isIPv6Disabled = (self->config & kIPv6Disabled) ? YES : NO; - - if (isIPv4Disabled && (address4 != nil)) - { - NSString *msg = @"IPv4 has been disabled and an IPv4 address was passed."; - err = [self badParamError:msg]; - - return_from_block; - } - - if (isIPv6Disabled && (address6 != nil)) - { - NSString *msg = @"IPv6 has been disabled and an IPv6 address was passed."; - err = [self badParamError:msg]; - - return_from_block; - } - - // Run through standard pre-connect checks - - if (![self preConnectWithInterface:interface error:&err]) - { - return_from_block; - } - - // We've made it past all the checks. - // It's time to start the connection process. - - if (![self connectWithAddress4:address4 address6:address6 error:&err]) - { - return_from_block; - } - - self->flags |= kSocketStarted; - - [self startConnectTimeout:timeout]; - - result = YES; - }}; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - if (result == NO) - { - if (errPtr) - *errPtr = err; - } - - return result; -} - -- (BOOL)connectToUrl:(NSURL *)url withTimeout:(NSTimeInterval)timeout error:(NSError **)errPtr -{ - LogTrace(); - - __block BOOL result = NO; - __block NSError *err = nil; - - dispatch_block_t block = ^{ @autoreleasepool { - - // Check for problems with host parameter - - if ([url.path length] == 0) - { - NSString *msg = @"Invalid unix domain socket url."; - err = [self badParamError:msg]; - - return_from_block; - } - - // Run through standard pre-connect checks - - if (![self preConnectWithUrl:url error:&err]) - { - return_from_block; - } - - // We've made it past all the checks. - // It's time to start the connection process. - - self->flags |= kSocketStarted; - - // Start the normal connection process - - NSError *connectError = nil; - if (![self connectWithAddressUN:self->connectInterfaceUN error:&connectError]) - { - [self closeWithError:connectError]; - - return_from_block; - } - - [self startConnectTimeout:timeout]; - - result = YES; - }}; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - if (result == NO) - { - if (errPtr) - *errPtr = err; - } - - return result; -} - -- (BOOL)connectToNetService:(NSNetService *)netService error:(NSError **)errPtr -{ - NSArray* addresses = [netService addresses]; - for (NSData* address in addresses) - { - BOOL result = [self connectToAddress:address error:errPtr]; - if (result) - { - return YES; - } - } - - return NO; -} - -- (void)lookup:(int)aStateIndex didSucceedWithAddress4:(NSData *)address4 address6:(NSData *)address6 -{ - LogTrace(); - - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - NSAssert(address4 || address6, @"Expected at least one valid address"); - - if (aStateIndex != stateIndex) - { - LogInfo(@"Ignoring lookupDidSucceed, already disconnected"); - - // The connect operation has been cancelled. - // That is, socket was disconnected, or connection has already timed out. - return; - } - - // Check for problems - - BOOL isIPv4Disabled = (config & kIPv4Disabled) ? YES : NO; - BOOL isIPv6Disabled = (config & kIPv6Disabled) ? YES : NO; - - if (isIPv4Disabled && (address6 == nil)) - { - NSString *msg = @"IPv4 has been disabled and DNS lookup found no IPv6 address."; - - [self closeWithError:[self otherError:msg]]; - return; - } - - if (isIPv6Disabled && (address4 == nil)) - { - NSString *msg = @"IPv6 has been disabled and DNS lookup found no IPv4 address."; - - [self closeWithError:[self otherError:msg]]; - return; - } - - // Start the normal connection process - - NSError *err = nil; - if (![self connectWithAddress4:address4 address6:address6 error:&err]) - { - [self closeWithError:err]; - } -} - -/** - * This method is called if the DNS lookup fails. - * This method is executed on the socketQueue. - * - * Since the DNS lookup executed synchronously on a global concurrent queue, - * the original connection request may have already been cancelled or timed-out by the time this method is invoked. - * The lookupIndex tells us whether the lookup is still valid or not. -**/ -- (void)lookup:(int)aStateIndex didFail:(NSError *)error -{ - LogTrace(); - - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - - if (aStateIndex != stateIndex) - { - LogInfo(@"Ignoring lookup:didFail: - already disconnected"); - - // The connect operation has been cancelled. - // That is, socket was disconnected, or connection has already timed out. - return; - } - - [self endConnectTimeout]; - [self closeWithError:error]; -} - -- (BOOL)bindSocket:(int)socketFD toInterface:(NSData *)connectInterface error:(NSError **)errPtr -{ - // Bind the socket to the desired interface (if needed) - - if (connectInterface) - { - LogVerbose(@"Binding socket..."); - - if ([[self class] portFromAddress:connectInterface] > 0) - { - // Since we're going to be binding to a specific port, - // we should turn on reuseaddr to allow us to override sockets in time_wait. - - int reuseOn = 1; - setsockopt(socketFD, SOL_SOCKET, SO_REUSEADDR, &reuseOn, sizeof(reuseOn)); - } - - const struct sockaddr *interfaceAddr = (const struct sockaddr *)[connectInterface bytes]; - - int result = bind(socketFD, interfaceAddr, (socklen_t)[connectInterface length]); - if (result != 0) - { - if (errPtr) - *errPtr = [self errorWithErrno:errno reason:@"Error in bind() function"]; - - return NO; - } - } - - return YES; -} - -- (int)createSocket:(int)family connectInterface:(NSData *)connectInterface errPtr:(NSError **)errPtr -{ - int socketFD = socket(family, SOCK_STREAM, 0); - - if (socketFD == SOCKET_NULL) - { - if (errPtr) - *errPtr = [self errorWithErrno:errno reason:@"Error in socket() function"]; - - return socketFD; - } - - if (![self bindSocket:socketFD toInterface:connectInterface error:errPtr]) - { - [self closeSocket:socketFD]; - - return SOCKET_NULL; - } - - // Prevent SIGPIPE signals - - int nosigpipe = 1; - setsockopt(socketFD, SOL_SOCKET, SO_NOSIGPIPE, &nosigpipe, sizeof(nosigpipe)); - - return socketFD; -} - -- (void)connectSocket:(int)socketFD address:(NSData *)address stateIndex:(int)aStateIndex -{ - // If there already is a socket connected, we close socketFD and return - if (self.isConnected) - { - [self closeSocket:socketFD]; - return; - } - - // Start the connection process in a background queue - - __weak GCDAsyncSocket *weakSelf = self; - - dispatch_queue_t globalConcurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); - dispatch_async(globalConcurrentQueue, ^{ -#pragma clang diagnostic push -#pragma clang diagnostic warning "-Wimplicit-retain-self" - - int result = connect(socketFD, (const struct sockaddr *)[address bytes], (socklen_t)[address length]); - int err = errno; - - __strong GCDAsyncSocket *strongSelf = weakSelf; - if (strongSelf == nil) return_from_block; - - dispatch_async(strongSelf->socketQueue, ^{ @autoreleasepool { - - if (strongSelf.isConnected) - { - [strongSelf closeSocket:socketFD]; - return_from_block; - } - - if (result == 0) - { - [self closeUnusedSocket:socketFD]; - - [strongSelf didConnect:aStateIndex]; - } - else - { - [strongSelf closeSocket:socketFD]; - - // If there are no more sockets trying to connect, we inform the error to the delegate - if (strongSelf.socket4FD == SOCKET_NULL && strongSelf.socket6FD == SOCKET_NULL) - { - NSError *error = [strongSelf errorWithErrno:err reason:@"Error in connect() function"]; - [strongSelf didNotConnect:aStateIndex error:error]; - } - } - }}); - -#pragma clang diagnostic pop - }); - - LogVerbose(@"Connecting..."); -} - -- (void)closeSocket:(int)socketFD -{ - if (socketFD != SOCKET_NULL && - (socketFD == socket6FD || socketFD == socket4FD)) - { - close(socketFD); - - if (socketFD == socket4FD) - { - LogVerbose(@"close(socket4FD)"); - socket4FD = SOCKET_NULL; - } - else if (socketFD == socket6FD) - { - LogVerbose(@"close(socket6FD)"); - socket6FD = SOCKET_NULL; - } - } -} - -- (void)closeUnusedSocket:(int)usedSocketFD -{ - if (usedSocketFD != socket4FD) - { - [self closeSocket:socket4FD]; - } - else if (usedSocketFD != socket6FD) - { - [self closeSocket:socket6FD]; - } -} - -- (BOOL)connectWithAddress4:(NSData *)address4 address6:(NSData *)address6 error:(NSError **)errPtr -{ - LogTrace(); - - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - LogVerbose(@"IPv4: %@:%hu", [[self class] hostFromAddress:address4], [[self class] portFromAddress:address4]); - LogVerbose(@"IPv6: %@:%hu", [[self class] hostFromAddress:address6], [[self class] portFromAddress:address6]); - - // Determine socket type - - BOOL preferIPv6 = (config & kPreferIPv6) ? YES : NO; - - // Create and bind the sockets - - if (address4) - { - LogVerbose(@"Creating IPv4 socket"); - - socket4FD = [self createSocket:AF_INET connectInterface:connectInterface4 errPtr:errPtr]; - } - - if (address6) - { - LogVerbose(@"Creating IPv6 socket"); - - socket6FD = [self createSocket:AF_INET6 connectInterface:connectInterface6 errPtr:errPtr]; - } - - if (socket4FD == SOCKET_NULL && socket6FD == SOCKET_NULL) - { - return NO; - } - - int socketFD, alternateSocketFD; - NSData *address, *alternateAddress; - - if ((preferIPv6 && socket6FD != SOCKET_NULL) || socket4FD == SOCKET_NULL) - { - socketFD = socket6FD; - alternateSocketFD = socket4FD; - address = address6; - alternateAddress = address4; - } - else - { - socketFD = socket4FD; - alternateSocketFD = socket6FD; - address = address4; - alternateAddress = address6; - } - - int aStateIndex = stateIndex; - - [self connectSocket:socketFD address:address stateIndex:aStateIndex]; - - if (alternateAddress) - { - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(alternateAddressDelay * NSEC_PER_SEC)), socketQueue, ^{ - [self connectSocket:alternateSocketFD address:alternateAddress stateIndex:aStateIndex]; - }); - } - - return YES; -} - -- (BOOL)connectWithAddressUN:(NSData *)address error:(NSError **)errPtr -{ - LogTrace(); - - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - // Create the socket - - int socketFD; - - LogVerbose(@"Creating unix domain socket"); - - socketUN = socket(AF_UNIX, SOCK_STREAM, 0); - - socketFD = socketUN; - - if (socketFD == SOCKET_NULL) - { - if (errPtr) - *errPtr = [self errorWithErrno:errno reason:@"Error in socket() function"]; - - return NO; - } - - // Bind the socket to the desired interface (if needed) - - LogVerbose(@"Binding socket..."); - - int reuseOn = 1; - setsockopt(socketFD, SOL_SOCKET, SO_REUSEADDR, &reuseOn, sizeof(reuseOn)); - -// const struct sockaddr *interfaceAddr = (const struct sockaddr *)[address bytes]; -// -// int result = bind(socketFD, interfaceAddr, (socklen_t)[address length]); -// if (result != 0) -// { -// if (errPtr) -// *errPtr = [self errnoErrorWithReason:@"Error in bind() function"]; -// -// return NO; -// } - - // Prevent SIGPIPE signals - - int nosigpipe = 1; - setsockopt(socketFD, SOL_SOCKET, SO_NOSIGPIPE, &nosigpipe, sizeof(nosigpipe)); - - // Start the connection process in a background queue - - int aStateIndex = stateIndex; - - dispatch_queue_t globalConcurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); - dispatch_async(globalConcurrentQueue, ^{ - - const struct sockaddr *addr = (const struct sockaddr *)[address bytes]; - int result = connect(socketFD, addr, addr->sa_len); - if (result == 0) - { - dispatch_async(self->socketQueue, ^{ @autoreleasepool { - - [self didConnect:aStateIndex]; - }}); - } - else - { - // TODO: Bad file descriptor - perror("connect"); - NSError *error = [self errorWithErrno:errno reason:@"Error in connect() function"]; - - dispatch_async(self->socketQueue, ^{ @autoreleasepool { - - [self didNotConnect:aStateIndex error:error]; - }}); - } - }); - - LogVerbose(@"Connecting..."); - - return YES; -} - -- (void)didConnect:(int)aStateIndex -{ - LogTrace(); - - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - - if (aStateIndex != stateIndex) - { - LogInfo(@"Ignoring didConnect, already disconnected"); - - // The connect operation has been cancelled. - // That is, socket was disconnected, or connection has already timed out. - return; - } - - flags |= kConnected; - - [self endConnectTimeout]; - - #if TARGET_OS_IPHONE - // The endConnectTimeout method executed above incremented the stateIndex. - aStateIndex = stateIndex; - #endif - - // Setup read/write streams (as workaround for specific shortcomings in the iOS platform) - // - // Note: - // There may be configuration options that must be set by the delegate before opening the streams. - // The primary example is the kCFStreamNetworkServiceTypeVoIP flag, which only works on an unopened stream. - // - // Thus we wait until after the socket:didConnectToHost:port: delegate method has completed. - // This gives the delegate time to properly configure the streams if needed. - - dispatch_block_t SetupStreamsPart1 = ^{ - #if TARGET_OS_IPHONE - - if (![self createReadAndWriteStream]) - { - [self closeWithError:[self otherError:@"Error creating CFStreams"]]; - return; - } - - if (![self registerForStreamCallbacksIncludingReadWrite:NO]) - { - [self closeWithError:[self otherError:@"Error in CFStreamSetClient"]]; - return; - } - - #endif - }; - dispatch_block_t SetupStreamsPart2 = ^{ - #if TARGET_OS_IPHONE - - if (aStateIndex != self->stateIndex) - { - // The socket has been disconnected. - return; - } - - if (![self addStreamsToRunLoop]) - { - [self closeWithError:[self otherError:@"Error in CFStreamScheduleWithRunLoop"]]; - return; - } - - if (![self openStreams]) - { - [self closeWithError:[self otherError:@"Error creating CFStreams"]]; - return; - } - - #endif - }; - - // Notify delegate - - NSString *host = [self connectedHost]; - uint16_t port = [self connectedPort]; - NSURL *url = [self connectedUrl]; - - __strong id theDelegate = delegate; - - if (delegateQueue && host != nil && [theDelegate respondsToSelector:@selector(socket:didConnectToHost:port:)]) - { - SetupStreamsPart1(); - - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - [theDelegate socket:self didConnectToHost:host port:port]; - - dispatch_async(self->socketQueue, ^{ @autoreleasepool { - - SetupStreamsPart2(); - }}); - }}); - } - else if (delegateQueue && url != nil && [theDelegate respondsToSelector:@selector(socket:didConnectToUrl:)]) - { - SetupStreamsPart1(); - - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - [theDelegate socket:self didConnectToUrl:url]; - - dispatch_async(self->socketQueue, ^{ @autoreleasepool { - - SetupStreamsPart2(); - }}); - }}); - } - else - { - SetupStreamsPart1(); - SetupStreamsPart2(); - } - - // Get the connected socket - - int socketFD = (socket4FD != SOCKET_NULL) ? socket4FD : (socket6FD != SOCKET_NULL) ? socket6FD : socketUN; - - // Enable non-blocking IO on the socket - - int result = fcntl(socketFD, F_SETFL, O_NONBLOCK); - if (result == -1) - { - NSString *errMsg = @"Error enabling non-blocking IO on socket (fcntl)"; - [self closeWithError:[self otherError:errMsg]]; - - return; - } - - // Setup our read/write sources - - [self setupReadAndWriteSourcesForNewlyConnectedSocket:socketFD]; - - // Dequeue any pending read/write requests - - [self maybeDequeueRead]; - [self maybeDequeueWrite]; -} - -- (void)didNotConnect:(int)aStateIndex error:(NSError *)error -{ - LogTrace(); - - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - - if (aStateIndex != stateIndex) - { - LogInfo(@"Ignoring didNotConnect, already disconnected"); - - // The connect operation has been cancelled. - // That is, socket was disconnected, or connection has already timed out. - return; - } - - [self closeWithError:error]; -} - -- (void)startConnectTimeout:(NSTimeInterval)timeout -{ - if (timeout >= 0.0) - { - connectTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, socketQueue); - - __weak GCDAsyncSocket *weakSelf = self; - - dispatch_source_set_event_handler(connectTimer, ^{ @autoreleasepool { - #pragma clang diagnostic push - #pragma clang diagnostic warning "-Wimplicit-retain-self" - - __strong GCDAsyncSocket *strongSelf = weakSelf; - if (strongSelf == nil) return_from_block; - - [strongSelf doConnectTimeout]; - - #pragma clang diagnostic pop - }}); - - #if !OS_OBJECT_USE_OBJC - dispatch_source_t theConnectTimer = connectTimer; - dispatch_source_set_cancel_handler(connectTimer, ^{ - #pragma clang diagnostic push - #pragma clang diagnostic warning "-Wimplicit-retain-self" - - LogVerbose(@"dispatch_release(connectTimer)"); - dispatch_release(theConnectTimer); - - #pragma clang diagnostic pop - }); - #endif - - dispatch_time_t tt = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeout * NSEC_PER_SEC)); - dispatch_source_set_timer(connectTimer, tt, DISPATCH_TIME_FOREVER, 0); - - dispatch_resume(connectTimer); - } -} - -- (void)endConnectTimeout -{ - LogTrace(); - - if (connectTimer) - { - dispatch_source_cancel(connectTimer); - connectTimer = NULL; - } - - // Increment stateIndex. - // This will prevent us from processing results from any related background asynchronous operations. - // - // Note: This should be called from close method even if connectTimer is NULL. - // This is because one might disconnect a socket prior to a successful connection which had no timeout. - - stateIndex++; - - if (connectInterface4) - { - connectInterface4 = nil; - } - if (connectInterface6) - { - connectInterface6 = nil; - } -} - -- (void)doConnectTimeout -{ - LogTrace(); - - [self endConnectTimeout]; - [self closeWithError:[self connectTimeoutError]]; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Disconnecting -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)closeWithError:(NSError *)error -{ - LogTrace(); - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - [self endConnectTimeout]; - - if (currentRead != nil) [self endCurrentRead]; - if (currentWrite != nil) [self endCurrentWrite]; - - [readQueue removeAllObjects]; - [writeQueue removeAllObjects]; - - [preBuffer reset]; - - #if TARGET_OS_IPHONE - { - if (readStream || writeStream) - { - [self removeStreamsFromRunLoop]; - - if (readStream) - { - CFReadStreamSetClient(readStream, kCFStreamEventNone, NULL, NULL); - CFReadStreamClose(readStream); - CFRelease(readStream); - readStream = NULL; - } - if (writeStream) - { - CFWriteStreamSetClient(writeStream, kCFStreamEventNone, NULL, NULL); - CFWriteStreamClose(writeStream); - CFRelease(writeStream); - writeStream = NULL; - } - } - } - #endif - - [sslPreBuffer reset]; - sslErrCode = lastSSLHandshakeError = noErr; - - if (sslContext) - { - // Getting a linker error here about the SSLx() functions? - // You need to add the Security Framework to your application. - - SSLClose(sslContext); - - #if TARGET_OS_IPHONE || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1080) - CFRelease(sslContext); - #else - SSLDisposeContext(sslContext); - #endif - - sslContext = NULL; - } - - // For some crazy reason (in my opinion), cancelling a dispatch source doesn't - // invoke the cancel handler if the dispatch source is paused. - // So we have to unpause the source if needed. - // This allows the cancel handler to be run, which in turn releases the source and closes the socket. - - if (!accept4Source && !accept6Source && !acceptUNSource && !readSource && !writeSource) - { - LogVerbose(@"manually closing close"); - - if (socket4FD != SOCKET_NULL) - { - LogVerbose(@"close(socket4FD)"); - close(socket4FD); - socket4FD = SOCKET_NULL; - } - - if (socket6FD != SOCKET_NULL) - { - LogVerbose(@"close(socket6FD)"); - close(socket6FD); - socket6FD = SOCKET_NULL; - } - - if (socketUN != SOCKET_NULL) - { - LogVerbose(@"close(socketUN)"); - close(socketUN); - socketUN = SOCKET_NULL; - unlink(socketUrl.path.fileSystemRepresentation); - socketUrl = nil; - } - } - else - { - if (accept4Source) - { - LogVerbose(@"dispatch_source_cancel(accept4Source)"); - dispatch_source_cancel(accept4Source); - - // We never suspend accept4Source - - accept4Source = NULL; - } - - if (accept6Source) - { - LogVerbose(@"dispatch_source_cancel(accept6Source)"); - dispatch_source_cancel(accept6Source); - - // We never suspend accept6Source - - accept6Source = NULL; - } - - if (acceptUNSource) - { - LogVerbose(@"dispatch_source_cancel(acceptUNSource)"); - dispatch_source_cancel(acceptUNSource); - - // We never suspend acceptUNSource - - acceptUNSource = NULL; - } - - if (readSource) - { - LogVerbose(@"dispatch_source_cancel(readSource)"); - dispatch_source_cancel(readSource); - - [self resumeReadSource]; - - readSource = NULL; - } - - if (writeSource) - { - LogVerbose(@"dispatch_source_cancel(writeSource)"); - dispatch_source_cancel(writeSource); - - [self resumeWriteSource]; - - writeSource = NULL; - } - - // The sockets will be closed by the cancel handlers of the corresponding source - - socket4FD = SOCKET_NULL; - socket6FD = SOCKET_NULL; - socketUN = SOCKET_NULL; - } - - // If the client has passed the connect/accept method, then the connection has at least begun. - // Notify delegate that it is now ending. - BOOL shouldCallDelegate = (flags & kSocketStarted) ? YES : NO; - BOOL isDeallocating = (flags & kDealloc) ? YES : NO; - - // Clear stored socket info and all flags (config remains as is) - socketFDBytesAvailable = 0; - flags = 0; - sslWriteCachedLength = 0; - - if (shouldCallDelegate) - { - __strong id theDelegate = delegate; - __strong id theSelf = isDeallocating ? nil : self; - - if (delegateQueue && [theDelegate respondsToSelector: @selector(socketDidDisconnect:withError:)]) - { - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - [theDelegate socketDidDisconnect:theSelf withError:error]; - }}); - } - } -} - -- (void)disconnect -{ - dispatch_block_t block = ^{ @autoreleasepool { - - if (self->flags & kSocketStarted) - { - [self closeWithError:nil]; - } - }}; - - // Synchronous disconnection, as documented in the header file - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); -} - -- (void)disconnectAfterReading -{ - dispatch_async(socketQueue, ^{ @autoreleasepool { - - if (self->flags & kSocketStarted) - { - self->flags |= (kForbidReadsWrites | kDisconnectAfterReads); - [self maybeClose]; - } - }}); -} - -- (void)disconnectAfterWriting -{ - dispatch_async(socketQueue, ^{ @autoreleasepool { - - if (self->flags & kSocketStarted) - { - self->flags |= (kForbidReadsWrites | kDisconnectAfterWrites); - [self maybeClose]; - } - }}); -} - -- (void)disconnectAfterReadingAndWriting -{ - dispatch_async(socketQueue, ^{ @autoreleasepool { - - if (self->flags & kSocketStarted) - { - self->flags |= (kForbidReadsWrites | kDisconnectAfterReads | kDisconnectAfterWrites); - [self maybeClose]; - } - }}); -} - -/** - * Closes the socket if possible. - * That is, if all writes have completed, and we're set to disconnect after writing, - * or if all reads have completed, and we're set to disconnect after reading. -**/ -- (void)maybeClose -{ - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - BOOL shouldClose = NO; - - if (flags & kDisconnectAfterReads) - { - if (([readQueue count] == 0) && (currentRead == nil)) - { - if (flags & kDisconnectAfterWrites) - { - if (([writeQueue count] == 0) && (currentWrite == nil)) - { - shouldClose = YES; - } - } - else - { - shouldClose = YES; - } - } - } - else if (flags & kDisconnectAfterWrites) - { - if (([writeQueue count] == 0) && (currentWrite == nil)) - { - shouldClose = YES; - } - } - - if (shouldClose) - { - [self closeWithError:nil]; - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Errors -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (NSError *)badConfigError:(NSString *)errMsg -{ - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - return [NSError errorWithDomain:GCDAsyncSocketErrorDomain code:GCDAsyncSocketBadConfigError userInfo:userInfo]; -} - -- (NSError *)badParamError:(NSString *)errMsg -{ - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - return [NSError errorWithDomain:GCDAsyncSocketErrorDomain code:GCDAsyncSocketBadParamError userInfo:userInfo]; -} - -+ (NSError *)gaiError:(int)gai_error -{ - NSString *errMsg = [NSString stringWithCString:gai_strerror(gai_error) encoding:NSASCIIStringEncoding]; - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - return [NSError errorWithDomain:@"kCFStreamErrorDomainNetDB" code:gai_error userInfo:userInfo]; -} - -- (NSError *)errorWithErrno:(int)err reason:(NSString *)reason -{ - NSString *errMsg = [NSString stringWithUTF8String:strerror(err)]; - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg, - NSLocalizedFailureReasonErrorKey : reason}; - - return [NSError errorWithDomain:NSPOSIXErrorDomain code:err userInfo:userInfo]; -} - -- (NSError *)errnoError -{ - NSString *errMsg = [NSString stringWithUTF8String:strerror(errno)]; - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - return [NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:userInfo]; -} - -- (NSError *)sslError:(OSStatus)ssl_error -{ - NSString *msg = @"Error code definition can be found in Apple's SecureTransport.h"; - NSDictionary *userInfo = @{NSLocalizedRecoverySuggestionErrorKey : msg}; - - return [NSError errorWithDomain:@"kCFStreamErrorDomainSSL" code:ssl_error userInfo:userInfo]; -} - -- (NSError *)connectTimeoutError -{ - NSString *errMsg = NSLocalizedStringWithDefaultValue(@"GCDAsyncSocketConnectTimeoutError", - @"GCDAsyncSocket", [NSBundle mainBundle], - @"Attempt to connect to host timed out", nil); - - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - return [NSError errorWithDomain:GCDAsyncSocketErrorDomain code:GCDAsyncSocketConnectTimeoutError userInfo:userInfo]; -} - -/** - * Returns a standard AsyncSocket maxed out error. -**/ -- (NSError *)readMaxedOutError -{ - NSString *errMsg = NSLocalizedStringWithDefaultValue(@"GCDAsyncSocketReadMaxedOutError", - @"GCDAsyncSocket", [NSBundle mainBundle], - @"Read operation reached set maximum length", nil); - - NSDictionary *info = @{NSLocalizedDescriptionKey : errMsg}; - - return [NSError errorWithDomain:GCDAsyncSocketErrorDomain code:GCDAsyncSocketReadMaxedOutError userInfo:info]; -} - -/** - * Returns a standard AsyncSocket write timeout error. -**/ -- (NSError *)readTimeoutError -{ - NSString *errMsg = NSLocalizedStringWithDefaultValue(@"GCDAsyncSocketReadTimeoutError", - @"GCDAsyncSocket", [NSBundle mainBundle], - @"Read operation timed out", nil); - - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - return [NSError errorWithDomain:GCDAsyncSocketErrorDomain code:GCDAsyncSocketReadTimeoutError userInfo:userInfo]; -} - -/** - * Returns a standard AsyncSocket write timeout error. -**/ -- (NSError *)writeTimeoutError -{ - NSString *errMsg = NSLocalizedStringWithDefaultValue(@"GCDAsyncSocketWriteTimeoutError", - @"GCDAsyncSocket", [NSBundle mainBundle], - @"Write operation timed out", nil); - - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - return [NSError errorWithDomain:GCDAsyncSocketErrorDomain code:GCDAsyncSocketWriteTimeoutError userInfo:userInfo]; -} - -- (NSError *)connectionClosedError -{ - NSString *errMsg = NSLocalizedStringWithDefaultValue(@"GCDAsyncSocketClosedError", - @"GCDAsyncSocket", [NSBundle mainBundle], - @"Socket closed by remote peer", nil); - - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - return [NSError errorWithDomain:GCDAsyncSocketErrorDomain code:GCDAsyncSocketClosedError userInfo:userInfo]; -} - -- (NSError *)otherError:(NSString *)errMsg -{ - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - return [NSError errorWithDomain:GCDAsyncSocketErrorDomain code:GCDAsyncSocketOtherError userInfo:userInfo]; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Diagnostics -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (BOOL)isDisconnected -{ - __block BOOL result = NO; - - dispatch_block_t block = ^{ - result = (self->flags & kSocketStarted) ? NO : YES; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -- (BOOL)isConnected -{ - __block BOOL result = NO; - - dispatch_block_t block = ^{ - result = (self->flags & kConnected) ? YES : NO; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -- (NSString *)connectedHost -{ - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - if (socket4FD != SOCKET_NULL) - return [self connectedHostFromSocket4:socket4FD]; - if (socket6FD != SOCKET_NULL) - return [self connectedHostFromSocket6:socket6FD]; - - return nil; - } - else - { - __block NSString *result = nil; - - dispatch_sync(socketQueue, ^{ @autoreleasepool { - - if (self->socket4FD != SOCKET_NULL) - result = [self connectedHostFromSocket4:self->socket4FD]; - else if (self->socket6FD != SOCKET_NULL) - result = [self connectedHostFromSocket6:self->socket6FD]; - }}); - - return result; - } -} - -- (uint16_t)connectedPort -{ - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - if (socket4FD != SOCKET_NULL) - return [self connectedPortFromSocket4:socket4FD]; - if (socket6FD != SOCKET_NULL) - return [self connectedPortFromSocket6:socket6FD]; - - return 0; - } - else - { - __block uint16_t result = 0; - - dispatch_sync(socketQueue, ^{ - // No need for autorelease pool - - if (self->socket4FD != SOCKET_NULL) - result = [self connectedPortFromSocket4:self->socket4FD]; - else if (self->socket6FD != SOCKET_NULL) - result = [self connectedPortFromSocket6:self->socket6FD]; - }); - - return result; - } -} - -- (NSURL *)connectedUrl -{ - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - if (socketUN != SOCKET_NULL) - return [self connectedUrlFromSocketUN:socketUN]; - - return nil; - } - else - { - __block NSURL *result = nil; - - dispatch_sync(socketQueue, ^{ @autoreleasepool { - - if (self->socketUN != SOCKET_NULL) - result = [self connectedUrlFromSocketUN:self->socketUN]; - }}); - - return result; - } -} - -- (NSString *)localHost -{ - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - if (socket4FD != SOCKET_NULL) - return [self localHostFromSocket4:socket4FD]; - if (socket6FD != SOCKET_NULL) - return [self localHostFromSocket6:socket6FD]; - - return nil; - } - else - { - __block NSString *result = nil; - - dispatch_sync(socketQueue, ^{ @autoreleasepool { - - if (self->socket4FD != SOCKET_NULL) - result = [self localHostFromSocket4:self->socket4FD]; - else if (self->socket6FD != SOCKET_NULL) - result = [self localHostFromSocket6:self->socket6FD]; - }}); - - return result; - } -} - -- (uint16_t)localPort -{ - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - if (socket4FD != SOCKET_NULL) - return [self localPortFromSocket4:socket4FD]; - if (socket6FD != SOCKET_NULL) - return [self localPortFromSocket6:socket6FD]; - - return 0; - } - else - { - __block uint16_t result = 0; - - dispatch_sync(socketQueue, ^{ - // No need for autorelease pool - - if (self->socket4FD != SOCKET_NULL) - result = [self localPortFromSocket4:self->socket4FD]; - else if (self->socket6FD != SOCKET_NULL) - result = [self localPortFromSocket6:self->socket6FD]; - }); - - return result; - } -} - -- (NSString *)connectedHost4 -{ - if (socket4FD != SOCKET_NULL) - return [self connectedHostFromSocket4:socket4FD]; - - return nil; -} - -- (NSString *)connectedHost6 -{ - if (socket6FD != SOCKET_NULL) - return [self connectedHostFromSocket6:socket6FD]; - - return nil; -} - -- (uint16_t)connectedPort4 -{ - if (socket4FD != SOCKET_NULL) - return [self connectedPortFromSocket4:socket4FD]; - - return 0; -} - -- (uint16_t)connectedPort6 -{ - if (socket6FD != SOCKET_NULL) - return [self connectedPortFromSocket6:socket6FD]; - - return 0; -} - -- (NSString *)localHost4 -{ - if (socket4FD != SOCKET_NULL) - return [self localHostFromSocket4:socket4FD]; - - return nil; -} - -- (NSString *)localHost6 -{ - if (socket6FD != SOCKET_NULL) - return [self localHostFromSocket6:socket6FD]; - - return nil; -} - -- (uint16_t)localPort4 -{ - if (socket4FD != SOCKET_NULL) - return [self localPortFromSocket4:socket4FD]; - - return 0; -} - -- (uint16_t)localPort6 -{ - if (socket6FD != SOCKET_NULL) - return [self localPortFromSocket6:socket6FD]; - - return 0; -} - -- (NSString *)connectedHostFromSocket4:(int)socketFD -{ - struct sockaddr_in sockaddr4; - socklen_t sockaddr4len = sizeof(sockaddr4); - - if (getpeername(socketFD, (struct sockaddr *)&sockaddr4, &sockaddr4len) < 0) - { - return nil; - } - return [[self class] hostFromSockaddr4:&sockaddr4]; -} - -- (NSString *)connectedHostFromSocket6:(int)socketFD -{ - struct sockaddr_in6 sockaddr6; - socklen_t sockaddr6len = sizeof(sockaddr6); - - if (getpeername(socketFD, (struct sockaddr *)&sockaddr6, &sockaddr6len) < 0) - { - return nil; - } - return [[self class] hostFromSockaddr6:&sockaddr6]; -} - -- (uint16_t)connectedPortFromSocket4:(int)socketFD -{ - struct sockaddr_in sockaddr4; - socklen_t sockaddr4len = sizeof(sockaddr4); - - if (getpeername(socketFD, (struct sockaddr *)&sockaddr4, &sockaddr4len) < 0) - { - return 0; - } - return [[self class] portFromSockaddr4:&sockaddr4]; -} - -- (uint16_t)connectedPortFromSocket6:(int)socketFD -{ - struct sockaddr_in6 sockaddr6; - socklen_t sockaddr6len = sizeof(sockaddr6); - - if (getpeername(socketFD, (struct sockaddr *)&sockaddr6, &sockaddr6len) < 0) - { - return 0; - } - return [[self class] portFromSockaddr6:&sockaddr6]; -} - -- (NSURL *)connectedUrlFromSocketUN:(int)socketFD -{ - struct sockaddr_un sockaddr; - socklen_t sockaddrlen = sizeof(sockaddr); - - if (getpeername(socketFD, (struct sockaddr *)&sockaddr, &sockaddrlen) < 0) - { - return 0; - } - return [[self class] urlFromSockaddrUN:&sockaddr]; -} - -- (NSString *)localHostFromSocket4:(int)socketFD -{ - struct sockaddr_in sockaddr4; - socklen_t sockaddr4len = sizeof(sockaddr4); - - if (getsockname(socketFD, (struct sockaddr *)&sockaddr4, &sockaddr4len) < 0) - { - return nil; - } - return [[self class] hostFromSockaddr4:&sockaddr4]; -} - -- (NSString *)localHostFromSocket6:(int)socketFD -{ - struct sockaddr_in6 sockaddr6; - socklen_t sockaddr6len = sizeof(sockaddr6); - - if (getsockname(socketFD, (struct sockaddr *)&sockaddr6, &sockaddr6len) < 0) - { - return nil; - } - return [[self class] hostFromSockaddr6:&sockaddr6]; -} - -- (uint16_t)localPortFromSocket4:(int)socketFD -{ - struct sockaddr_in sockaddr4; - socklen_t sockaddr4len = sizeof(sockaddr4); - - if (getsockname(socketFD, (struct sockaddr *)&sockaddr4, &sockaddr4len) < 0) - { - return 0; - } - return [[self class] portFromSockaddr4:&sockaddr4]; -} - -- (uint16_t)localPortFromSocket6:(int)socketFD -{ - struct sockaddr_in6 sockaddr6; - socklen_t sockaddr6len = sizeof(sockaddr6); - - if (getsockname(socketFD, (struct sockaddr *)&sockaddr6, &sockaddr6len) < 0) - { - return 0; - } - return [[self class] portFromSockaddr6:&sockaddr6]; -} - -- (NSData *)connectedAddress -{ - __block NSData *result = nil; - - dispatch_block_t block = ^{ - if (self->socket4FD != SOCKET_NULL) - { - struct sockaddr_in sockaddr4; - socklen_t sockaddr4len = sizeof(sockaddr4); - - if (getpeername(self->socket4FD, (struct sockaddr *)&sockaddr4, &sockaddr4len) == 0) - { - result = [[NSData alloc] initWithBytes:&sockaddr4 length:sockaddr4len]; - } - } - - if (self->socket6FD != SOCKET_NULL) - { - struct sockaddr_in6 sockaddr6; - socklen_t sockaddr6len = sizeof(sockaddr6); - - if (getpeername(self->socket6FD, (struct sockaddr *)&sockaddr6, &sockaddr6len) == 0) - { - result = [[NSData alloc] initWithBytes:&sockaddr6 length:sockaddr6len]; - } - } - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -- (NSData *)localAddress -{ - __block NSData *result = nil; - - dispatch_block_t block = ^{ - if (self->socket4FD != SOCKET_NULL) - { - struct sockaddr_in sockaddr4; - socklen_t sockaddr4len = sizeof(sockaddr4); - - if (getsockname(self->socket4FD, (struct sockaddr *)&sockaddr4, &sockaddr4len) == 0) - { - result = [[NSData alloc] initWithBytes:&sockaddr4 length:sockaddr4len]; - } - } - - if (self->socket6FD != SOCKET_NULL) - { - struct sockaddr_in6 sockaddr6; - socklen_t sockaddr6len = sizeof(sockaddr6); - - if (getsockname(self->socket6FD, (struct sockaddr *)&sockaddr6, &sockaddr6len) == 0) - { - result = [[NSData alloc] initWithBytes:&sockaddr6 length:sockaddr6len]; - } - } - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -- (BOOL)isIPv4 -{ - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - return (socket4FD != SOCKET_NULL); - } - else - { - __block BOOL result = NO; - - dispatch_sync(socketQueue, ^{ - result = (self->socket4FD != SOCKET_NULL); - }); - - return result; - } -} - -- (BOOL)isIPv6 -{ - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - return (socket6FD != SOCKET_NULL); - } - else - { - __block BOOL result = NO; - - dispatch_sync(socketQueue, ^{ - result = (self->socket6FD != SOCKET_NULL); - }); - - return result; - } -} - -- (BOOL)isSecure -{ - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - return (flags & kSocketSecure) ? YES : NO; - } - else - { - __block BOOL result; - - dispatch_sync(socketQueue, ^{ - result = (self->flags & kSocketSecure) ? YES : NO; - }); - - return result; - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Utilities -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * Finds the address of an interface description. - * An inteface description may be an interface name (en0, en1, lo0) or corresponding IP (192.168.4.34). - * - * The interface description may optionally contain a port number at the end, separated by a colon. - * If a non-zero port parameter is provided, any port number in the interface description is ignored. - * - * The returned value is a 'struct sockaddr' wrapped in an NSMutableData object. -**/ -- (void)getInterfaceAddress4:(NSMutableData **)interfaceAddr4Ptr - address6:(NSMutableData **)interfaceAddr6Ptr - fromDescription:(NSString *)interfaceDescription - port:(uint16_t)port -{ - NSMutableData *addr4 = nil; - NSMutableData *addr6 = nil; - - NSString *interface = nil; - - NSArray *components = [interfaceDescription componentsSeparatedByString:@":"]; - if ([components count] > 0) - { - NSString *temp = [components objectAtIndex:0]; - if ([temp length] > 0) - { - interface = temp; - } - } - if ([components count] > 1 && port == 0) - { - NSString *temp = [components objectAtIndex:1]; - long portL = strtol([temp UTF8String], NULL, 10); - - if (portL > 0 && portL <= UINT16_MAX) - { - port = (uint16_t)portL; - } - } - - if (interface == nil) - { - // ANY address - - struct sockaddr_in sockaddr4; - memset(&sockaddr4, 0, sizeof(sockaddr4)); - - sockaddr4.sin_len = sizeof(sockaddr4); - sockaddr4.sin_family = AF_INET; - sockaddr4.sin_port = htons(port); - sockaddr4.sin_addr.s_addr = htonl(INADDR_ANY); - - struct sockaddr_in6 sockaddr6; - memset(&sockaddr6, 0, sizeof(sockaddr6)); - - sockaddr6.sin6_len = sizeof(sockaddr6); - sockaddr6.sin6_family = AF_INET6; - sockaddr6.sin6_port = htons(port); - sockaddr6.sin6_addr = in6addr_any; - - addr4 = [NSMutableData dataWithBytes:&sockaddr4 length:sizeof(sockaddr4)]; - addr6 = [NSMutableData dataWithBytes:&sockaddr6 length:sizeof(sockaddr6)]; - } - else if ([interface isEqualToString:@"localhost"] || [interface isEqualToString:@"loopback"]) - { - // LOOPBACK address - - struct sockaddr_in sockaddr4; - memset(&sockaddr4, 0, sizeof(sockaddr4)); - - sockaddr4.sin_len = sizeof(sockaddr4); - sockaddr4.sin_family = AF_INET; - sockaddr4.sin_port = htons(port); - sockaddr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - - struct sockaddr_in6 sockaddr6; - memset(&sockaddr6, 0, sizeof(sockaddr6)); - - sockaddr6.sin6_len = sizeof(sockaddr6); - sockaddr6.sin6_family = AF_INET6; - sockaddr6.sin6_port = htons(port); - sockaddr6.sin6_addr = in6addr_loopback; - - addr4 = [NSMutableData dataWithBytes:&sockaddr4 length:sizeof(sockaddr4)]; - addr6 = [NSMutableData dataWithBytes:&sockaddr6 length:sizeof(sockaddr6)]; - } - else - { - const char *iface = [interface UTF8String]; - - struct ifaddrs *addrs; - const struct ifaddrs *cursor; - - if ((getifaddrs(&addrs) == 0)) - { - cursor = addrs; - while (cursor != NULL) - { - if ((addr4 == nil) && (cursor->ifa_addr->sa_family == AF_INET)) - { - // IPv4 - - struct sockaddr_in nativeAddr4; - memcpy(&nativeAddr4, cursor->ifa_addr, sizeof(nativeAddr4)); - - if (strcmp(cursor->ifa_name, iface) == 0) - { - // Name match - - nativeAddr4.sin_port = htons(port); - - addr4 = [NSMutableData dataWithBytes:&nativeAddr4 length:sizeof(nativeAddr4)]; - } - else - { - char ip[INET_ADDRSTRLEN]; - - const char *conversion = inet_ntop(AF_INET, &nativeAddr4.sin_addr, ip, sizeof(ip)); - - if ((conversion != NULL) && (strcmp(ip, iface) == 0)) - { - // IP match - - nativeAddr4.sin_port = htons(port); - - addr4 = [NSMutableData dataWithBytes:&nativeAddr4 length:sizeof(nativeAddr4)]; - } - } - } - else if ((addr6 == nil) && (cursor->ifa_addr->sa_family == AF_INET6)) - { - // IPv6 - - struct sockaddr_in6 nativeAddr6; - memcpy(&nativeAddr6, cursor->ifa_addr, sizeof(nativeAddr6)); - - if (strcmp(cursor->ifa_name, iface) == 0) - { - // Name match - - nativeAddr6.sin6_port = htons(port); - - addr6 = [NSMutableData dataWithBytes:&nativeAddr6 length:sizeof(nativeAddr6)]; - } - else - { - char ip[INET6_ADDRSTRLEN]; - - const char *conversion = inet_ntop(AF_INET6, &nativeAddr6.sin6_addr, ip, sizeof(ip)); - - if ((conversion != NULL) && (strcmp(ip, iface) == 0)) - { - // IP match - - nativeAddr6.sin6_port = htons(port); - - addr6 = [NSMutableData dataWithBytes:&nativeAddr6 length:sizeof(nativeAddr6)]; - } - } - } - - cursor = cursor->ifa_next; - } - - freeifaddrs(addrs); - } - } - - if (interfaceAddr4Ptr) *interfaceAddr4Ptr = addr4; - if (interfaceAddr6Ptr) *interfaceAddr6Ptr = addr6; -} - -- (NSData *)getInterfaceAddressFromUrl:(NSURL *)url -{ - NSString *path = url.path; - if (path.length == 0) { - return nil; - } - - struct sockaddr_un nativeAddr; - nativeAddr.sun_family = AF_UNIX; - strlcpy(nativeAddr.sun_path, path.fileSystemRepresentation, sizeof(nativeAddr.sun_path)); - nativeAddr.sun_len = (unsigned char)SUN_LEN(&nativeAddr); - NSData *interface = [NSData dataWithBytes:&nativeAddr length:sizeof(struct sockaddr_un)]; - - return interface; -} - -- (void)setupReadAndWriteSourcesForNewlyConnectedSocket:(int)socketFD -{ - readSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, socketFD, 0, socketQueue); - writeSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_WRITE, socketFD, 0, socketQueue); - - // Setup event handlers - - __weak GCDAsyncSocket *weakSelf = self; - - dispatch_source_set_event_handler(readSource, ^{ @autoreleasepool { - #pragma clang diagnostic push - #pragma clang diagnostic warning "-Wimplicit-retain-self" - - __strong GCDAsyncSocket *strongSelf = weakSelf; - if (strongSelf == nil) return_from_block; - - LogVerbose(@"readEventBlock"); - - strongSelf->socketFDBytesAvailable = dispatch_source_get_data(strongSelf->readSource); - LogVerbose(@"socketFDBytesAvailable: %lu", strongSelf->socketFDBytesAvailable); - - if (strongSelf->socketFDBytesAvailable > 0) - [strongSelf doReadData]; - else - [strongSelf doReadEOF]; - - #pragma clang diagnostic pop - }}); - - dispatch_source_set_event_handler(writeSource, ^{ @autoreleasepool { - #pragma clang diagnostic push - #pragma clang diagnostic warning "-Wimplicit-retain-self" - - __strong GCDAsyncSocket *strongSelf = weakSelf; - if (strongSelf == nil) return_from_block; - - LogVerbose(@"writeEventBlock"); - - strongSelf->flags |= kSocketCanAcceptBytes; - [strongSelf doWriteData]; - - #pragma clang diagnostic pop - }}); - - // Setup cancel handlers - - __block int socketFDRefCount = 2; - - #if !OS_OBJECT_USE_OBJC - dispatch_source_t theReadSource = readSource; - dispatch_source_t theWriteSource = writeSource; - #endif - - dispatch_source_set_cancel_handler(readSource, ^{ - #pragma clang diagnostic push - #pragma clang diagnostic warning "-Wimplicit-retain-self" - - LogVerbose(@"readCancelBlock"); - - #if !OS_OBJECT_USE_OBJC - LogVerbose(@"dispatch_release(readSource)"); - dispatch_release(theReadSource); - #endif - - if (--socketFDRefCount == 0) - { - LogVerbose(@"close(socketFD)"); - close(socketFD); - } - - #pragma clang diagnostic pop - }); - - dispatch_source_set_cancel_handler(writeSource, ^{ - #pragma clang diagnostic push - #pragma clang diagnostic warning "-Wimplicit-retain-self" - - LogVerbose(@"writeCancelBlock"); - - #if !OS_OBJECT_USE_OBJC - LogVerbose(@"dispatch_release(writeSource)"); - dispatch_release(theWriteSource); - #endif - - if (--socketFDRefCount == 0) - { - LogVerbose(@"close(socketFD)"); - close(socketFD); - } - - #pragma clang diagnostic pop - }); - - // We will not be able to read until data arrives. - // But we should be able to write immediately. - - socketFDBytesAvailable = 0; - flags &= ~kReadSourceSuspended; - - LogVerbose(@"dispatch_resume(readSource)"); - dispatch_resume(readSource); - - flags |= kSocketCanAcceptBytes; - flags |= kWriteSourceSuspended; -} - -- (BOOL)usingCFStreamForTLS -{ - #if TARGET_OS_IPHONE - - if ((flags & kSocketSecure) && (flags & kUsingCFStreamForTLS)) - { - // The startTLS method was given the GCDAsyncSocketUseCFStreamForTLS flag. - - return YES; - } - - #endif - - return NO; -} - -- (BOOL)usingSecureTransportForTLS -{ - // Invoking this method is equivalent to ![self usingCFStreamForTLS] (just more readable) - - #if TARGET_OS_IPHONE - - if ((flags & kSocketSecure) && (flags & kUsingCFStreamForTLS)) - { - // The startTLS method was given the GCDAsyncSocketUseCFStreamForTLS flag. - - return NO; - } - - #endif - - return YES; -} - -- (void)suspendReadSource -{ - if (!(flags & kReadSourceSuspended)) - { - LogVerbose(@"dispatch_suspend(readSource)"); - - dispatch_suspend(readSource); - flags |= kReadSourceSuspended; - } -} - -- (void)resumeReadSource -{ - if (flags & kReadSourceSuspended) - { - LogVerbose(@"dispatch_resume(readSource)"); - - dispatch_resume(readSource); - flags &= ~kReadSourceSuspended; - } -} - -- (void)suspendWriteSource -{ - if (!(flags & kWriteSourceSuspended)) - { - LogVerbose(@"dispatch_suspend(writeSource)"); - - dispatch_suspend(writeSource); - flags |= kWriteSourceSuspended; - } -} - -- (void)resumeWriteSource -{ - if (flags & kWriteSourceSuspended) - { - LogVerbose(@"dispatch_resume(writeSource)"); - - dispatch_resume(writeSource); - flags &= ~kWriteSourceSuspended; - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Reading -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)readDataWithTimeout:(NSTimeInterval)timeout tag:(long)tag -{ - [self readDataWithTimeout:timeout buffer:nil bufferOffset:0 maxLength:0 tag:tag]; -} - -- (void)readDataWithTimeout:(NSTimeInterval)timeout - buffer:(NSMutableData *)buffer - bufferOffset:(NSUInteger)offset - tag:(long)tag -{ - [self readDataWithTimeout:timeout buffer:buffer bufferOffset:offset maxLength:0 tag:tag]; -} - -- (void)readDataWithTimeout:(NSTimeInterval)timeout - buffer:(NSMutableData *)buffer - bufferOffset:(NSUInteger)offset - maxLength:(NSUInteger)length - tag:(long)tag -{ - if (offset > [buffer length]) { - LogWarn(@"Cannot read: offset > [buffer length]"); - return; - } - - GCDAsyncReadPacket *packet = [[GCDAsyncReadPacket alloc] initWithData:buffer - startOffset:offset - maxLength:length - timeout:timeout - readLength:0 - terminator:nil - tag:tag]; - - dispatch_async(socketQueue, ^{ @autoreleasepool { - - LogTrace(); - - if ((self->flags & kSocketStarted) && !(self->flags & kForbidReadsWrites)) - { - [self->readQueue addObject:packet]; - [self maybeDequeueRead]; - } - }}); - - // Do not rely on the block being run in order to release the packet, - // as the queue might get released without the block completing. -} - -- (void)readDataToLength:(NSUInteger)length withTimeout:(NSTimeInterval)timeout tag:(long)tag -{ - [self readDataToLength:length withTimeout:timeout buffer:nil bufferOffset:0 tag:tag]; -} - -- (void)readDataToLength:(NSUInteger)length - withTimeout:(NSTimeInterval)timeout - buffer:(NSMutableData *)buffer - bufferOffset:(NSUInteger)offset - tag:(long)tag -{ - if (length == 0) { - LogWarn(@"Cannot read: length == 0"); - return; - } - if (offset > [buffer length]) { - LogWarn(@"Cannot read: offset > [buffer length]"); - return; - } - - GCDAsyncReadPacket *packet = [[GCDAsyncReadPacket alloc] initWithData:buffer - startOffset:offset - maxLength:0 - timeout:timeout - readLength:length - terminator:nil - tag:tag]; - - dispatch_async(socketQueue, ^{ @autoreleasepool { - - LogTrace(); - - if ((self->flags & kSocketStarted) && !(self->flags & kForbidReadsWrites)) - { - [self->readQueue addObject:packet]; - [self maybeDequeueRead]; - } - }}); - - // Do not rely on the block being run in order to release the packet, - // as the queue might get released without the block completing. -} - -- (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag -{ - [self readDataToData:data withTimeout:timeout buffer:nil bufferOffset:0 maxLength:0 tag:tag]; -} - -- (void)readDataToData:(NSData *)data - withTimeout:(NSTimeInterval)timeout - buffer:(NSMutableData *)buffer - bufferOffset:(NSUInteger)offset - tag:(long)tag -{ - [self readDataToData:data withTimeout:timeout buffer:buffer bufferOffset:offset maxLength:0 tag:tag]; -} - -- (void)readDataToData:(NSData *)data withTimeout:(NSTimeInterval)timeout maxLength:(NSUInteger)length tag:(long)tag -{ - [self readDataToData:data withTimeout:timeout buffer:nil bufferOffset:0 maxLength:length tag:tag]; -} - -- (void)readDataToData:(NSData *)data - withTimeout:(NSTimeInterval)timeout - buffer:(NSMutableData *)buffer - bufferOffset:(NSUInteger)offset - maxLength:(NSUInteger)maxLength - tag:(long)tag -{ - if ([data length] == 0) { - LogWarn(@"Cannot read: [data length] == 0"); - return; - } - if (offset > [buffer length]) { - LogWarn(@"Cannot read: offset > [buffer length]"); - return; - } - if (maxLength > 0 && maxLength < [data length]) { - LogWarn(@"Cannot read: maxLength > 0 && maxLength < [data length]"); - return; - } - - GCDAsyncReadPacket *packet = [[GCDAsyncReadPacket alloc] initWithData:buffer - startOffset:offset - maxLength:maxLength - timeout:timeout - readLength:0 - terminator:data - tag:tag]; - - dispatch_async(socketQueue, ^{ @autoreleasepool { - - LogTrace(); - - if ((self->flags & kSocketStarted) && !(self->flags & kForbidReadsWrites)) - { - [self->readQueue addObject:packet]; - [self maybeDequeueRead]; - } - }}); - - // Do not rely on the block being run in order to release the packet, - // as the queue might get released without the block completing. -} - -- (float)progressOfReadReturningTag:(long *)tagPtr bytesDone:(NSUInteger *)donePtr total:(NSUInteger *)totalPtr -{ - __block float result = 0.0F; - - dispatch_block_t block = ^{ - - if (!self->currentRead || ![self->currentRead isKindOfClass:[GCDAsyncReadPacket class]]) - { - // We're not reading anything right now. - - if (tagPtr != NULL) *tagPtr = 0; - if (donePtr != NULL) *donePtr = 0; - if (totalPtr != NULL) *totalPtr = 0; - - result = NAN; - } - else - { - // It's only possible to know the progress of our read if we're reading to a certain length. - // If we're reading to data, we of course have no idea when the data will arrive. - // If we're reading to timeout, then we have no idea when the next chunk of data will arrive. - - NSUInteger done = self->currentRead->bytesDone; - NSUInteger total = self->currentRead->readLength; - - if (tagPtr != NULL) *tagPtr = self->currentRead->tag; - if (donePtr != NULL) *donePtr = done; - if (totalPtr != NULL) *totalPtr = total; - - if (total > 0) - result = (float)done / (float)total; - else - result = 1.0F; - } - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -/** - * This method starts a new read, if needed. - * - * It is called when: - * - a user requests a read - * - after a read request has finished (to handle the next request) - * - immediately after the socket opens to handle any pending requests - * - * This method also handles auto-disconnect post read/write completion. -**/ -- (void)maybeDequeueRead -{ - LogTrace(); - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - // If we're not currently processing a read AND we have an available read stream - if ((currentRead == nil) && (flags & kConnected)) - { - if ([readQueue count] > 0) - { - // Dequeue the next object in the write queue - currentRead = [readQueue objectAtIndex:0]; - [readQueue removeObjectAtIndex:0]; - - - if ([currentRead isKindOfClass:[GCDAsyncSpecialPacket class]]) - { - LogVerbose(@"Dequeued GCDAsyncSpecialPacket"); - - // Attempt to start TLS - flags |= kStartingReadTLS; - - // This method won't do anything unless both kStartingReadTLS and kStartingWriteTLS are set - [self maybeStartTLS]; - } - else - { - LogVerbose(@"Dequeued GCDAsyncReadPacket"); - - // Setup read timer (if needed) - [self setupReadTimerWithTimeout:currentRead->timeout]; - - // Immediately read, if possible - [self doReadData]; - } - } - else if (flags & kDisconnectAfterReads) - { - if (flags & kDisconnectAfterWrites) - { - if (([writeQueue count] == 0) && (currentWrite == nil)) - { - [self closeWithError:nil]; - } - } - else - { - [self closeWithError:nil]; - } - } - else if (flags & kSocketSecure) - { - [self flushSSLBuffers]; - - // Edge case: - // - // We just drained all data from the ssl buffers, - // and all known data from the socket (socketFDBytesAvailable). - // - // If we didn't get any data from this process, - // then we may have reached the end of the TCP stream. - // - // Be sure callbacks are enabled so we're notified about a disconnection. - - if ([preBuffer availableBytes] == 0) - { - if ([self usingCFStreamForTLS]) { - // Callbacks never disabled - } - else { - [self resumeReadSource]; - } - } - } - } -} - -- (void)flushSSLBuffers -{ - LogTrace(); - - NSAssert((flags & kSocketSecure), @"Cannot flush ssl buffers on non-secure socket"); - - if ([preBuffer availableBytes] > 0) - { - // Only flush the ssl buffers if the prebuffer is empty. - // This is to avoid growing the prebuffer inifinitely large. - - return; - } - - #if TARGET_OS_IPHONE - - if ([self usingCFStreamForTLS]) - { - if ((flags & kSecureSocketHasBytesAvailable) && CFReadStreamHasBytesAvailable(readStream)) - { - LogVerbose(@"%@ - Flushing ssl buffers into prebuffer...", THIS_METHOD); - - CFIndex defaultBytesToRead = (1024 * 4); - - [preBuffer ensureCapacityForWrite:defaultBytesToRead]; - - uint8_t *buffer = [preBuffer writeBuffer]; - - CFIndex result = CFReadStreamRead(readStream, buffer, defaultBytesToRead); - LogVerbose(@"%@ - CFReadStreamRead(): result = %i", THIS_METHOD, (int)result); - - if (result > 0) - { - [preBuffer didWrite:result]; - } - - flags &= ~kSecureSocketHasBytesAvailable; - } - - return; - } - - #endif - - __block NSUInteger estimatedBytesAvailable = 0; - - dispatch_block_t updateEstimatedBytesAvailable = ^{ - - // Figure out if there is any data available to be read - // - // socketFDBytesAvailable <- Number of encrypted bytes we haven't read from the bsd socket - // [sslPreBuffer availableBytes] <- Number of encrypted bytes we've buffered from bsd socket - // sslInternalBufSize <- Number of decrypted bytes SecureTransport has buffered - // - // We call the variable "estimated" because we don't know how many decrypted bytes we'll get - // from the encrypted bytes in the sslPreBuffer. - // However, we do know this is an upper bound on the estimation. - - estimatedBytesAvailable = self->socketFDBytesAvailable + [self->sslPreBuffer availableBytes]; - - size_t sslInternalBufSize = 0; - SSLGetBufferedReadSize(self->sslContext, &sslInternalBufSize); - - estimatedBytesAvailable += sslInternalBufSize; - }; - - updateEstimatedBytesAvailable(); - - if (estimatedBytesAvailable > 0) - { - LogVerbose(@"%@ - Flushing ssl buffers into prebuffer...", THIS_METHOD); - - BOOL done = NO; - do - { - LogVerbose(@"%@ - estimatedBytesAvailable = %lu", THIS_METHOD, (unsigned long)estimatedBytesAvailable); - - // Make sure there's enough room in the prebuffer - - [preBuffer ensureCapacityForWrite:estimatedBytesAvailable]; - - // Read data into prebuffer - - uint8_t *buffer = [preBuffer writeBuffer]; - size_t bytesRead = 0; - - OSStatus result = SSLRead(sslContext, buffer, (size_t)estimatedBytesAvailable, &bytesRead); - LogVerbose(@"%@ - read from secure socket = %u", THIS_METHOD, (unsigned)bytesRead); - - if (bytesRead > 0) - { - [preBuffer didWrite:bytesRead]; - } - - LogVerbose(@"%@ - prebuffer.length = %zu", THIS_METHOD, [preBuffer availableBytes]); - - if (result != noErr) - { - done = YES; - } - else - { - updateEstimatedBytesAvailable(); - } - - } while (!done && estimatedBytesAvailable > 0); - } -} - -- (void)doReadData -{ - LogTrace(); - - // This method is called on the socketQueue. - // It might be called directly, or via the readSource when data is available to be read. - - if ((currentRead == nil) || (flags & kReadsPaused)) - { - LogVerbose(@"No currentRead or kReadsPaused"); - - // Unable to read at this time - - if (flags & kSocketSecure) - { - // Here's the situation: - // - // We have an established secure connection. - // There may not be a currentRead, but there might be encrypted data sitting around for us. - // When the user does get around to issuing a read, that encrypted data will need to be decrypted. - // - // So why make the user wait? - // We might as well get a head start on decrypting some data now. - // - // The other reason we do this has to do with detecting a socket disconnection. - // The SSL/TLS protocol has it's own disconnection handshake. - // So when a secure socket is closed, a "goodbye" packet comes across the wire. - // We want to make sure we read the "goodbye" packet so we can properly detect the TCP disconnection. - - [self flushSSLBuffers]; - } - - if ([self usingCFStreamForTLS]) - { - // CFReadStream only fires once when there is available data. - // It won't fire again until we've invoked CFReadStreamRead. - } - else - { - // If the readSource is firing, we need to pause it - // or else it will continue to fire over and over again. - // - // If the readSource is not firing, - // we want it to continue monitoring the socket. - - if (socketFDBytesAvailable > 0) - { - [self suspendReadSource]; - } - } - return; - } - - BOOL hasBytesAvailable = NO; - unsigned long estimatedBytesAvailable = 0; - - if ([self usingCFStreamForTLS]) - { - #if TARGET_OS_IPHONE - - // Requested CFStream, rather than SecureTransport, for TLS (via GCDAsyncSocketUseCFStreamForTLS) - - estimatedBytesAvailable = 0; - if ((flags & kSecureSocketHasBytesAvailable) && CFReadStreamHasBytesAvailable(readStream)) - hasBytesAvailable = YES; - else - hasBytesAvailable = NO; - - #endif - } - else - { - estimatedBytesAvailable = socketFDBytesAvailable; - - if (flags & kSocketSecure) - { - // There are 2 buffers to be aware of here. - // - // We are using SecureTransport, a TLS/SSL security layer which sits atop TCP. - // We issue a read to the SecureTranport API, which in turn issues a read to our SSLReadFunction. - // Our SSLReadFunction then reads from the BSD socket and returns the encrypted data to SecureTransport. - // SecureTransport then decrypts the data, and finally returns the decrypted data back to us. - // - // The first buffer is one we create. - // SecureTransport often requests small amounts of data. - // This has to do with the encypted packets that are coming across the TCP stream. - // But it's non-optimal to do a bunch of small reads from the BSD socket. - // So our SSLReadFunction reads all available data from the socket (optimizing the sys call) - // and may store excess in the sslPreBuffer. - - estimatedBytesAvailable += [sslPreBuffer availableBytes]; - - // The second buffer is within SecureTransport. - // As mentioned earlier, there are encrypted packets coming across the TCP stream. - // SecureTransport needs the entire packet to decrypt it. - // But if the entire packet produces X bytes of decrypted data, - // and we only asked SecureTransport for X/2 bytes of data, - // it must store the extra X/2 bytes of decrypted data for the next read. - // - // The SSLGetBufferedReadSize function will tell us the size of this internal buffer. - // From the documentation: - // - // "This function does not block or cause any low-level read operations to occur." - - size_t sslInternalBufSize = 0; - SSLGetBufferedReadSize(sslContext, &sslInternalBufSize); - - estimatedBytesAvailable += sslInternalBufSize; - } - - hasBytesAvailable = (estimatedBytesAvailable > 0); - } - - if ((hasBytesAvailable == NO) && ([preBuffer availableBytes] == 0)) - { - LogVerbose(@"No data available to read..."); - - // No data available to read. - - if (![self usingCFStreamForTLS]) - { - // Need to wait for readSource to fire and notify us of - // available data in the socket's internal read buffer. - - [self resumeReadSource]; - } - return; - } - - if (flags & kStartingReadTLS) - { - LogVerbose(@"Waiting for SSL/TLS handshake to complete"); - - // The readQueue is waiting for SSL/TLS handshake to complete. - - if (flags & kStartingWriteTLS) - { - if ([self usingSecureTransportForTLS] && lastSSLHandshakeError == errSSLWouldBlock) - { - // We are in the process of a SSL Handshake. - // We were waiting for incoming data which has just arrived. - - [self ssl_continueSSLHandshake]; - } - } - else - { - // We are still waiting for the writeQueue to drain and start the SSL/TLS process. - // We now know data is available to read. - - if (![self usingCFStreamForTLS]) - { - // Suspend the read source or else it will continue to fire nonstop. - - [self suspendReadSource]; - } - } - - return; - } - - BOOL done = NO; // Completed read operation - NSError *error = nil; // Error occurred - - NSUInteger totalBytesReadForCurrentRead = 0; - - // - // STEP 1 - READ FROM PREBUFFER - // - - if ([preBuffer availableBytes] > 0) - { - // There are 3 types of read packets: - // - // 1) Read all available data. - // 2) Read a specific length of data. - // 3) Read up to a particular terminator. - - NSUInteger bytesToCopy; - - if (currentRead->term != nil) - { - // Read type #3 - read up to a terminator - - bytesToCopy = [currentRead readLengthForTermWithPreBuffer:preBuffer found:&done]; - } - else - { - // Read type #1 or #2 - - bytesToCopy = [currentRead readLengthForNonTermWithHint:[preBuffer availableBytes]]; - } - - // Make sure we have enough room in the buffer for our read. - - [currentRead ensureCapacityForAdditionalDataOfLength:bytesToCopy]; - - // Copy bytes from prebuffer into packet buffer - - uint8_t *buffer = (uint8_t *)[currentRead->buffer mutableBytes] + currentRead->startOffset + - currentRead->bytesDone; - - memcpy(buffer, [preBuffer readBuffer], bytesToCopy); - - // Remove the copied bytes from the preBuffer - [preBuffer didRead:bytesToCopy]; - - LogVerbose(@"copied(%lu) preBufferLength(%zu)", (unsigned long)bytesToCopy, [preBuffer availableBytes]); - - // Update totals - - currentRead->bytesDone += bytesToCopy; - totalBytesReadForCurrentRead += bytesToCopy; - - // Check to see if the read operation is done - - if (currentRead->readLength > 0) - { - // Read type #2 - read a specific length of data - - done = (currentRead->bytesDone == currentRead->readLength); - } - else if (currentRead->term != nil) - { - // Read type #3 - read up to a terminator - - // Our 'done' variable was updated via the readLengthForTermWithPreBuffer:found: method - - if (!done && currentRead->maxLength > 0) - { - // We're not done and there's a set maxLength. - // Have we reached that maxLength yet? - - if (currentRead->bytesDone >= currentRead->maxLength) - { - error = [self readMaxedOutError]; - } - } - } - else - { - // Read type #1 - read all available data - // - // We're done as soon as - // - we've read all available data (in prebuffer and socket) - // - we've read the maxLength of read packet. - - done = ((currentRead->maxLength > 0) && (currentRead->bytesDone == currentRead->maxLength)); - } - - } - - // - // STEP 2 - READ FROM SOCKET - // - - BOOL socketEOF = (flags & kSocketHasReadEOF) ? YES : NO; // Nothing more to read via socket (end of file) - BOOL waiting = !done && !error && !socketEOF && !hasBytesAvailable; // Ran out of data, waiting for more - - if (!done && !error && !socketEOF && hasBytesAvailable) - { - NSAssert(([preBuffer availableBytes] == 0), @"Invalid logic"); - - BOOL readIntoPreBuffer = NO; - uint8_t *buffer = NULL; - size_t bytesRead = 0; - - if (flags & kSocketSecure) - { - if ([self usingCFStreamForTLS]) - { - #if TARGET_OS_IPHONE - - // Using CFStream, rather than SecureTransport, for TLS - - NSUInteger defaultReadLength = (1024 * 32); - - NSUInteger bytesToRead = [currentRead optimalReadLengthWithDefault:defaultReadLength - shouldPreBuffer:&readIntoPreBuffer]; - - // Make sure we have enough room in the buffer for our read. - // - // We are either reading directly into the currentRead->buffer, - // or we're reading into the temporary preBuffer. - - if (readIntoPreBuffer) - { - [preBuffer ensureCapacityForWrite:bytesToRead]; - - buffer = [preBuffer writeBuffer]; - } - else - { - [currentRead ensureCapacityForAdditionalDataOfLength:bytesToRead]; - - buffer = (uint8_t *)[currentRead->buffer mutableBytes] - + currentRead->startOffset - + currentRead->bytesDone; - } - - // Read data into buffer - - CFIndex result = CFReadStreamRead(readStream, buffer, (CFIndex)bytesToRead); - LogVerbose(@"CFReadStreamRead(): result = %i", (int)result); - - if (result < 0) - { - error = (__bridge_transfer NSError *)CFReadStreamCopyError(readStream); - } - else if (result == 0) - { - socketEOF = YES; - } - else - { - waiting = YES; - bytesRead = (size_t)result; - } - - // We only know how many decrypted bytes were read. - // The actual number of bytes read was likely more due to the overhead of the encryption. - // So we reset our flag, and rely on the next callback to alert us of more data. - flags &= ~kSecureSocketHasBytesAvailable; - - #endif - } - else - { - // Using SecureTransport for TLS - // - // We know: - // - how many bytes are available on the socket - // - how many encrypted bytes are sitting in the sslPreBuffer - // - how many decypted bytes are sitting in the sslContext - // - // But we do NOT know: - // - how many encypted bytes are sitting in the sslContext - // - // So we play the regular game of using an upper bound instead. - - NSUInteger defaultReadLength = (1024 * 32); - - if (defaultReadLength < estimatedBytesAvailable) { - defaultReadLength = estimatedBytesAvailable + (1024 * 16); - } - - NSUInteger bytesToRead = [currentRead optimalReadLengthWithDefault:defaultReadLength - shouldPreBuffer:&readIntoPreBuffer]; - - if (bytesToRead > SIZE_MAX) { // NSUInteger may be bigger than size_t - bytesToRead = SIZE_MAX; - } - - // Make sure we have enough room in the buffer for our read. - // - // We are either reading directly into the currentRead->buffer, - // or we're reading into the temporary preBuffer. - - if (readIntoPreBuffer) - { - [preBuffer ensureCapacityForWrite:bytesToRead]; - - buffer = [preBuffer writeBuffer]; - } - else - { - [currentRead ensureCapacityForAdditionalDataOfLength:bytesToRead]; - - buffer = (uint8_t *)[currentRead->buffer mutableBytes] - + currentRead->startOffset - + currentRead->bytesDone; - } - - // The documentation from Apple states: - // - // "a read operation might return errSSLWouldBlock, - // indicating that less data than requested was actually transferred" - // - // However, starting around 10.7, the function will sometimes return noErr, - // even if it didn't read as much data as requested. So we need to watch out for that. - - OSStatus result; - do - { - void *loop_buffer = buffer + bytesRead; - size_t loop_bytesToRead = (size_t)bytesToRead - bytesRead; - size_t loop_bytesRead = 0; - - result = SSLRead(sslContext, loop_buffer, loop_bytesToRead, &loop_bytesRead); - LogVerbose(@"read from secure socket = %u", (unsigned)loop_bytesRead); - - bytesRead += loop_bytesRead; - - } while ((result == noErr) && (bytesRead < bytesToRead)); - - - if (result != noErr) - { - if (result == errSSLWouldBlock) - waiting = YES; - else - { - if (result == errSSLClosedGraceful || result == errSSLClosedAbort) - { - // We've reached the end of the stream. - // Handle this the same way we would an EOF from the socket. - socketEOF = YES; - sslErrCode = result; - } - else - { - error = [self sslError:result]; - } - } - // It's possible that bytesRead > 0, even if the result was errSSLWouldBlock. - // This happens when the SSLRead function is able to read some data, - // but not the entire amount we requested. - - if (bytesRead <= 0) - { - bytesRead = 0; - } - } - - // Do not modify socketFDBytesAvailable. - // It will be updated via the SSLReadFunction(). - } - } - else - { - // Normal socket operation - - NSUInteger bytesToRead; - - // There are 3 types of read packets: - // - // 1) Read all available data. - // 2) Read a specific length of data. - // 3) Read up to a particular terminator. - - if (currentRead->term != nil) - { - // Read type #3 - read up to a terminator - - bytesToRead = [currentRead readLengthForTermWithHint:estimatedBytesAvailable - shouldPreBuffer:&readIntoPreBuffer]; - } - else - { - // Read type #1 or #2 - - bytesToRead = [currentRead readLengthForNonTermWithHint:estimatedBytesAvailable]; - } - - if (bytesToRead > SIZE_MAX) { // NSUInteger may be bigger than size_t (read param 3) - bytesToRead = SIZE_MAX; - } - - // Make sure we have enough room in the buffer for our read. - // - // We are either reading directly into the currentRead->buffer, - // or we're reading into the temporary preBuffer. - - if (readIntoPreBuffer) - { - [preBuffer ensureCapacityForWrite:bytesToRead]; - - buffer = [preBuffer writeBuffer]; - } - else - { - [currentRead ensureCapacityForAdditionalDataOfLength:bytesToRead]; - - buffer = (uint8_t *)[currentRead->buffer mutableBytes] - + currentRead->startOffset - + currentRead->bytesDone; - } - - // Read data into buffer - - int socketFD = (socket4FD != SOCKET_NULL) ? socket4FD : (socket6FD != SOCKET_NULL) ? socket6FD : socketUN; - - ssize_t result = read(socketFD, buffer, (size_t)bytesToRead); - LogVerbose(@"read from socket = %i", (int)result); - - if (result < 0) - { - if (errno == EWOULDBLOCK) - waiting = YES; - else - error = [self errorWithErrno:errno reason:@"Error in read() function"]; - - socketFDBytesAvailable = 0; - } - else if (result == 0) - { - socketEOF = YES; - socketFDBytesAvailable = 0; - } - else - { - bytesRead = result; - - if (bytesRead < bytesToRead) - { - // The read returned less data than requested. - // This means socketFDBytesAvailable was a bit off due to timing, - // because we read from the socket right when the readSource event was firing. - socketFDBytesAvailable = 0; - } - else - { - if (socketFDBytesAvailable <= bytesRead) - socketFDBytesAvailable = 0; - else - socketFDBytesAvailable -= bytesRead; - } - - if (socketFDBytesAvailable == 0) - { - waiting = YES; - } - } - } - - if (bytesRead > 0) - { - // Check to see if the read operation is done - - if (currentRead->readLength > 0) - { - // Read type #2 - read a specific length of data - // - // Note: We should never be using a prebuffer when we're reading a specific length of data. - - NSAssert(readIntoPreBuffer == NO, @"Invalid logic"); - - currentRead->bytesDone += bytesRead; - totalBytesReadForCurrentRead += bytesRead; - - done = (currentRead->bytesDone == currentRead->readLength); - } - else if (currentRead->term != nil) - { - // Read type #3 - read up to a terminator - - if (readIntoPreBuffer) - { - // We just read a big chunk of data into the preBuffer - - [preBuffer didWrite:bytesRead]; - LogVerbose(@"read data into preBuffer - preBuffer.length = %zu", [preBuffer availableBytes]); - - // Search for the terminating sequence - - NSUInteger bytesToCopy = [currentRead readLengthForTermWithPreBuffer:preBuffer found:&done]; - LogVerbose(@"copying %lu bytes from preBuffer", (unsigned long)bytesToCopy); - - // Ensure there's room on the read packet's buffer - - [currentRead ensureCapacityForAdditionalDataOfLength:bytesToCopy]; - - // Copy bytes from prebuffer into read buffer - - uint8_t *readBuf = (uint8_t *)[currentRead->buffer mutableBytes] + currentRead->startOffset - + currentRead->bytesDone; - - memcpy(readBuf, [preBuffer readBuffer], bytesToCopy); - - // Remove the copied bytes from the prebuffer - [preBuffer didRead:bytesToCopy]; - LogVerbose(@"preBuffer.length = %zu", [preBuffer availableBytes]); - - // Update totals - currentRead->bytesDone += bytesToCopy; - totalBytesReadForCurrentRead += bytesToCopy; - - // Our 'done' variable was updated via the readLengthForTermWithPreBuffer:found: method above - } - else - { - // We just read a big chunk of data directly into the packet's buffer. - // We need to move any overflow into the prebuffer. - - NSInteger overflow = [currentRead searchForTermAfterPreBuffering:bytesRead]; - - if (overflow == 0) - { - // Perfect match! - // Every byte we read stays in the read buffer, - // and the last byte we read was the last byte of the term. - - currentRead->bytesDone += bytesRead; - totalBytesReadForCurrentRead += bytesRead; - done = YES; - } - else if (overflow > 0) - { - // The term was found within the data that we read, - // and there are extra bytes that extend past the end of the term. - // We need to move these excess bytes out of the read packet and into the prebuffer. - - NSInteger underflow = bytesRead - overflow; - - // Copy excess data into preBuffer - - LogVerbose(@"copying %ld overflow bytes into preBuffer", (long)overflow); - [preBuffer ensureCapacityForWrite:overflow]; - - uint8_t *overflowBuffer = buffer + underflow; - memcpy([preBuffer writeBuffer], overflowBuffer, overflow); - - [preBuffer didWrite:overflow]; - LogVerbose(@"preBuffer.length = %zu", [preBuffer availableBytes]); - - // Note: The completeCurrentRead method will trim the buffer for us. - - currentRead->bytesDone += underflow; - totalBytesReadForCurrentRead += underflow; - done = YES; - } - else - { - // The term was not found within the data that we read. - - currentRead->bytesDone += bytesRead; - totalBytesReadForCurrentRead += bytesRead; - done = NO; - } - } - - if (!done && currentRead->maxLength > 0) - { - // We're not done and there's a set maxLength. - // Have we reached that maxLength yet? - - if (currentRead->bytesDone >= currentRead->maxLength) - { - error = [self readMaxedOutError]; - } - } - } - else - { - // Read type #1 - read all available data - - if (readIntoPreBuffer) - { - // We just read a chunk of data into the preBuffer - - [preBuffer didWrite:bytesRead]; - - // Now copy the data into the read packet. - // - // Recall that we didn't read directly into the packet's buffer to avoid - // over-allocating memory since we had no clue how much data was available to be read. - // - // Ensure there's room on the read packet's buffer - - [currentRead ensureCapacityForAdditionalDataOfLength:bytesRead]; - - // Copy bytes from prebuffer into read buffer - - uint8_t *readBuf = (uint8_t *)[currentRead->buffer mutableBytes] + currentRead->startOffset - + currentRead->bytesDone; - - memcpy(readBuf, [preBuffer readBuffer], bytesRead); - - // Remove the copied bytes from the prebuffer - [preBuffer didRead:bytesRead]; - - // Update totals - currentRead->bytesDone += bytesRead; - totalBytesReadForCurrentRead += bytesRead; - } - else - { - currentRead->bytesDone += bytesRead; - totalBytesReadForCurrentRead += bytesRead; - } - - done = YES; - } - - } // if (bytesRead > 0) - - } // if (!done && !error && !socketEOF && hasBytesAvailable) - - - if (!done && currentRead->readLength == 0 && currentRead->term == nil) - { - // Read type #1 - read all available data - // - // We might arrive here if we read data from the prebuffer but not from the socket. - - done = (totalBytesReadForCurrentRead > 0); - } - - // Check to see if we're done, or if we've made progress - - if (done) - { - [self completeCurrentRead]; - - if (!error && (!socketEOF || [preBuffer availableBytes] > 0)) - { - [self maybeDequeueRead]; - } - } - else if (totalBytesReadForCurrentRead > 0) - { - // We're not done read type #2 or #3 yet, but we have read in some bytes - // - // We ensure that `waiting` is set in order to resume the readSource (if it is suspended). It is - // possible to reach this point and `waiting` not be set, if the current read's length is - // sufficiently large. In that case, we may have read to some upperbound successfully, but - // that upperbound could be smaller than the desired length. - waiting = YES; - - __strong id theDelegate = delegate; - - if (delegateQueue && [theDelegate respondsToSelector:@selector(socket:didReadPartialDataOfLength:tag:)]) - { - long theReadTag = currentRead->tag; - - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - [theDelegate socket:self didReadPartialDataOfLength:totalBytesReadForCurrentRead tag:theReadTag]; - }}); - } - } - - // Check for errors - - if (error) - { - [self closeWithError:error]; - } - else if (socketEOF) - { - [self doReadEOF]; - } - else if (waiting) - { - if (![self usingCFStreamForTLS]) - { - // Monitor the socket for readability (if we're not already doing so) - [self resumeReadSource]; - } - } - - // Do not add any code here without first adding return statements in the error cases above. -} - -- (void)doReadEOF -{ - LogTrace(); - - // This method may be called more than once. - // If the EOF is read while there is still data in the preBuffer, - // then this method may be called continually after invocations of doReadData to see if it's time to disconnect. - - flags |= kSocketHasReadEOF; - - if (flags & kSocketSecure) - { - // If the SSL layer has any buffered data, flush it into the preBuffer now. - - [self flushSSLBuffers]; - } - - BOOL shouldDisconnect = NO; - NSError *error = nil; - - if ((flags & kStartingReadTLS) || (flags & kStartingWriteTLS)) - { - // We received an EOF during or prior to startTLS. - // The SSL/TLS handshake is now impossible, so this is an unrecoverable situation. - - shouldDisconnect = YES; - - if ([self usingSecureTransportForTLS]) - { - error = [self sslError:errSSLClosedAbort]; - } - } - else if (flags & kReadStreamClosed) - { - // The preBuffer has already been drained. - // The config allows half-duplex connections. - // We've previously checked the socket, and it appeared writeable. - // So we marked the read stream as closed and notified the delegate. - // - // As per the half-duplex contract, the socket will be closed when a write fails, - // or when the socket is manually closed. - - shouldDisconnect = NO; - } - else if ([preBuffer availableBytes] > 0) - { - LogVerbose(@"Socket reached EOF, but there is still data available in prebuffer"); - - // Although we won't be able to read any more data from the socket, - // there is existing data that has been prebuffered that we can read. - - shouldDisconnect = NO; - } - else if (config & kAllowHalfDuplexConnection) - { - // We just received an EOF (end of file) from the socket's read stream. - // This means the remote end of the socket (the peer we're connected to) - // has explicitly stated that it will not be sending us any more data. - // - // Query the socket to see if it is still writeable. (Perhaps the peer will continue reading data from us) - - int socketFD = (socket4FD != SOCKET_NULL) ? socket4FD : (socket6FD != SOCKET_NULL) ? socket6FD : socketUN; - - struct pollfd pfd[1]; - pfd[0].fd = socketFD; - pfd[0].events = POLLOUT; - pfd[0].revents = 0; - - poll(pfd, 1, 0); - - if (pfd[0].revents & POLLOUT) - { - // Socket appears to still be writeable - - shouldDisconnect = NO; - flags |= kReadStreamClosed; - - // Notify the delegate that we're going half-duplex - - __strong id theDelegate = delegate; - - if (delegateQueue && [theDelegate respondsToSelector:@selector(socketDidCloseReadStream:)]) - { - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - [theDelegate socketDidCloseReadStream:self]; - }}); - } - } - else - { - shouldDisconnect = YES; - } - } - else - { - shouldDisconnect = YES; - } - - - if (shouldDisconnect) - { - if (error == nil) - { - if ([self usingSecureTransportForTLS]) - { - if (sslErrCode != noErr && sslErrCode != errSSLClosedGraceful) - { - error = [self sslError:sslErrCode]; - } - else - { - error = [self connectionClosedError]; - } - } - else - { - error = [self connectionClosedError]; - } - } - [self closeWithError:error]; - } - else - { - if (![self usingCFStreamForTLS]) - { - // Suspend the read source (if needed) - - [self suspendReadSource]; - } - } -} - -- (void)completeCurrentRead -{ - LogTrace(); - - NSAssert(currentRead, @"Trying to complete current read when there is no current read."); - - - NSData *result = nil; - - if (currentRead->bufferOwner) - { - // We created the buffer on behalf of the user. - // Trim our buffer to be the proper size. - [currentRead->buffer setLength:currentRead->bytesDone]; - - result = currentRead->buffer; - } - else - { - // We did NOT create the buffer. - // The buffer is owned by the caller. - // Only trim the buffer if we had to increase its size. - - if ([currentRead->buffer length] > currentRead->originalBufferLength) - { - NSUInteger readSize = currentRead->startOffset + currentRead->bytesDone; - NSUInteger origSize = currentRead->originalBufferLength; - - NSUInteger buffSize = MAX(readSize, origSize); - - [currentRead->buffer setLength:buffSize]; - } - - uint8_t *buffer = (uint8_t *)[currentRead->buffer mutableBytes] + currentRead->startOffset; - - result = [NSData dataWithBytesNoCopy:buffer length:currentRead->bytesDone freeWhenDone:NO]; - } - - __strong id theDelegate = delegate; - - if (delegateQueue && [theDelegate respondsToSelector:@selector(socket:didReadData:withTag:)]) - { - GCDAsyncReadPacket *theRead = currentRead; // Ensure currentRead retained since result may not own buffer - - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - [theDelegate socket:self didReadData:result withTag:theRead->tag]; - }}); - } - - [self endCurrentRead]; -} - -- (void)endCurrentRead -{ - if (readTimer) - { - dispatch_source_cancel(readTimer); - readTimer = NULL; - } - - currentRead = nil; -} - -- (void)setupReadTimerWithTimeout:(NSTimeInterval)timeout -{ - if (timeout >= 0.0) - { - readTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, socketQueue); - - __weak GCDAsyncSocket *weakSelf = self; - - dispatch_source_set_event_handler(readTimer, ^{ @autoreleasepool { - #pragma clang diagnostic push - #pragma clang diagnostic warning "-Wimplicit-retain-self" - - __strong GCDAsyncSocket *strongSelf = weakSelf; - if (strongSelf == nil) return_from_block; - - [strongSelf doReadTimeout]; - - #pragma clang diagnostic pop - }}); - - #if !OS_OBJECT_USE_OBJC - dispatch_source_t theReadTimer = readTimer; - dispatch_source_set_cancel_handler(readTimer, ^{ - #pragma clang diagnostic push - #pragma clang diagnostic warning "-Wimplicit-retain-self" - - LogVerbose(@"dispatch_release(readTimer)"); - dispatch_release(theReadTimer); - - #pragma clang diagnostic pop - }); - #endif - - dispatch_time_t tt = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeout * NSEC_PER_SEC)); - - dispatch_source_set_timer(readTimer, tt, DISPATCH_TIME_FOREVER, 0); - dispatch_resume(readTimer); - } -} - -- (void)doReadTimeout -{ - // This is a little bit tricky. - // Ideally we'd like to synchronously query the delegate about a timeout extension. - // But if we do so synchronously we risk a possible deadlock. - // So instead we have to do so asynchronously, and callback to ourselves from within the delegate block. - - flags |= kReadsPaused; - - __strong id theDelegate = delegate; - - if (delegateQueue && [theDelegate respondsToSelector:@selector(socket:shouldTimeoutReadWithTag:elapsed:bytesDone:)]) - { - GCDAsyncReadPacket *theRead = currentRead; - - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - NSTimeInterval timeoutExtension = 0.0; - - timeoutExtension = [theDelegate socket:self shouldTimeoutReadWithTag:theRead->tag - elapsed:theRead->timeout - bytesDone:theRead->bytesDone]; - - dispatch_async(self->socketQueue, ^{ @autoreleasepool { - - [self doReadTimeoutWithExtension:timeoutExtension]; - }}); - }}); - } - else - { - [self doReadTimeoutWithExtension:0.0]; - } -} - -- (void)doReadTimeoutWithExtension:(NSTimeInterval)timeoutExtension -{ - if (currentRead) - { - if (timeoutExtension > 0.0) - { - currentRead->timeout += timeoutExtension; - - // Reschedule the timer - dispatch_time_t tt = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeoutExtension * NSEC_PER_SEC)); - dispatch_source_set_timer(readTimer, tt, DISPATCH_TIME_FOREVER, 0); - - // Unpause reads, and continue - flags &= ~kReadsPaused; - [self doReadData]; - } - else - { - LogVerbose(@"ReadTimeout"); - - [self closeWithError:[self readTimeoutError]]; - } - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Writing -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)writeData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag -{ - if ([data length] == 0) return; - - GCDAsyncWritePacket *packet = [[GCDAsyncWritePacket alloc] initWithData:data timeout:timeout tag:tag]; - - dispatch_async(socketQueue, ^{ @autoreleasepool { - - LogTrace(); - - if ((self->flags & kSocketStarted) && !(self->flags & kForbidReadsWrites)) - { - [self->writeQueue addObject:packet]; - [self maybeDequeueWrite]; - } - }}); - - // Do not rely on the block being run in order to release the packet, - // as the queue might get released without the block completing. -} - -- (float)progressOfWriteReturningTag:(long *)tagPtr bytesDone:(NSUInteger *)donePtr total:(NSUInteger *)totalPtr -{ - __block float result = 0.0F; - - dispatch_block_t block = ^{ - - if (!self->currentWrite || ![self->currentWrite isKindOfClass:[GCDAsyncWritePacket class]]) - { - // We're not writing anything right now. - - if (tagPtr != NULL) *tagPtr = 0; - if (donePtr != NULL) *donePtr = 0; - if (totalPtr != NULL) *totalPtr = 0; - - result = NAN; - } - else - { - NSUInteger done = self->currentWrite->bytesDone; - NSUInteger total = [self->currentWrite->buffer length]; - - if (tagPtr != NULL) *tagPtr = self->currentWrite->tag; - if (donePtr != NULL) *donePtr = done; - if (totalPtr != NULL) *totalPtr = total; - - result = (float)done / (float)total; - } - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -/** - * Conditionally starts a new write. - * - * It is called when: - * - a user requests a write - * - after a write request has finished (to handle the next request) - * - immediately after the socket opens to handle any pending requests - * - * This method also handles auto-disconnect post read/write completion. -**/ -- (void)maybeDequeueWrite -{ - LogTrace(); - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - - // If we're not currently processing a write AND we have an available write stream - if ((currentWrite == nil) && (flags & kConnected)) - { - if ([writeQueue count] > 0) - { - // Dequeue the next object in the write queue - currentWrite = [writeQueue objectAtIndex:0]; - [writeQueue removeObjectAtIndex:0]; - - - if ([currentWrite isKindOfClass:[GCDAsyncSpecialPacket class]]) - { - LogVerbose(@"Dequeued GCDAsyncSpecialPacket"); - - // Attempt to start TLS - flags |= kStartingWriteTLS; - - // This method won't do anything unless both kStartingReadTLS and kStartingWriteTLS are set - [self maybeStartTLS]; - } - else - { - LogVerbose(@"Dequeued GCDAsyncWritePacket"); - - // Setup write timer (if needed) - [self setupWriteTimerWithTimeout:currentWrite->timeout]; - - // Immediately write, if possible - [self doWriteData]; - } - } - else if (flags & kDisconnectAfterWrites) - { - if (flags & kDisconnectAfterReads) - { - if (([readQueue count] == 0) && (currentRead == nil)) - { - [self closeWithError:nil]; - } - } - else - { - [self closeWithError:nil]; - } - } - } -} - -- (void)doWriteData -{ - LogTrace(); - - // This method is called by the writeSource via the socketQueue - - if ((currentWrite == nil) || (flags & kWritesPaused)) - { - LogVerbose(@"No currentWrite or kWritesPaused"); - - // Unable to write at this time - - if ([self usingCFStreamForTLS]) - { - // CFWriteStream only fires once when there is available data. - // It won't fire again until we've invoked CFWriteStreamWrite. - } - else - { - // If the writeSource is firing, we need to pause it - // or else it will continue to fire over and over again. - - if (flags & kSocketCanAcceptBytes) - { - [self suspendWriteSource]; - } - } - return; - } - - if (!(flags & kSocketCanAcceptBytes)) - { - LogVerbose(@"No space available to write..."); - - // No space available to write. - - if (![self usingCFStreamForTLS]) - { - // Need to wait for writeSource to fire and notify us of - // available space in the socket's internal write buffer. - - [self resumeWriteSource]; - } - return; - } - - if (flags & kStartingWriteTLS) - { - LogVerbose(@"Waiting for SSL/TLS handshake to complete"); - - // The writeQueue is waiting for SSL/TLS handshake to complete. - - if (flags & kStartingReadTLS) - { - if ([self usingSecureTransportForTLS] && lastSSLHandshakeError == errSSLWouldBlock) - { - // We are in the process of a SSL Handshake. - // We were waiting for available space in the socket's internal OS buffer to continue writing. - - [self ssl_continueSSLHandshake]; - } - } - else - { - // We are still waiting for the readQueue to drain and start the SSL/TLS process. - // We now know we can write to the socket. - - if (![self usingCFStreamForTLS]) - { - // Suspend the write source or else it will continue to fire nonstop. - - [self suspendWriteSource]; - } - } - - return; - } - - // Note: This method is not called if currentWrite is a GCDAsyncSpecialPacket (startTLS packet) - - BOOL waiting = NO; - NSError *error = nil; - size_t bytesWritten = 0; - - if (flags & kSocketSecure) - { - if ([self usingCFStreamForTLS]) - { - #if TARGET_OS_IPHONE - - // - // Writing data using CFStream (over internal TLS) - // - - const uint8_t *buffer = (const uint8_t *)[currentWrite->buffer bytes] + currentWrite->bytesDone; - - NSUInteger bytesToWrite = [currentWrite->buffer length] - currentWrite->bytesDone; - - if (bytesToWrite > SIZE_MAX) // NSUInteger may be bigger than size_t (write param 3) - { - bytesToWrite = SIZE_MAX; - } - - CFIndex result = CFWriteStreamWrite(writeStream, buffer, (CFIndex)bytesToWrite); - LogVerbose(@"CFWriteStreamWrite(%lu) = %li", (unsigned long)bytesToWrite, result); - - if (result < 0) - { - error = (__bridge_transfer NSError *)CFWriteStreamCopyError(writeStream); - } - else - { - bytesWritten = (size_t)result; - - // We always set waiting to true in this scenario. - // CFStream may have altered our underlying socket to non-blocking. - // Thus if we attempt to write without a callback, we may end up blocking our queue. - waiting = YES; - } - - #endif - } - else - { - // We're going to use the SSLWrite function. - // - // OSStatus SSLWrite(SSLContextRef context, const void *data, size_t dataLength, size_t *processed) - // - // Parameters: - // context - An SSL session context reference. - // data - A pointer to the buffer of data to write. - // dataLength - The amount, in bytes, of data to write. - // processed - On return, the length, in bytes, of the data actually written. - // - // It sounds pretty straight-forward, - // but there are a few caveats you should be aware of. - // - // The SSLWrite method operates in a non-obvious (and rather annoying) manner. - // According to the documentation: - // - // Because you may configure the underlying connection to operate in a non-blocking manner, - // a write operation might return errSSLWouldBlock, indicating that less data than requested - // was actually transferred. In this case, you should repeat the call to SSLWrite until some - // other result is returned. - // - // This sounds perfect, but when our SSLWriteFunction returns errSSLWouldBlock, - // then the SSLWrite method returns (with the proper errSSLWouldBlock return value), - // but it sets processed to dataLength !! - // - // In other words, if the SSLWrite function doesn't completely write all the data we tell it to, - // then it doesn't tell us how many bytes were actually written. So, for example, if we tell it to - // write 256 bytes then it might actually write 128 bytes, but then report 0 bytes written. - // - // You might be wondering: - // If the SSLWrite function doesn't tell us how many bytes were written, - // then how in the world are we supposed to update our parameters (buffer & bytesToWrite) - // for the next time we invoke SSLWrite? - // - // The answer is that SSLWrite cached all the data we told it to write, - // and it will push out that data next time we call SSLWrite. - // If we call SSLWrite with new data, it will push out the cached data first, and then the new data. - // If we call SSLWrite with empty data, then it will simply push out the cached data. - // - // For this purpose we're going to break large writes into a series of smaller writes. - // This allows us to report progress back to the delegate. - - OSStatus result; - - BOOL hasCachedDataToWrite = (sslWriteCachedLength > 0); - BOOL hasNewDataToWrite = YES; - - if (hasCachedDataToWrite) - { - size_t processed = 0; - - result = SSLWrite(sslContext, NULL, 0, &processed); - - if (result == noErr) - { - bytesWritten = sslWriteCachedLength; - sslWriteCachedLength = 0; - - if ([currentWrite->buffer length] == (currentWrite->bytesDone + bytesWritten)) - { - // We've written all data for the current write. - hasNewDataToWrite = NO; - } - } - else - { - if (result == errSSLWouldBlock) - { - waiting = YES; - } - else - { - error = [self sslError:result]; - } - - // Can't write any new data since we were unable to write the cached data. - hasNewDataToWrite = NO; - } - } - - if (hasNewDataToWrite) - { - const uint8_t *buffer = (const uint8_t *)[currentWrite->buffer bytes] - + currentWrite->bytesDone - + bytesWritten; - - NSUInteger bytesToWrite = [currentWrite->buffer length] - currentWrite->bytesDone - bytesWritten; - - if (bytesToWrite > SIZE_MAX) // NSUInteger may be bigger than size_t (write param 3) - { - bytesToWrite = SIZE_MAX; - } - - size_t bytesRemaining = bytesToWrite; - - BOOL keepLooping = YES; - while (keepLooping) - { - const size_t sslMaxBytesToWrite = 32768; - size_t sslBytesToWrite = MIN(bytesRemaining, sslMaxBytesToWrite); - size_t sslBytesWritten = 0; - - result = SSLWrite(sslContext, buffer, sslBytesToWrite, &sslBytesWritten); - - if (result == noErr) - { - buffer += sslBytesWritten; - bytesWritten += sslBytesWritten; - bytesRemaining -= sslBytesWritten; - - keepLooping = (bytesRemaining > 0); - } - else - { - if (result == errSSLWouldBlock) - { - waiting = YES; - sslWriteCachedLength = sslBytesToWrite; - } - else - { - error = [self sslError:result]; - } - - keepLooping = NO; - } - - } // while (keepLooping) - - } // if (hasNewDataToWrite) - } - } - else - { - // - // Writing data directly over raw socket - // - - int socketFD = (socket4FD != SOCKET_NULL) ? socket4FD : (socket6FD != SOCKET_NULL) ? socket6FD : socketUN; - - const uint8_t *buffer = (const uint8_t *)[currentWrite->buffer bytes] + currentWrite->bytesDone; - - NSUInteger bytesToWrite = [currentWrite->buffer length] - currentWrite->bytesDone; - - if (bytesToWrite > SIZE_MAX) // NSUInteger may be bigger than size_t (write param 3) - { - bytesToWrite = SIZE_MAX; - } - - ssize_t result = write(socketFD, buffer, (size_t)bytesToWrite); - LogVerbose(@"wrote to socket = %zd", result); - - // Check results - if (result < 0) - { - if (errno == EWOULDBLOCK) - { - waiting = YES; - } - else - { - error = [self errorWithErrno:errno reason:@"Error in write() function"]; - } - } - else - { - bytesWritten = result; - } - } - - // We're done with our writing. - // If we explictly ran into a situation where the socket told us there was no room in the buffer, - // then we immediately resume listening for notifications. - // - // We must do this before we dequeue another write, - // as that may in turn invoke this method again. - // - // Note that if CFStream is involved, it may have maliciously put our socket in blocking mode. - - if (waiting) - { - flags &= ~kSocketCanAcceptBytes; - - if (![self usingCFStreamForTLS]) - { - [self resumeWriteSource]; - } - } - - // Check our results - - BOOL done = NO; - - if (bytesWritten > 0) - { - // Update total amount read for the current write - currentWrite->bytesDone += bytesWritten; - LogVerbose(@"currentWrite->bytesDone = %lu", (unsigned long)currentWrite->bytesDone); - - // Is packet done? - done = (currentWrite->bytesDone == [currentWrite->buffer length]); - } - - if (done) - { - [self completeCurrentWrite]; - - if (!error) - { - dispatch_async(socketQueue, ^{ @autoreleasepool{ - - [self maybeDequeueWrite]; - }}); - } - } - else - { - // We were unable to finish writing the data, - // so we're waiting for another callback to notify us of available space in the lower-level output buffer. - - if (!waiting && !error) - { - // This would be the case if our write was able to accept some data, but not all of it. - - flags &= ~kSocketCanAcceptBytes; - - if (![self usingCFStreamForTLS]) - { - [self resumeWriteSource]; - } - } - - if (bytesWritten > 0) - { - // We're not done with the entire write, but we have written some bytes - - __strong id theDelegate = delegate; - - if (delegateQueue && [theDelegate respondsToSelector:@selector(socket:didWritePartialDataOfLength:tag:)]) - { - long theWriteTag = currentWrite->tag; - - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - [theDelegate socket:self didWritePartialDataOfLength:bytesWritten tag:theWriteTag]; - }}); - } - } - } - - // Check for errors - - if (error) - { - [self closeWithError:[self errorWithErrno:errno reason:@"Error in write() function"]]; - } - - // Do not add any code here without first adding a return statement in the error case above. -} - -- (void)completeCurrentWrite -{ - LogTrace(); - - NSAssert(currentWrite, @"Trying to complete current write when there is no current write."); - - - __strong id theDelegate = delegate; - - if (delegateQueue && [theDelegate respondsToSelector:@selector(socket:didWriteDataWithTag:)]) - { - long theWriteTag = currentWrite->tag; - - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - [theDelegate socket:self didWriteDataWithTag:theWriteTag]; - }}); - } - - [self endCurrentWrite]; -} - -- (void)endCurrentWrite -{ - if (writeTimer) - { - dispatch_source_cancel(writeTimer); - writeTimer = NULL; - } - - currentWrite = nil; -} - -- (void)setupWriteTimerWithTimeout:(NSTimeInterval)timeout -{ - if (timeout >= 0.0) - { - writeTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, socketQueue); - - __weak GCDAsyncSocket *weakSelf = self; - - dispatch_source_set_event_handler(writeTimer, ^{ @autoreleasepool { - #pragma clang diagnostic push - #pragma clang diagnostic warning "-Wimplicit-retain-self" - - __strong GCDAsyncSocket *strongSelf = weakSelf; - if (strongSelf == nil) return_from_block; - - [strongSelf doWriteTimeout]; - - #pragma clang diagnostic pop - }}); - - #if !OS_OBJECT_USE_OBJC - dispatch_source_t theWriteTimer = writeTimer; - dispatch_source_set_cancel_handler(writeTimer, ^{ - #pragma clang diagnostic push - #pragma clang diagnostic warning "-Wimplicit-retain-self" - - LogVerbose(@"dispatch_release(writeTimer)"); - dispatch_release(theWriteTimer); - - #pragma clang diagnostic pop - }); - #endif - - dispatch_time_t tt = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeout * NSEC_PER_SEC)); - - dispatch_source_set_timer(writeTimer, tt, DISPATCH_TIME_FOREVER, 0); - dispatch_resume(writeTimer); - } -} - -- (void)doWriteTimeout -{ - // This is a little bit tricky. - // Ideally we'd like to synchronously query the delegate about a timeout extension. - // But if we do so synchronously we risk a possible deadlock. - // So instead we have to do so asynchronously, and callback to ourselves from within the delegate block. - - flags |= kWritesPaused; - - __strong id theDelegate = delegate; - - if (delegateQueue && [theDelegate respondsToSelector:@selector(socket:shouldTimeoutWriteWithTag:elapsed:bytesDone:)]) - { - GCDAsyncWritePacket *theWrite = currentWrite; - - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - NSTimeInterval timeoutExtension = 0.0; - - timeoutExtension = [theDelegate socket:self shouldTimeoutWriteWithTag:theWrite->tag - elapsed:theWrite->timeout - bytesDone:theWrite->bytesDone]; - - dispatch_async(self->socketQueue, ^{ @autoreleasepool { - - [self doWriteTimeoutWithExtension:timeoutExtension]; - }}); - }}); - } - else - { - [self doWriteTimeoutWithExtension:0.0]; - } -} - -- (void)doWriteTimeoutWithExtension:(NSTimeInterval)timeoutExtension -{ - if (currentWrite) - { - if (timeoutExtension > 0.0) - { - currentWrite->timeout += timeoutExtension; - - // Reschedule the timer - dispatch_time_t tt = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeoutExtension * NSEC_PER_SEC)); - dispatch_source_set_timer(writeTimer, tt, DISPATCH_TIME_FOREVER, 0); - - // Unpause writes, and continue - flags &= ~kWritesPaused; - [self doWriteData]; - } - else - { - LogVerbose(@"WriteTimeout"); - - [self closeWithError:[self writeTimeoutError]]; - } - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Security -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)startTLS:(NSDictionary *)tlsSettings -{ - LogTrace(); - - if (tlsSettings == nil) - { - // Passing nil/NULL to CFReadStreamSetProperty will appear to work the same as passing an empty dictionary, - // but causes problems if we later try to fetch the remote host's certificate. - // - // To be exact, it causes the following to return NULL instead of the normal result: - // CFReadStreamCopyProperty(readStream, kCFStreamPropertySSLPeerCertificates) - // - // So we use an empty dictionary instead, which works perfectly. - - tlsSettings = [NSDictionary dictionary]; - } - - GCDAsyncSpecialPacket *packet = [[GCDAsyncSpecialPacket alloc] initWithTLSSettings:tlsSettings]; - - dispatch_async(socketQueue, ^{ @autoreleasepool { - - if ((self->flags & kSocketStarted) && !(self->flags & kQueuedTLS) && !(self->flags & kForbidReadsWrites)) - { - [self->readQueue addObject:packet]; - [self->writeQueue addObject:packet]; - - self->flags |= kQueuedTLS; - - [self maybeDequeueRead]; - [self maybeDequeueWrite]; - } - }}); - -} - -- (void)maybeStartTLS -{ - // We can't start TLS until: - // - All queued reads prior to the user calling startTLS are complete - // - All queued writes prior to the user calling startTLS are complete - // - // We'll know these conditions are met when both kStartingReadTLS and kStartingWriteTLS are set - - if ((flags & kStartingReadTLS) && (flags & kStartingWriteTLS)) - { - BOOL useSecureTransport = YES; - - #if TARGET_OS_IPHONE - { - GCDAsyncSpecialPacket *tlsPacket = (GCDAsyncSpecialPacket *)currentRead; - NSDictionary *tlsSettings = @{}; - if (tlsPacket) { - tlsSettings = tlsPacket->tlsSettings; - } - NSNumber *value = [tlsSettings objectForKey:GCDAsyncSocketUseCFStreamForTLS]; - if (value && [value boolValue]) - useSecureTransport = NO; - } - #endif - - if (useSecureTransport) - { - [self ssl_startTLS]; - } - else - { - #if TARGET_OS_IPHONE - [self cf_startTLS]; - #endif - } - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Security via SecureTransport -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (OSStatus)sslReadWithBuffer:(void *)buffer length:(size_t *)bufferLength -{ - LogVerbose(@"sslReadWithBuffer:%p length:%lu", buffer, (unsigned long)*bufferLength); - - if ((socketFDBytesAvailable == 0) && ([sslPreBuffer availableBytes] == 0)) - { - LogVerbose(@"%@ - No data available to read...", THIS_METHOD); - - // No data available to read. - // - // Need to wait for readSource to fire and notify us of - // available data in the socket's internal read buffer. - - [self resumeReadSource]; - - *bufferLength = 0; - return errSSLWouldBlock; - } - - size_t totalBytesRead = 0; - size_t totalBytesLeftToBeRead = *bufferLength; - - BOOL done = NO; - BOOL socketError = NO; - - // - // STEP 1 : READ FROM SSL PRE BUFFER - // - - size_t sslPreBufferLength = [sslPreBuffer availableBytes]; - - if (sslPreBufferLength > 0) - { - LogVerbose(@"%@: Reading from SSL pre buffer...", THIS_METHOD); - - size_t bytesToCopy; - if (sslPreBufferLength > totalBytesLeftToBeRead) - bytesToCopy = totalBytesLeftToBeRead; - else - bytesToCopy = sslPreBufferLength; - - LogVerbose(@"%@: Copying %zu bytes from sslPreBuffer", THIS_METHOD, bytesToCopy); - - memcpy(buffer, [sslPreBuffer readBuffer], bytesToCopy); - [sslPreBuffer didRead:bytesToCopy]; - - LogVerbose(@"%@: sslPreBuffer.length = %zu", THIS_METHOD, [sslPreBuffer availableBytes]); - - totalBytesRead += bytesToCopy; - totalBytesLeftToBeRead -= bytesToCopy; - - done = (totalBytesLeftToBeRead == 0); - - if (done) LogVerbose(@"%@: Complete", THIS_METHOD); - } - - // - // STEP 2 : READ FROM SOCKET - // - - if (!done && (socketFDBytesAvailable > 0)) - { - LogVerbose(@"%@: Reading from socket...", THIS_METHOD); - - int socketFD = (socket4FD != SOCKET_NULL) ? socket4FD : (socket6FD != SOCKET_NULL) ? socket6FD : socketUN; - - BOOL readIntoPreBuffer; - size_t bytesToRead; - uint8_t *buf; - - if (socketFDBytesAvailable > totalBytesLeftToBeRead) - { - // Read all available data from socket into sslPreBuffer. - // Then copy requested amount into dataBuffer. - - LogVerbose(@"%@: Reading into sslPreBuffer...", THIS_METHOD); - - [sslPreBuffer ensureCapacityForWrite:socketFDBytesAvailable]; - - readIntoPreBuffer = YES; - bytesToRead = (size_t)socketFDBytesAvailable; - buf = [sslPreBuffer writeBuffer]; - } - else - { - // Read available data from socket directly into dataBuffer. - - LogVerbose(@"%@: Reading directly into dataBuffer...", THIS_METHOD); - - readIntoPreBuffer = NO; - bytesToRead = totalBytesLeftToBeRead; - buf = (uint8_t *)buffer + totalBytesRead; - } - - ssize_t result = read(socketFD, buf, bytesToRead); - LogVerbose(@"%@: read from socket = %zd", THIS_METHOD, result); - - if (result < 0) - { - LogVerbose(@"%@: read errno = %i", THIS_METHOD, errno); - - if (errno != EWOULDBLOCK) - { - socketError = YES; - } - - socketFDBytesAvailable = 0; - } - else if (result == 0) - { - LogVerbose(@"%@: read EOF", THIS_METHOD); - - socketError = YES; - socketFDBytesAvailable = 0; - } - else - { - size_t bytesReadFromSocket = result; - - if (socketFDBytesAvailable > bytesReadFromSocket) - socketFDBytesAvailable -= bytesReadFromSocket; - else - socketFDBytesAvailable = 0; - - if (readIntoPreBuffer) - { - [sslPreBuffer didWrite:bytesReadFromSocket]; - - size_t bytesToCopy = MIN(totalBytesLeftToBeRead, bytesReadFromSocket); - - LogVerbose(@"%@: Copying %zu bytes out of sslPreBuffer", THIS_METHOD, bytesToCopy); - - memcpy((uint8_t *)buffer + totalBytesRead, [sslPreBuffer readBuffer], bytesToCopy); - [sslPreBuffer didRead:bytesToCopy]; - - totalBytesRead += bytesToCopy; - totalBytesLeftToBeRead -= bytesToCopy; - - LogVerbose(@"%@: sslPreBuffer.length = %zu", THIS_METHOD, [sslPreBuffer availableBytes]); - } - else - { - totalBytesRead += bytesReadFromSocket; - totalBytesLeftToBeRead -= bytesReadFromSocket; - } - - done = (totalBytesLeftToBeRead == 0); - - if (done) LogVerbose(@"%@: Complete", THIS_METHOD); - } - } - - *bufferLength = totalBytesRead; - - if (done) - return noErr; - - if (socketError) - return errSSLClosedAbort; - - return errSSLWouldBlock; -} - -- (OSStatus)sslWriteWithBuffer:(const void *)buffer length:(size_t *)bufferLength -{ - if (!(flags & kSocketCanAcceptBytes)) - { - // Unable to write. - // - // Need to wait for writeSource to fire and notify us of - // available space in the socket's internal write buffer. - - [self resumeWriteSource]; - - *bufferLength = 0; - return errSSLWouldBlock; - } - - size_t bytesToWrite = *bufferLength; - size_t bytesWritten = 0; - - BOOL done = NO; - BOOL socketError = NO; - - int socketFD = (socket4FD != SOCKET_NULL) ? socket4FD : (socket6FD != SOCKET_NULL) ? socket6FD : socketUN; - - ssize_t result = write(socketFD, buffer, bytesToWrite); - - if (result < 0) - { - if (errno != EWOULDBLOCK) - { - socketError = YES; - } - - flags &= ~kSocketCanAcceptBytes; - } - else if (result == 0) - { - flags &= ~kSocketCanAcceptBytes; - } - else - { - bytesWritten = result; - - done = (bytesWritten == bytesToWrite); - } - - *bufferLength = bytesWritten; - - if (done) - return noErr; - - if (socketError) - return errSSLClosedAbort; - - return errSSLWouldBlock; -} - -static OSStatus SSLReadFunction(SSLConnectionRef connection, void *data, size_t *dataLength) -{ - GCDAsyncSocket *asyncSocket = (__bridge GCDAsyncSocket *)connection; - - NSCAssert(dispatch_get_specific(asyncSocket->IsOnSocketQueueOrTargetQueueKey), @"What the deuce?"); - - return [asyncSocket sslReadWithBuffer:data length:dataLength]; -} - -static OSStatus SSLWriteFunction(SSLConnectionRef connection, const void *data, size_t *dataLength) -{ - GCDAsyncSocket *asyncSocket = (__bridge GCDAsyncSocket *)connection; - - NSCAssert(dispatch_get_specific(asyncSocket->IsOnSocketQueueOrTargetQueueKey), @"What the deuce?"); - - return [asyncSocket sslWriteWithBuffer:data length:dataLength]; -} - -- (void)ssl_startTLS -{ - LogTrace(); - - LogVerbose(@"Starting TLS (via SecureTransport)..."); - - OSStatus status; - - GCDAsyncSpecialPacket *tlsPacket = (GCDAsyncSpecialPacket *)currentRead; - if (tlsPacket == nil) // Code to quiet the analyzer - { - NSAssert(NO, @"Logic error"); - - [self closeWithError:[self otherError:@"Logic error"]]; - return; - } - NSDictionary *tlsSettings = tlsPacket->tlsSettings; - - // Create SSLContext, and setup IO callbacks and connection ref - - NSNumber *isServerNumber = [tlsSettings objectForKey:(__bridge NSString *)kCFStreamSSLIsServer]; - BOOL isServer = [isServerNumber boolValue]; - - #if TARGET_OS_IPHONE || (__MAC_OS_X_VERSION_MIN_REQUIRED >= 1080) - { - if (isServer) - sslContext = SSLCreateContext(kCFAllocatorDefault, kSSLServerSide, kSSLStreamType); - else - sslContext = SSLCreateContext(kCFAllocatorDefault, kSSLClientSide, kSSLStreamType); - - if (sslContext == NULL) - { - [self closeWithError:[self otherError:@"Error in SSLCreateContext"]]; - return; - } - } - #else // (__MAC_OS_X_VERSION_MIN_REQUIRED < 1080) - { - status = SSLNewContext(isServer, &sslContext); - if (status != noErr) - { - [self closeWithError:[self otherError:@"Error in SSLNewContext"]]; - return; - } - } - #endif - - status = SSLSetIOFuncs(sslContext, &SSLReadFunction, &SSLWriteFunction); - if (status != noErr) - { - [self closeWithError:[self otherError:@"Error in SSLSetIOFuncs"]]; - return; - } - - status = SSLSetConnection(sslContext, (__bridge SSLConnectionRef)self); - if (status != noErr) - { - [self closeWithError:[self otherError:@"Error in SSLSetConnection"]]; - return; - } - - - NSNumber *shouldManuallyEvaluateTrust = [tlsSettings objectForKey:GCDAsyncSocketManuallyEvaluateTrust]; - if ([shouldManuallyEvaluateTrust boolValue]) - { - if (isServer) - { - [self closeWithError:[self otherError:@"Manual trust validation is not supported for server sockets"]]; - return; - } - - status = SSLSetSessionOption(sslContext, kSSLSessionOptionBreakOnServerAuth, true); - if (status != noErr) - { - [self closeWithError:[self otherError:@"Error in SSLSetSessionOption"]]; - return; - } - - #if !TARGET_OS_IPHONE && (__MAC_OS_X_VERSION_MIN_REQUIRED < 1080) - - // Note from Apple's documentation: - // - // It is only necessary to call SSLSetEnableCertVerify on the Mac prior to OS X 10.8. - // On OS X 10.8 and later setting kSSLSessionOptionBreakOnServerAuth always disables the - // built-in trust evaluation. All versions of iOS behave like OS X 10.8 and thus - // SSLSetEnableCertVerify is not available on that platform at all. - - status = SSLSetEnableCertVerify(sslContext, NO); - if (status != noErr) - { - [self closeWithError:[self otherError:@"Error in SSLSetEnableCertVerify"]]; - return; - } - - #endif - } - - // Configure SSLContext from given settings - // - // Checklist: - // 1. kCFStreamSSLPeerName - // 2. kCFStreamSSLCertificates - // 3. GCDAsyncSocketSSLPeerID - // 4. GCDAsyncSocketSSLProtocolVersionMin - // 5. GCDAsyncSocketSSLProtocolVersionMax - // 6. GCDAsyncSocketSSLSessionOptionFalseStart - // 7. GCDAsyncSocketSSLSessionOptionSendOneByteRecord - // 8. GCDAsyncSocketSSLCipherSuites - // 9. GCDAsyncSocketSSLDiffieHellmanParameters (Mac) - // 10. GCDAsyncSocketSSLALPN - // - // Deprecated (throw error): - // 10. kCFStreamSSLAllowsAnyRoot - // 11. kCFStreamSSLAllowsExpiredRoots - // 12. kCFStreamSSLAllowsExpiredCertificates - // 13. kCFStreamSSLValidatesCertificateChain - // 14. kCFStreamSSLLevel - - NSObject *value; - - // 1. kCFStreamSSLPeerName - - value = [tlsSettings objectForKey:(__bridge NSString *)kCFStreamSSLPeerName]; - if ([value isKindOfClass:[NSString class]]) - { - NSString *peerName = (NSString *)value; - - const char *peer = [peerName UTF8String]; - size_t peerLen = strlen(peer); - - status = SSLSetPeerDomainName(sslContext, peer, peerLen); - if (status != noErr) - { - [self closeWithError:[self otherError:@"Error in SSLSetPeerDomainName"]]; - return; - } - } - else if (value) - { - NSAssert(NO, @"Invalid value for kCFStreamSSLPeerName. Value must be of type NSString."); - - [self closeWithError:[self otherError:@"Invalid value for kCFStreamSSLPeerName."]]; - return; - } - - // 2. kCFStreamSSLCertificates - - value = [tlsSettings objectForKey:(__bridge NSString *)kCFStreamSSLCertificates]; - if ([value isKindOfClass:[NSArray class]]) - { - NSArray *certs = (NSArray *)value; - - status = SSLSetCertificate(sslContext, (__bridge CFArrayRef)certs); - if (status != noErr) - { - [self closeWithError:[self otherError:@"Error in SSLSetCertificate"]]; - return; - } - } - else if (value) - { - NSAssert(NO, @"Invalid value for kCFStreamSSLCertificates. Value must be of type NSArray."); - - [self closeWithError:[self otherError:@"Invalid value for kCFStreamSSLCertificates."]]; - return; - } - - // 3. GCDAsyncSocketSSLPeerID - - value = [tlsSettings objectForKey:GCDAsyncSocketSSLPeerID]; - if ([value isKindOfClass:[NSData class]]) - { - NSData *peerIdData = (NSData *)value; - - status = SSLSetPeerID(sslContext, [peerIdData bytes], [peerIdData length]); - if (status != noErr) - { - [self closeWithError:[self otherError:@"Error in SSLSetPeerID"]]; - return; - } - } - else if (value) - { - NSAssert(NO, @"Invalid value for GCDAsyncSocketSSLPeerID. Value must be of type NSData." - @" (You can convert strings to data using a method like" - @" [string dataUsingEncoding:NSUTF8StringEncoding])"); - - [self closeWithError:[self otherError:@"Invalid value for GCDAsyncSocketSSLPeerID."]]; - return; - } - - // 4. GCDAsyncSocketSSLProtocolVersionMin - - value = [tlsSettings objectForKey:GCDAsyncSocketSSLProtocolVersionMin]; - if ([value isKindOfClass:[NSNumber class]]) - { - SSLProtocol minProtocol = (SSLProtocol)[(NSNumber *)value intValue]; - if (minProtocol != kSSLProtocolUnknown) - { - status = SSLSetProtocolVersionMin(sslContext, minProtocol); - if (status != noErr) - { - [self closeWithError:[self otherError:@"Error in SSLSetProtocolVersionMin"]]; - return; - } - } - } - else if (value) - { - NSAssert(NO, @"Invalid value for GCDAsyncSocketSSLProtocolVersionMin. Value must be of type NSNumber."); - - [self closeWithError:[self otherError:@"Invalid value for GCDAsyncSocketSSLProtocolVersionMin."]]; - return; - } - - // 5. GCDAsyncSocketSSLProtocolVersionMax - - value = [tlsSettings objectForKey:GCDAsyncSocketSSLProtocolVersionMax]; - if ([value isKindOfClass:[NSNumber class]]) - { - SSLProtocol maxProtocol = (SSLProtocol)[(NSNumber *)value intValue]; - if (maxProtocol != kSSLProtocolUnknown) - { - status = SSLSetProtocolVersionMax(sslContext, maxProtocol); - if (status != noErr) - { - [self closeWithError:[self otherError:@"Error in SSLSetProtocolVersionMax"]]; - return; - } - } - } - else if (value) - { - NSAssert(NO, @"Invalid value for GCDAsyncSocketSSLProtocolVersionMax. Value must be of type NSNumber."); - - [self closeWithError:[self otherError:@"Invalid value for GCDAsyncSocketSSLProtocolVersionMax."]]; - return; - } - - // 6. GCDAsyncSocketSSLSessionOptionFalseStart - - value = [tlsSettings objectForKey:GCDAsyncSocketSSLSessionOptionFalseStart]; - if ([value isKindOfClass:[NSNumber class]]) - { - NSNumber *falseStart = (NSNumber *)value; - status = SSLSetSessionOption(sslContext, kSSLSessionOptionFalseStart, [falseStart boolValue]); - if (status != noErr) - { - [self closeWithError:[self otherError:@"Error in SSLSetSessionOption (kSSLSessionOptionFalseStart)"]]; - return; - } - } - else if (value) - { - NSAssert(NO, @"Invalid value for GCDAsyncSocketSSLSessionOptionFalseStart. Value must be of type NSNumber."); - - [self closeWithError:[self otherError:@"Invalid value for GCDAsyncSocketSSLSessionOptionFalseStart."]]; - return; - } - - // 7. GCDAsyncSocketSSLSessionOptionSendOneByteRecord - - value = [tlsSettings objectForKey:GCDAsyncSocketSSLSessionOptionSendOneByteRecord]; - if ([value isKindOfClass:[NSNumber class]]) - { - NSNumber *oneByteRecord = (NSNumber *)value; - status = SSLSetSessionOption(sslContext, kSSLSessionOptionSendOneByteRecord, [oneByteRecord boolValue]); - if (status != noErr) - { - [self closeWithError: - [self otherError:@"Error in SSLSetSessionOption (kSSLSessionOptionSendOneByteRecord)"]]; - return; - } - } - else if (value) - { - NSAssert(NO, @"Invalid value for GCDAsyncSocketSSLSessionOptionSendOneByteRecord." - @" Value must be of type NSNumber."); - - [self closeWithError:[self otherError:@"Invalid value for GCDAsyncSocketSSLSessionOptionSendOneByteRecord."]]; - return; - } - - // 8. GCDAsyncSocketSSLCipherSuites - - value = [tlsSettings objectForKey:GCDAsyncSocketSSLCipherSuites]; - if ([value isKindOfClass:[NSArray class]]) - { - NSArray *cipherSuites = (NSArray *)value; - NSUInteger numberCiphers = [cipherSuites count]; - SSLCipherSuite ciphers[numberCiphers]; - - NSUInteger cipherIndex; - for (cipherIndex = 0; cipherIndex < numberCiphers; cipherIndex++) - { - NSNumber *cipherObject = [cipherSuites objectAtIndex:cipherIndex]; - ciphers[cipherIndex] = (SSLCipherSuite)[cipherObject unsignedIntValue]; - } - - status = SSLSetEnabledCiphers(sslContext, ciphers, numberCiphers); - if (status != noErr) - { - [self closeWithError:[self otherError:@"Error in SSLSetEnabledCiphers"]]; - return; - } - } - else if (value) - { - NSAssert(NO, @"Invalid value for GCDAsyncSocketSSLCipherSuites. Value must be of type NSArray."); - - [self closeWithError:[self otherError:@"Invalid value for GCDAsyncSocketSSLCipherSuites."]]; - return; - } - - // 9. GCDAsyncSocketSSLDiffieHellmanParameters - - #if !TARGET_OS_IPHONE - value = [tlsSettings objectForKey:GCDAsyncSocketSSLDiffieHellmanParameters]; - if ([value isKindOfClass:[NSData class]]) - { - NSData *diffieHellmanData = (NSData *)value; - - status = SSLSetDiffieHellmanParams(sslContext, [diffieHellmanData bytes], [diffieHellmanData length]); - if (status != noErr) - { - [self closeWithError:[self otherError:@"Error in SSLSetDiffieHellmanParams"]]; - return; - } - } - else if (value) - { - NSAssert(NO, @"Invalid value for GCDAsyncSocketSSLDiffieHellmanParameters. Value must be of type NSData."); - - [self closeWithError:[self otherError:@"Invalid value for GCDAsyncSocketSSLDiffieHellmanParameters."]]; - return; - } - #endif - - // 10. kCFStreamSSLCertificates - value = [tlsSettings objectForKey:GCDAsyncSocketSSLALPN]; - if ([value isKindOfClass:[NSArray class]]) - { - if (@available(iOS 11.0, macOS 10.13, tvOS 11.0, *)) - { - CFArrayRef protocols = (__bridge CFArrayRef)((NSArray *) value); - status = SSLSetALPNProtocols(sslContext, protocols); - if (status != noErr) - { - [self closeWithError:[self otherError:@"Error in SSLSetALPNProtocols"]]; - return; - } - } - else - { - NSAssert(NO, @"Security option unavailable - GCDAsyncSocketSSLALPN" - @" - iOS 11.0, macOS 10.13 required"); - [self closeWithError:[self otherError:@"Security option unavailable - GCDAsyncSocketSSLALPN"]]; - } - } - else if (value) - { - NSAssert(NO, @"Invalid value for GCDAsyncSocketSSLALPN. Value must be of type NSArray."); - - [self closeWithError:[self otherError:@"Invalid value for GCDAsyncSocketSSLALPN."]]; - return; - } - - // DEPRECATED checks - - // 10. kCFStreamSSLAllowsAnyRoot - - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wdeprecated-declarations" - value = [tlsSettings objectForKey:(__bridge NSString *)kCFStreamSSLAllowsAnyRoot]; - #pragma clang diagnostic pop - if (value) - { - NSAssert(NO, @"Security option unavailable - kCFStreamSSLAllowsAnyRoot" - @" - You must use manual trust evaluation"); - - [self closeWithError:[self otherError:@"Security option unavailable - kCFStreamSSLAllowsAnyRoot"]]; - return; - } - - // 11. kCFStreamSSLAllowsExpiredRoots - - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wdeprecated-declarations" - value = [tlsSettings objectForKey:(__bridge NSString *)kCFStreamSSLAllowsExpiredRoots]; - #pragma clang diagnostic pop - if (value) - { - NSAssert(NO, @"Security option unavailable - kCFStreamSSLAllowsExpiredRoots" - @" - You must use manual trust evaluation"); - - [self closeWithError:[self otherError:@"Security option unavailable - kCFStreamSSLAllowsExpiredRoots"]]; - return; - } - - // 12. kCFStreamSSLValidatesCertificateChain - - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wdeprecated-declarations" - value = [tlsSettings objectForKey:(__bridge NSString *)kCFStreamSSLValidatesCertificateChain]; - #pragma clang diagnostic pop - if (value) - { - NSAssert(NO, @"Security option unavailable - kCFStreamSSLValidatesCertificateChain" - @" - You must use manual trust evaluation"); - - [self closeWithError:[self otherError:@"Security option unavailable - kCFStreamSSLValidatesCertificateChain"]]; - return; - } - - // 13. kCFStreamSSLAllowsExpiredCertificates - - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wdeprecated-declarations" - value = [tlsSettings objectForKey:(__bridge NSString *)kCFStreamSSLAllowsExpiredCertificates]; - #pragma clang diagnostic pop - if (value) - { - NSAssert(NO, @"Security option unavailable - kCFStreamSSLAllowsExpiredCertificates" - @" - You must use manual trust evaluation"); - - [self closeWithError:[self otherError:@"Security option unavailable - kCFStreamSSLAllowsExpiredCertificates"]]; - return; - } - - // 14. kCFStreamSSLLevel - - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wdeprecated-declarations" - value = [tlsSettings objectForKey:(__bridge NSString *)kCFStreamSSLLevel]; - #pragma clang diagnostic pop - if (value) - { - NSAssert(NO, @"Security option unavailable - kCFStreamSSLLevel" - @" - You must use GCDAsyncSocketSSLProtocolVersionMin & GCDAsyncSocketSSLProtocolVersionMax"); - - [self closeWithError:[self otherError:@"Security option unavailable - kCFStreamSSLLevel"]]; - return; - } - - // Setup the sslPreBuffer - // - // Any data in the preBuffer needs to be moved into the sslPreBuffer, - // as this data is now part of the secure read stream. - - sslPreBuffer = [[GCDAsyncSocketPreBuffer alloc] initWithCapacity:(1024 * 4)]; - - size_t preBufferLength = [preBuffer availableBytes]; - - if (preBufferLength > 0) - { - [sslPreBuffer ensureCapacityForWrite:preBufferLength]; - - memcpy([sslPreBuffer writeBuffer], [preBuffer readBuffer], preBufferLength); - [preBuffer didRead:preBufferLength]; - [sslPreBuffer didWrite:preBufferLength]; - } - - sslErrCode = lastSSLHandshakeError = noErr; - - // Start the SSL Handshake process - - [self ssl_continueSSLHandshake]; -} - -- (void)ssl_continueSSLHandshake -{ - LogTrace(); - - // If the return value is noErr, the session is ready for normal secure communication. - // If the return value is errSSLWouldBlock, the SSLHandshake function must be called again. - // If the return value is errSSLServerAuthCompleted, we ask delegate if we should trust the - // server and then call SSLHandshake again to resume the handshake or close the connection - // errSSLPeerBadCert SSL error. - // Otherwise, the return value indicates an error code. - - OSStatus status = SSLHandshake(sslContext); - lastSSLHandshakeError = status; - - if (status == noErr) - { - LogVerbose(@"SSLHandshake complete"); - - flags &= ~kStartingReadTLS; - flags &= ~kStartingWriteTLS; - - flags |= kSocketSecure; - - __strong id theDelegate = delegate; - - if (delegateQueue && [theDelegate respondsToSelector:@selector(socketDidSecure:)]) - { - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - [theDelegate socketDidSecure:self]; - }}); - } - - [self endCurrentRead]; - [self endCurrentWrite]; - - [self maybeDequeueRead]; - [self maybeDequeueWrite]; - } - else if (status == errSSLPeerAuthCompleted) - { - LogVerbose(@"SSLHandshake peerAuthCompleted - awaiting delegate approval"); - - __block SecTrustRef trust = NULL; - status = SSLCopyPeerTrust(sslContext, &trust); - if (status != noErr) - { - [self closeWithError:[self sslError:status]]; - return; - } - - int aStateIndex = stateIndex; - dispatch_queue_t theSocketQueue = socketQueue; - - __weak GCDAsyncSocket *weakSelf = self; - - void (^comletionHandler)(BOOL) = ^(BOOL shouldTrust){ @autoreleasepool { - #pragma clang diagnostic push - #pragma clang diagnostic warning "-Wimplicit-retain-self" - - dispatch_async(theSocketQueue, ^{ @autoreleasepool { - - if (trust) { - CFRelease(trust); - trust = NULL; - } - - __strong GCDAsyncSocket *strongSelf = weakSelf; - if (strongSelf) - { - [strongSelf ssl_shouldTrustPeer:shouldTrust stateIndex:aStateIndex]; - } - }}); - - #pragma clang diagnostic pop - }}; - - __strong id theDelegate = delegate; - - if (delegateQueue && [theDelegate respondsToSelector:@selector(socket:didReceiveTrust:completionHandler:)]) - { - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - [theDelegate socket:self didReceiveTrust:trust completionHandler:comletionHandler]; - }}); - } - else - { - if (trust) { - CFRelease(trust); - trust = NULL; - } - - NSString *msg = @"GCDAsyncSocketManuallyEvaluateTrust specified in tlsSettings," - @" but delegate doesn't implement socket:shouldTrustPeer:"; - - [self closeWithError:[self otherError:msg]]; - return; - } - } - else if (status == errSSLWouldBlock) - { - LogVerbose(@"SSLHandshake continues..."); - - // Handshake continues... - // - // This method will be called again from doReadData or doWriteData. - } - else - { - [self closeWithError:[self sslError:status]]; - } -} - -- (void)ssl_shouldTrustPeer:(BOOL)shouldTrust stateIndex:(int)aStateIndex -{ - LogTrace(); - - if (aStateIndex != stateIndex) - { - LogInfo(@"Ignoring ssl_shouldTrustPeer - invalid state (maybe disconnected)"); - - // One of the following is true - // - the socket was disconnected - // - the startTLS operation timed out - // - the completionHandler was already invoked once - - return; - } - - // Increment stateIndex to ensure completionHandler can only be called once. - stateIndex++; - - if (shouldTrust) - { - NSAssert(lastSSLHandshakeError == errSSLPeerAuthCompleted, @"ssl_shouldTrustPeer called when last error is %d and not errSSLPeerAuthCompleted", (int)lastSSLHandshakeError); - [self ssl_continueSSLHandshake]; - } - else - { - [self closeWithError:[self sslError:errSSLPeerBadCert]]; - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Security via CFStream -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -#if TARGET_OS_IPHONE - -- (void)cf_finishSSLHandshake -{ - LogTrace(); - - if ((flags & kStartingReadTLS) && (flags & kStartingWriteTLS)) - { - flags &= ~kStartingReadTLS; - flags &= ~kStartingWriteTLS; - - flags |= kSocketSecure; - - __strong id theDelegate = delegate; - - if (delegateQueue && [theDelegate respondsToSelector:@selector(socketDidSecure:)]) - { - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - [theDelegate socketDidSecure:self]; - }}); - } - - [self endCurrentRead]; - [self endCurrentWrite]; - - [self maybeDequeueRead]; - [self maybeDequeueWrite]; - } -} - -- (void)cf_abortSSLHandshake:(NSError *)error -{ - LogTrace(); - - if ((flags & kStartingReadTLS) && (flags & kStartingWriteTLS)) - { - flags &= ~kStartingReadTLS; - flags &= ~kStartingWriteTLS; - - [self closeWithError:error]; - } -} - -- (void)cf_startTLS -{ - LogTrace(); - - LogVerbose(@"Starting TLS (via CFStream)..."); - - if ([preBuffer availableBytes] > 0) - { - NSString *msg = @"Invalid TLS transition. Handshake has already been read from socket."; - - [self closeWithError:[self otherError:msg]]; - return; - } - - [self suspendReadSource]; - [self suspendWriteSource]; - - socketFDBytesAvailable = 0; - flags &= ~kSocketCanAcceptBytes; - flags &= ~kSecureSocketHasBytesAvailable; - - flags |= kUsingCFStreamForTLS; - - if (![self createReadAndWriteStream]) - { - [self closeWithError:[self otherError:@"Error in CFStreamCreatePairWithSocket"]]; - return; - } - - if (![self registerForStreamCallbacksIncludingReadWrite:YES]) - { - [self closeWithError:[self otherError:@"Error in CFStreamSetClient"]]; - return; - } - - if (![self addStreamsToRunLoop]) - { - [self closeWithError:[self otherError:@"Error in CFStreamScheduleWithRunLoop"]]; - return; - } - - NSAssert([currentRead isKindOfClass:[GCDAsyncSpecialPacket class]], @"Invalid read packet for startTLS"); - NSAssert([currentWrite isKindOfClass:[GCDAsyncSpecialPacket class]], @"Invalid write packet for startTLS"); - - GCDAsyncSpecialPacket *tlsPacket = (GCDAsyncSpecialPacket *)currentRead; - CFDictionaryRef tlsSettings = (__bridge CFDictionaryRef)tlsPacket->tlsSettings; - - // Getting an error concerning kCFStreamPropertySSLSettings ? - // You need to add the CFNetwork framework to your iOS application. - - BOOL r1 = CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, tlsSettings); - BOOL r2 = CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, tlsSettings); - - // For some reason, starting around the time of iOS 4.3, - // the first call to set the kCFStreamPropertySSLSettings will return true, - // but the second will return false. - // - // Order doesn't seem to matter. - // So you could call CFReadStreamSetProperty and then CFWriteStreamSetProperty, or you could reverse the order. - // Either way, the first call will return true, and the second returns false. - // - // Interestingly, this doesn't seem to affect anything. - // Which is not altogether unusual, as the documentation seems to suggest that (for many settings) - // setting it on one side of the stream automatically sets it for the other side of the stream. - // - // Although there isn't anything in the documentation to suggest that the second attempt would fail. - // - // Furthermore, this only seems to affect streams that are negotiating a security upgrade. - // In other words, the socket gets connected, there is some back-and-forth communication over the unsecure - // connection, and then a startTLS is issued. - // So this mostly affects newer protocols (XMPP, IMAP) as opposed to older protocols (HTTPS). - - if (!r1 && !r2) // Yes, the && is correct - workaround for apple bug. - { - [self closeWithError:[self otherError:@"Error in CFStreamSetProperty"]]; - return; - } - - if (![self openStreams]) - { - [self closeWithError:[self otherError:@"Error in CFStreamOpen"]]; - return; - } - - LogVerbose(@"Waiting for SSL Handshake to complete..."); -} - -#endif - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark CFStream -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -#if TARGET_OS_IPHONE - -+ (void)ignore:(id)_ -{} - -+ (void)startCFStreamThreadIfNeeded -{ - LogTrace(); - - static dispatch_once_t predicate; - dispatch_once(&predicate, ^{ - - cfstreamThreadRetainCount = 0; - cfstreamThreadSetupQueue = dispatch_queue_create("GCDAsyncSocket-CFStreamThreadSetup", DISPATCH_QUEUE_SERIAL); - }); - - dispatch_sync(cfstreamThreadSetupQueue, ^{ @autoreleasepool { - - if (++cfstreamThreadRetainCount == 1) - { - cfstreamThread = [[NSThread alloc] initWithTarget:self - selector:@selector(cfstreamThread:) - object:nil]; - [cfstreamThread start]; - } - }}); -} - -+ (void)stopCFStreamThreadIfNeeded -{ - LogTrace(); - - // The creation of the cfstreamThread is relatively expensive. - // So we'd like to keep it available for recycling. - // However, there's a tradeoff here, because it shouldn't remain alive forever. - // So what we're going to do is use a little delay before taking it down. - // This way it can be reused properly in situations where multiple sockets are continually in flux. - - int delayInSeconds = 30; - dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); - dispatch_after(when, cfstreamThreadSetupQueue, ^{ @autoreleasepool { - #pragma clang diagnostic push - #pragma clang diagnostic warning "-Wimplicit-retain-self" - - if (cfstreamThreadRetainCount == 0) - { - LogWarn(@"Logic error concerning cfstreamThread start / stop"); - return_from_block; - } - - if (--cfstreamThreadRetainCount == 0) - { - [cfstreamThread cancel]; // set isCancelled flag - - // wake up the thread - [[self class] performSelector:@selector(ignore:) - onThread:cfstreamThread - withObject:[NSNull null] - waitUntilDone:NO]; - - cfstreamThread = nil; - } - - #pragma clang diagnostic pop - }}); -} - -+ (void)cfstreamThread:(id)unused { @autoreleasepool -{ - [[NSThread currentThread] setName:GCDAsyncSocketThreadName]; - - LogInfo(@"CFStreamThread: Started"); - - // We can't run the run loop unless it has an associated input source or a timer. - // So we'll just create a timer that will never fire - unless the server runs for decades. - [NSTimer scheduledTimerWithTimeInterval:[[NSDate distantFuture] timeIntervalSinceNow] - target:self - selector:@selector(ignore:) - userInfo:nil - repeats:YES]; - - NSThread *currentThread = [NSThread currentThread]; - NSRunLoop *currentRunLoop = [NSRunLoop currentRunLoop]; - - BOOL isCancelled = [currentThread isCancelled]; - - while (!isCancelled && [currentRunLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) - { - isCancelled = [currentThread isCancelled]; - } - - LogInfo(@"CFStreamThread: Stopped"); -}} - -+ (void)scheduleCFStreams:(GCDAsyncSocket *)asyncSocket -{ - LogTrace(); - NSAssert([NSThread currentThread] == cfstreamThread, @"Invoked on wrong thread"); - - CFRunLoopRef runLoop = CFRunLoopGetCurrent(); - - if (asyncSocket->readStream) - CFReadStreamScheduleWithRunLoop(asyncSocket->readStream, runLoop, kCFRunLoopDefaultMode); - - if (asyncSocket->writeStream) - CFWriteStreamScheduleWithRunLoop(asyncSocket->writeStream, runLoop, kCFRunLoopDefaultMode); -} - -+ (void)unscheduleCFStreams:(GCDAsyncSocket *)asyncSocket -{ - LogTrace(); - NSAssert([NSThread currentThread] == cfstreamThread, @"Invoked on wrong thread"); - - CFRunLoopRef runLoop = CFRunLoopGetCurrent(); - - if (asyncSocket->readStream) - CFReadStreamUnscheduleFromRunLoop(asyncSocket->readStream, runLoop, kCFRunLoopDefaultMode); - - if (asyncSocket->writeStream) - CFWriteStreamUnscheduleFromRunLoop(asyncSocket->writeStream, runLoop, kCFRunLoopDefaultMode); -} - -static void CFReadStreamCallback (CFReadStreamRef stream, CFStreamEventType type, void *pInfo) -{ - GCDAsyncSocket *asyncSocket = (__bridge GCDAsyncSocket *)pInfo; - - switch(type) - { - case kCFStreamEventHasBytesAvailable: - { - dispatch_async(asyncSocket->socketQueue, ^{ @autoreleasepool { - - LogCVerbose(@"CFReadStreamCallback - HasBytesAvailable"); - - if (asyncSocket->readStream != stream) - return_from_block; - - if ((asyncSocket->flags & kStartingReadTLS) && (asyncSocket->flags & kStartingWriteTLS)) - { - // If we set kCFStreamPropertySSLSettings before we opened the streams, this might be a lie. - // (A callback related to the tcp stream, but not to the SSL layer). - - if (CFReadStreamHasBytesAvailable(asyncSocket->readStream)) - { - asyncSocket->flags |= kSecureSocketHasBytesAvailable; - [asyncSocket cf_finishSSLHandshake]; - } - } - else - { - asyncSocket->flags |= kSecureSocketHasBytesAvailable; - [asyncSocket doReadData]; - } - }}); - - break; - } - default: - { - NSError *error = (__bridge_transfer NSError *)CFReadStreamCopyError(stream); - - if (error == nil && type == kCFStreamEventEndEncountered) - { - error = [asyncSocket connectionClosedError]; - } - - dispatch_async(asyncSocket->socketQueue, ^{ @autoreleasepool { - - LogCVerbose(@"CFReadStreamCallback - Other"); - - if (asyncSocket->readStream != stream) - return_from_block; - - if ((asyncSocket->flags & kStartingReadTLS) && (asyncSocket->flags & kStartingWriteTLS)) - { - [asyncSocket cf_abortSSLHandshake:error]; - } - else - { - [asyncSocket closeWithError:error]; - } - }}); - - break; - } - } - -} - -static void CFWriteStreamCallback (CFWriteStreamRef stream, CFStreamEventType type, void *pInfo) -{ - GCDAsyncSocket *asyncSocket = (__bridge GCDAsyncSocket *)pInfo; - - switch(type) - { - case kCFStreamEventCanAcceptBytes: - { - dispatch_async(asyncSocket->socketQueue, ^{ @autoreleasepool { - - LogCVerbose(@"CFWriteStreamCallback - CanAcceptBytes"); - - if (asyncSocket->writeStream != stream) - return_from_block; - - if ((asyncSocket->flags & kStartingReadTLS) && (asyncSocket->flags & kStartingWriteTLS)) - { - // If we set kCFStreamPropertySSLSettings before we opened the streams, this might be a lie. - // (A callback related to the tcp stream, but not to the SSL layer). - - if (CFWriteStreamCanAcceptBytes(asyncSocket->writeStream)) - { - asyncSocket->flags |= kSocketCanAcceptBytes; - [asyncSocket cf_finishSSLHandshake]; - } - } - else - { - asyncSocket->flags |= kSocketCanAcceptBytes; - [asyncSocket doWriteData]; - } - }}); - - break; - } - default: - { - NSError *error = (__bridge_transfer NSError *)CFWriteStreamCopyError(stream); - - if (error == nil && type == kCFStreamEventEndEncountered) - { - error = [asyncSocket connectionClosedError]; - } - - dispatch_async(asyncSocket->socketQueue, ^{ @autoreleasepool { - - LogCVerbose(@"CFWriteStreamCallback - Other"); - - if (asyncSocket->writeStream != stream) - return_from_block; - - if ((asyncSocket->flags & kStartingReadTLS) && (asyncSocket->flags & kStartingWriteTLS)) - { - [asyncSocket cf_abortSSLHandshake:error]; - } - else - { - [asyncSocket closeWithError:error]; - } - }}); - - break; - } - } - -} - -- (BOOL)createReadAndWriteStream -{ - LogTrace(); - - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - - if (readStream || writeStream) - { - // Streams already created - return YES; - } - - int socketFD = (socket4FD != SOCKET_NULL) ? socket4FD : (socket6FD != SOCKET_NULL) ? socket6FD : socketUN; - - if (socketFD == SOCKET_NULL) - { - // Cannot create streams without a file descriptor - return NO; - } - - if (![self isConnected]) - { - // Cannot create streams until file descriptor is connected - return NO; - } - - LogVerbose(@"Creating read and write stream..."); - - CFStreamCreatePairWithSocket(NULL, (CFSocketNativeHandle)socketFD, &readStream, &writeStream); - - // The kCFStreamPropertyShouldCloseNativeSocket property should be false by default (for our case). - // But let's not take any chances. - - if (readStream) - CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse); - if (writeStream) - CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse); - - if ((readStream == NULL) || (writeStream == NULL)) - { - LogWarn(@"Unable to create read and write stream..."); - - if (readStream) - { - CFReadStreamClose(readStream); - CFRelease(readStream); - readStream = NULL; - } - if (writeStream) - { - CFWriteStreamClose(writeStream); - CFRelease(writeStream); - writeStream = NULL; - } - - return NO; - } - - return YES; -} - -- (BOOL)registerForStreamCallbacksIncludingReadWrite:(BOOL)includeReadWrite -{ - LogVerbose(@"%@ %@", THIS_METHOD, (includeReadWrite ? @"YES" : @"NO")); - - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - NSAssert((readStream != NULL && writeStream != NULL), @"Read/Write stream is null"); - - streamContext.version = 0; - streamContext.info = (__bridge void *)(self); - streamContext.retain = nil; - streamContext.release = nil; - streamContext.copyDescription = nil; - - CFOptionFlags readStreamEvents = kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered; - if (includeReadWrite) - readStreamEvents |= kCFStreamEventHasBytesAvailable; - - if (!CFReadStreamSetClient(readStream, readStreamEvents, &CFReadStreamCallback, &streamContext)) - { - return NO; - } - - CFOptionFlags writeStreamEvents = kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered; - if (includeReadWrite) - writeStreamEvents |= kCFStreamEventCanAcceptBytes; - - if (!CFWriteStreamSetClient(writeStream, writeStreamEvents, &CFWriteStreamCallback, &streamContext)) - { - return NO; - } - - return YES; -} - -- (BOOL)addStreamsToRunLoop -{ - LogTrace(); - - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - NSAssert((readStream != NULL && writeStream != NULL), @"Read/Write stream is null"); - - if (!(flags & kAddedStreamsToRunLoop)) - { - LogVerbose(@"Adding streams to runloop..."); - - [[self class] startCFStreamThreadIfNeeded]; - dispatch_sync(cfstreamThreadSetupQueue, ^{ - [[self class] performSelector:@selector(scheduleCFStreams:) - onThread:cfstreamThread - withObject:self - waitUntilDone:YES]; - }); - flags |= kAddedStreamsToRunLoop; - } - - return YES; -} - -- (void)removeStreamsFromRunLoop -{ - LogTrace(); - - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - NSAssert((readStream != NULL && writeStream != NULL), @"Read/Write stream is null"); - - if (flags & kAddedStreamsToRunLoop) - { - LogVerbose(@"Removing streams from runloop..."); - - dispatch_sync(cfstreamThreadSetupQueue, ^{ - [[self class] performSelector:@selector(unscheduleCFStreams:) - onThread:cfstreamThread - withObject:self - waitUntilDone:YES]; - }); - [[self class] stopCFStreamThreadIfNeeded]; - - flags &= ~kAddedStreamsToRunLoop; - } -} - -- (BOOL)openStreams -{ - LogTrace(); - - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - NSAssert((readStream != NULL && writeStream != NULL), @"Read/Write stream is null"); - - CFStreamStatus readStatus = CFReadStreamGetStatus(readStream); - CFStreamStatus writeStatus = CFWriteStreamGetStatus(writeStream); - - if ((readStatus == kCFStreamStatusNotOpen) || (writeStatus == kCFStreamStatusNotOpen)) - { - LogVerbose(@"Opening read and write stream..."); - - BOOL r1 = CFReadStreamOpen(readStream); - BOOL r2 = CFWriteStreamOpen(writeStream); - - if (!r1 || !r2) - { - LogError(@"Error in CFStreamOpen"); - return NO; - } - } - - return YES; -} - -#endif - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Advanced -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * See header file for big discussion of this method. -**/ -- (BOOL)autoDisconnectOnClosedReadStream -{ - // Note: YES means kAllowHalfDuplexConnection is OFF - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - return ((config & kAllowHalfDuplexConnection) == 0); - } - else - { - __block BOOL result; - - dispatch_sync(socketQueue, ^{ - result = ((self->config & kAllowHalfDuplexConnection) == 0); - }); - - return result; - } -} - -/** - * See header file for big discussion of this method. -**/ -- (void)setAutoDisconnectOnClosedReadStream:(BOOL)flag -{ - // Note: YES means kAllowHalfDuplexConnection is OFF - - dispatch_block_t block = ^{ - - if (flag) - self->config &= ~kAllowHalfDuplexConnection; - else - self->config |= kAllowHalfDuplexConnection; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - - -/** - * See header file for big discussion of this method. -**/ -- (void)markSocketQueueTargetQueue:(dispatch_queue_t)socketNewTargetQueue -{ - void *nonNullUnusedPointer = (__bridge void *)self; - dispatch_queue_set_specific(socketNewTargetQueue, IsOnSocketQueueOrTargetQueueKey, nonNullUnusedPointer, NULL); -} - -/** - * See header file for big discussion of this method. -**/ -- (void)unmarkSocketQueueTargetQueue:(dispatch_queue_t)socketOldTargetQueue -{ - dispatch_queue_set_specific(socketOldTargetQueue, IsOnSocketQueueOrTargetQueueKey, NULL, NULL); -} - -/** - * See header file for big discussion of this method. -**/ -- (void)performBlock:(dispatch_block_t)block -{ - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); -} - -/** - * Questions? Have you read the header file? -**/ -- (int)socketFD -{ - if (!dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - LogWarn(@"%@ - Method only available from within the context of a performBlock: invocation", THIS_METHOD); - return SOCKET_NULL; - } - - if (socket4FD != SOCKET_NULL) - return socket4FD; - else - return socket6FD; -} - -/** - * Questions? Have you read the header file? -**/ -- (int)socket4FD -{ - if (!dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - LogWarn(@"%@ - Method only available from within the context of a performBlock: invocation", THIS_METHOD); - return SOCKET_NULL; - } - - return socket4FD; -} - -/** - * Questions? Have you read the header file? -**/ -- (int)socket6FD -{ - if (!dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - LogWarn(@"%@ - Method only available from within the context of a performBlock: invocation", THIS_METHOD); - return SOCKET_NULL; - } - - return socket6FD; -} - -#if TARGET_OS_IPHONE - -/** - * Questions? Have you read the header file? -**/ -- (CFReadStreamRef)readStream -{ - if (!dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - LogWarn(@"%@ - Method only available from within the context of a performBlock: invocation", THIS_METHOD); - return NULL; - } - - if (readStream == NULL) - [self createReadAndWriteStream]; - - return readStream; -} - -/** - * Questions? Have you read the header file? -**/ -- (CFWriteStreamRef)writeStream -{ - if (!dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - LogWarn(@"%@ - Method only available from within the context of a performBlock: invocation", THIS_METHOD); - return NULL; - } - - if (writeStream == NULL) - [self createReadAndWriteStream]; - - return writeStream; -} - -- (BOOL)enableBackgroundingOnSocketWithCaveat:(BOOL)caveat -{ - if (![self createReadAndWriteStream]) - { - // Error occurred creating streams (perhaps socket isn't open) - return NO; - } - - BOOL r1, r2; - - LogVerbose(@"Enabling backgrouding on socket"); - -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" - r1 = CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); - r2 = CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); -#pragma clang diagnostic pop - - if (!r1 || !r2) - { - return NO; - } - - if (!caveat) - { - if (![self openStreams]) - { - return NO; - } - } - - return YES; -} - -/** - * Questions? Have you read the header file? -**/ -- (BOOL)enableBackgroundingOnSocket -{ - LogTrace(); - - if (!dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - LogWarn(@"%@ - Method only available from within the context of a performBlock: invocation", THIS_METHOD); - return NO; - } - - return [self enableBackgroundingOnSocketWithCaveat:NO]; -} - -- (BOOL)enableBackgroundingOnSocketWithCaveat // Deprecated in iOS 4.??? -{ - // This method was created as a workaround for a bug in iOS. - // Apple has since fixed this bug. - // I'm not entirely sure which version of iOS they fixed it in... - - LogTrace(); - - if (!dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - LogWarn(@"%@ - Method only available from within the context of a performBlock: invocation", THIS_METHOD); - return NO; - } - - return [self enableBackgroundingOnSocketWithCaveat:YES]; -} - -#endif - -- (SSLContextRef)sslContext -{ - if (!dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - LogWarn(@"%@ - Method only available from within the context of a performBlock: invocation", THIS_METHOD); - return NULL; - } - - return sslContext; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Class Utilities -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -+ (NSMutableArray *)lookupHost:(NSString *)host port:(uint16_t)port error:(NSError **)errPtr -{ - LogTrace(); - - NSMutableArray *addresses = nil; - NSError *error = nil; - - if ([host isEqualToString:@"localhost"] || [host isEqualToString:@"loopback"]) - { - // Use LOOPBACK address - struct sockaddr_in nativeAddr4; - nativeAddr4.sin_len = sizeof(struct sockaddr_in); - nativeAddr4.sin_family = AF_INET; - nativeAddr4.sin_port = htons(port); - nativeAddr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - memset(&(nativeAddr4.sin_zero), 0, sizeof(nativeAddr4.sin_zero)); - - struct sockaddr_in6 nativeAddr6; - nativeAddr6.sin6_len = sizeof(struct sockaddr_in6); - nativeAddr6.sin6_family = AF_INET6; - nativeAddr6.sin6_port = htons(port); - nativeAddr6.sin6_flowinfo = 0; - nativeAddr6.sin6_addr = in6addr_loopback; - nativeAddr6.sin6_scope_id = 0; - - // Wrap the native address structures - - NSData *address4 = [NSData dataWithBytes:&nativeAddr4 length:sizeof(nativeAddr4)]; - NSData *address6 = [NSData dataWithBytes:&nativeAddr6 length:sizeof(nativeAddr6)]; - - addresses = [NSMutableArray arrayWithCapacity:2]; - [addresses addObject:address4]; - [addresses addObject:address6]; - } - else - { - NSString *portStr = [NSString stringWithFormat:@"%hu", port]; - - struct addrinfo hints, *res, *res0; - - memset(&hints, 0, sizeof(hints)); - hints.ai_family = PF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_TCP; - - int gai_error = getaddrinfo([host UTF8String], [portStr UTF8String], &hints, &res0); - - if (gai_error) - { - error = [self gaiError:gai_error]; - } - else - { - NSUInteger capacity = 0; - for (res = res0; res; res = res->ai_next) - { - if (res->ai_family == AF_INET || res->ai_family == AF_INET6) { - capacity++; - } - } - - addresses = [NSMutableArray arrayWithCapacity:capacity]; - - for (res = res0; res; res = res->ai_next) - { - if (res->ai_family == AF_INET) - { - // Found IPv4 address. - // Wrap the native address structure, and add to results. - - NSData *address4 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]; - [addresses addObject:address4]; - } - else if (res->ai_family == AF_INET6) - { - // Fixes connection issues with IPv6 - // https://github.com/robbiehanson/CocoaAsyncSocket/issues/429#issuecomment-222477158 - - // Found IPv6 address. - // Wrap the native address structure, and add to results. - - struct sockaddr_in6 *sockaddr = (struct sockaddr_in6 *)(void *)res->ai_addr; - in_port_t *portPtr = &sockaddr->sin6_port; - if ((portPtr != NULL) && (*portPtr == 0)) { - *portPtr = htons(port); - } - - NSData *address6 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]; - [addresses addObject:address6]; - } - } - freeaddrinfo(res0); - - if ([addresses count] == 0) - { - error = [self gaiError:EAI_FAIL]; - } - } - } - - if (errPtr) *errPtr = error; - return addresses; -} - -+ (NSString *)hostFromSockaddr4:(const struct sockaddr_in *)pSockaddr4 -{ - char addrBuf[INET_ADDRSTRLEN]; - - if (inet_ntop(AF_INET, &pSockaddr4->sin_addr, addrBuf, (socklen_t)sizeof(addrBuf)) == NULL) - { - addrBuf[0] = '\0'; - } - - return [NSString stringWithCString:addrBuf encoding:NSASCIIStringEncoding]; -} - -+ (NSString *)hostFromSockaddr6:(const struct sockaddr_in6 *)pSockaddr6 -{ - char addrBuf[INET6_ADDRSTRLEN]; - - if (inet_ntop(AF_INET6, &pSockaddr6->sin6_addr, addrBuf, (socklen_t)sizeof(addrBuf)) == NULL) - { - addrBuf[0] = '\0'; - } - - return [NSString stringWithCString:addrBuf encoding:NSASCIIStringEncoding]; -} - -+ (uint16_t)portFromSockaddr4:(const struct sockaddr_in *)pSockaddr4 -{ - return ntohs(pSockaddr4->sin_port); -} - -+ (uint16_t)portFromSockaddr6:(const struct sockaddr_in6 *)pSockaddr6 -{ - return ntohs(pSockaddr6->sin6_port); -} - -+ (NSURL *)urlFromSockaddrUN:(const struct sockaddr_un *)pSockaddr -{ - NSString *path = [NSString stringWithUTF8String:pSockaddr->sun_path]; - return [NSURL fileURLWithPath:path]; -} - -+ (NSString *)hostFromAddress:(NSData *)address -{ - NSString *host; - - if ([self getHost:&host port:NULL fromAddress:address]) - return host; - else - return nil; -} - -+ (uint16_t)portFromAddress:(NSData *)address -{ - uint16_t port; - - if ([self getHost:NULL port:&port fromAddress:address]) - return port; - else - return 0; -} - -+ (BOOL)isIPv4Address:(NSData *)address -{ - if ([address length] >= sizeof(struct sockaddr)) - { - const struct sockaddr *sockaddrX = [address bytes]; - - if (sockaddrX->sa_family == AF_INET) { - return YES; - } - } - - return NO; -} - -+ (BOOL)isIPv6Address:(NSData *)address -{ - if ([address length] >= sizeof(struct sockaddr)) - { - const struct sockaddr *sockaddrX = [address bytes]; - - if (sockaddrX->sa_family == AF_INET6) { - return YES; - } - } - - return NO; -} - -+ (BOOL)getHost:(NSString **)hostPtr port:(uint16_t *)portPtr fromAddress:(NSData *)address -{ - return [self getHost:hostPtr port:portPtr family:NULL fromAddress:address]; -} - -+ (BOOL)getHost:(NSString **)hostPtr port:(uint16_t *)portPtr family:(sa_family_t *)afPtr fromAddress:(NSData *)address -{ - if ([address length] >= sizeof(struct sockaddr)) - { - const struct sockaddr *sockaddrX = [address bytes]; - - if (sockaddrX->sa_family == AF_INET) - { - if ([address length] >= sizeof(struct sockaddr_in)) - { - struct sockaddr_in sockaddr4; - memcpy(&sockaddr4, sockaddrX, sizeof(sockaddr4)); - - if (hostPtr) *hostPtr = [self hostFromSockaddr4:&sockaddr4]; - if (portPtr) *portPtr = [self portFromSockaddr4:&sockaddr4]; - if (afPtr) *afPtr = AF_INET; - - return YES; - } - } - else if (sockaddrX->sa_family == AF_INET6) - { - if ([address length] >= sizeof(struct sockaddr_in6)) - { - struct sockaddr_in6 sockaddr6; - memcpy(&sockaddr6, sockaddrX, sizeof(sockaddr6)); - - if (hostPtr) *hostPtr = [self hostFromSockaddr6:&sockaddr6]; - if (portPtr) *portPtr = [self portFromSockaddr6:&sockaddr6]; - if (afPtr) *afPtr = AF_INET6; - - return YES; - } - } - } - - return NO; -} - -+ (NSData *)CRLFData -{ - return [NSData dataWithBytes:"\x0D\x0A" length:2]; -} - -+ (NSData *)CRData -{ - return [NSData dataWithBytes:"\x0D" length:1]; -} - -+ (NSData *)LFData -{ - return [NSData dataWithBytes:"\x0A" length:1]; -} - -+ (NSData *)ZeroData -{ - return [NSData dataWithBytes:"" length:1]; -} - -@end diff --git a/ios/Pods/CocoaAsyncSocket/Source/GCD/GCDAsyncUdpSocket.h b/ios/Pods/CocoaAsyncSocket/Source/GCD/GCDAsyncUdpSocket.h deleted file mode 100644 index af327e0..0000000 --- a/ios/Pods/CocoaAsyncSocket/Source/GCD/GCDAsyncUdpSocket.h +++ /dev/null @@ -1,1036 +0,0 @@ -// -// GCDAsyncUdpSocket -// -// This class is in the public domain. -// Originally created by Robbie Hanson of Deusty LLC. -// Updated and maintained by Deusty LLC and the Apple development community. -// -// https://github.com/robbiehanson/CocoaAsyncSocket -// - -#import -#import -#import -#import - -NS_ASSUME_NONNULL_BEGIN -extern NSString *const GCDAsyncUdpSocketException; -extern NSString *const GCDAsyncUdpSocketErrorDomain; - -extern NSString *const GCDAsyncUdpSocketQueueName; -extern NSString *const GCDAsyncUdpSocketThreadName; - -typedef NS_ERROR_ENUM(GCDAsyncUdpSocketErrorDomain, GCDAsyncUdpSocketError) { - GCDAsyncUdpSocketNoError = 0, // Never used - GCDAsyncUdpSocketBadConfigError, // Invalid configuration - GCDAsyncUdpSocketBadParamError, // Invalid parameter was passed - GCDAsyncUdpSocketSendTimeoutError, // A send operation timed out - GCDAsyncUdpSocketClosedError, // The socket was closed - GCDAsyncUdpSocketOtherError, // Description provided in userInfo -}; - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@class GCDAsyncUdpSocket; - -@protocol GCDAsyncUdpSocketDelegate -@optional - -/** - * By design, UDP is a connectionless protocol, and connecting is not needed. - * However, you may optionally choose to connect to a particular host for reasons - * outlined in the documentation for the various connect methods listed above. - * - * This method is called if one of the connect methods are invoked, and the connection is successful. -**/ -- (void)udpSocket:(GCDAsyncUdpSocket *)sock didConnectToAddress:(NSData *)address; - -/** - * By design, UDP is a connectionless protocol, and connecting is not needed. - * However, you may optionally choose to connect to a particular host for reasons - * outlined in the documentation for the various connect methods listed above. - * - * This method is called if one of the connect methods are invoked, and the connection fails. - * This may happen, for example, if a domain name is given for the host and the domain name is unable to be resolved. -**/ -- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotConnect:(NSError * _Nullable)error; - -/** - * Called when the datagram with the given tag has been sent. -**/ -- (void)udpSocket:(GCDAsyncUdpSocket *)sock didSendDataWithTag:(long)tag; - -/** - * Called if an error occurs while trying to send a datagram. - * This could be due to a timeout, or something more serious such as the data being too large to fit in a sigle packet. -**/ -- (void)udpSocket:(GCDAsyncUdpSocket *)sock didNotSendDataWithTag:(long)tag dueToError:(NSError * _Nullable)error; - -/** - * Called when the socket has received the requested datagram. -**/ -- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data - fromAddress:(NSData *)address - withFilterContext:(nullable id)filterContext; - -/** - * Called when the socket is closed. -**/ -- (void)udpSocketDidClose:(GCDAsyncUdpSocket *)sock withError:(NSError * _Nullable)error; - -@end - -/** - * You may optionally set a receive filter for the socket. - * A filter can provide several useful features: - * - * 1. Many times udp packets need to be parsed. - * Since the filter can run in its own independent queue, you can parallelize this parsing quite easily. - * The end result is a parallel socket io, datagram parsing, and packet processing. - * - * 2. Many times udp packets are discarded because they are duplicate/unneeded/unsolicited. - * The filter can prevent such packets from arriving at the delegate. - * And because the filter can run in its own independent queue, this doesn't slow down the delegate. - * - * - Since the udp protocol does not guarantee delivery, udp packets may be lost. - * Many protocols built atop udp thus provide various resend/re-request algorithms. - * This sometimes results in duplicate packets arriving. - * A filter may allow you to architect the duplicate detection code to run in parallel to normal processing. - * - * - Since the udp socket may be connectionless, its possible for unsolicited packets to arrive. - * Such packets need to be ignored. - * - * 3. Sometimes traffic shapers are needed to simulate real world environments. - * A filter allows you to write custom code to simulate such environments. - * The ability to code this yourself is especially helpful when your simulated environment - * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router), - * or the system tools to handle this aren't available (e.g. on a mobile device). - * - * @param data - The packet that was received. - * @param address - The address the data was received from. - * See utilities section for methods to extract info from address. - * @param context - Out parameter you may optionally set, which will then be passed to the delegate method. - * For example, filter block can parse the data and then, - * pass the parsed data to the delegate. - * - * @returns - YES if the received packet should be passed onto the delegate. - * NO if the received packet should be discarded, and not reported to the delegete. - * - * Example: - * - * GCDAsyncUdpSocketReceiveFilterBlock filter = ^BOOL (NSData *data, NSData *address, id *context) { - * - * MyProtocolMessage *msg = [MyProtocol parseMessage:data]; - * - * *context = response; - * return (response != nil); - * }; - * [udpSocket setReceiveFilter:filter withQueue:myParsingQueue]; - * -**/ -typedef BOOL (^GCDAsyncUdpSocketReceiveFilterBlock)(NSData *data, NSData *address, id __nullable * __nonnull context); - -/** - * You may optionally set a send filter for the socket. - * A filter can provide several interesting possibilities: - * - * 1. Optional caching of resolved addresses for domain names. - * The cache could later be consulted, resulting in fewer system calls to getaddrinfo. - * - * 2. Reusable modules of code for bandwidth monitoring. - * - * 3. Sometimes traffic shapers are needed to simulate real world environments. - * A filter allows you to write custom code to simulate such environments. - * The ability to code this yourself is especially helpful when your simulated environment - * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router), - * or the system tools to handle this aren't available (e.g. on a mobile device). - * - * @param data - The packet that was received. - * @param address - The address the data was received from. - * See utilities section for methods to extract info from address. - * @param tag - The tag that was passed in the send method. - * - * @returns - YES if the packet should actually be sent over the socket. - * NO if the packet should be silently dropped (not sent over the socket). - * - * Regardless of the return value, the delegate will be informed that the packet was successfully sent. - * -**/ -typedef BOOL (^GCDAsyncUdpSocketSendFilterBlock)(NSData *data, NSData *address, long tag); - - -@interface GCDAsyncUdpSocket : NSObject - -/** - * GCDAsyncUdpSocket uses the standard delegate paradigm, - * but executes all delegate callbacks on a given delegate dispatch queue. - * This allows for maximum concurrency, while at the same time providing easy thread safety. - * - * You MUST set a delegate AND delegate dispatch queue before attempting to - * use the socket, or you will get an error. - * - * The socket queue is optional. - * If you pass NULL, GCDAsyncSocket will automatically create its own socket queue. - * If you choose to provide a socket queue, the socket queue must not be a concurrent queue, - * then please see the discussion for the method markSocketQueueTargetQueue. - * - * The delegate queue and socket queue can optionally be the same. -**/ -- (instancetype)init; -- (instancetype)initWithSocketQueue:(nullable dispatch_queue_t)sq; -- (instancetype)initWithDelegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq; -- (instancetype)initWithDelegate:(nullable id)aDelegate delegateQueue:(nullable dispatch_queue_t)dq socketQueue:(nullable dispatch_queue_t)sq NS_DESIGNATED_INITIALIZER; - -#pragma mark Configuration - -- (nullable id)delegate; -- (void)setDelegate:(nullable id)delegate; -- (void)synchronouslySetDelegate:(nullable id)delegate; - -- (nullable dispatch_queue_t)delegateQueue; -- (void)setDelegateQueue:(nullable dispatch_queue_t)delegateQueue; -- (void)synchronouslySetDelegateQueue:(nullable dispatch_queue_t)delegateQueue; - -- (void)getDelegate:(id __nullable * __nullable)delegatePtr delegateQueue:(dispatch_queue_t __nullable * __nullable)delegateQueuePtr; -- (void)setDelegate:(nullable id)delegate delegateQueue:(nullable dispatch_queue_t)delegateQueue; -- (void)synchronouslySetDelegate:(nullable id)delegate delegateQueue:(nullable dispatch_queue_t)delegateQueue; - -/** - * By default, both IPv4 and IPv6 are enabled. - * - * This means GCDAsyncUdpSocket automatically supports both protocols, - * and can send to IPv4 or IPv6 addresses, - * as well as receive over IPv4 and IPv6. - * - * For operations that require DNS resolution, GCDAsyncUdpSocket supports both IPv4 and IPv6. - * If a DNS lookup returns only IPv4 results, GCDAsyncUdpSocket will automatically use IPv4. - * If a DNS lookup returns only IPv6 results, GCDAsyncUdpSocket will automatically use IPv6. - * If a DNS lookup returns both IPv4 and IPv6 results, then the protocol used depends on the configured preference. - * If IPv4 is preferred, then IPv4 is used. - * If IPv6 is preferred, then IPv6 is used. - * If neutral, then the first IP version in the resolved array will be used. - * - * Starting with Mac OS X 10.7 Lion and iOS 5, the default IP preference is neutral. - * On prior systems the default IP preference is IPv4. - **/ -- (BOOL)isIPv4Enabled; -- (void)setIPv4Enabled:(BOOL)flag; - -- (BOOL)isIPv6Enabled; -- (void)setIPv6Enabled:(BOOL)flag; - -- (BOOL)isIPv4Preferred; -- (BOOL)isIPv6Preferred; -- (BOOL)isIPVersionNeutral; - -- (void)setPreferIPv4; -- (void)setPreferIPv6; -- (void)setIPVersionNeutral; - -/** - * Gets/Sets the maximum size of the buffer that will be allocated for receive operations. - * The default maximum size is 65535 bytes. - * - * The theoretical maximum size of any IPv4 UDP packet is UINT16_MAX = 65535. - * The theoretical maximum size of any IPv6 UDP packet is UINT32_MAX = 4294967295. - * - * Since the OS/GCD notifies us of the size of each received UDP packet, - * the actual allocated buffer size for each packet is exact. - * And in practice the size of UDP packets is generally much smaller than the max. - * Indeed most protocols will send and receive packets of only a few bytes, - * or will set a limit on the size of packets to prevent fragmentation in the IP layer. - * - * If you set the buffer size too small, the sockets API in the OS will silently discard - * any extra data, and you will not be notified of the error. -**/ -- (uint16_t)maxReceiveIPv4BufferSize; -- (void)setMaxReceiveIPv4BufferSize:(uint16_t)max; - -- (uint32_t)maxReceiveIPv6BufferSize; -- (void)setMaxReceiveIPv6BufferSize:(uint32_t)max; - -/** - * Gets/Sets the maximum size of the buffer that will be allocated for send operations. - * The default maximum size is 65535 bytes. - * - * Given that a typical link MTU is 1500 bytes, a large UDP datagram will have to be - * fragmented, and that’s both expensive and risky (if one fragment goes missing, the - * entire datagram is lost). You are much better off sending a large number of smaller - * UDP datagrams, preferably using a path MTU algorithm to avoid fragmentation. - * - * You must set it before the sockt is created otherwise it won't work. - * - **/ -- (uint16_t)maxSendBufferSize; -- (void)setMaxSendBufferSize:(uint16_t)max; - -/** - * User data allows you to associate arbitrary information with the socket. - * This data is not used internally in any way. -**/ -- (nullable id)userData; -- (void)setUserData:(nullable id)arbitraryUserData; - -#pragma mark Diagnostics - -/** - * Returns the local address info for the socket. - * - * The localAddress method returns a sockaddr structure wrapped in a NSData object. - * The localHost method returns the human readable IP address as a string. - * - * Note: Address info may not be available until after the socket has been binded, connected - * or until after data has been sent. -**/ -- (nullable NSData *)localAddress; -- (nullable NSString *)localHost; -- (uint16_t)localPort; - -- (nullable NSData *)localAddress_IPv4; -- (nullable NSString *)localHost_IPv4; -- (uint16_t)localPort_IPv4; - -- (nullable NSData *)localAddress_IPv6; -- (nullable NSString *)localHost_IPv6; -- (uint16_t)localPort_IPv6; - -/** - * Returns the remote address info for the socket. - * - * The connectedAddress method returns a sockaddr structure wrapped in a NSData object. - * The connectedHost method returns the human readable IP address as a string. - * - * Note: Since UDP is connectionless by design, connected address info - * will not be available unless the socket is explicitly connected to a remote host/port. - * If the socket is not connected, these methods will return nil / 0. -**/ -- (nullable NSData *)connectedAddress; -- (nullable NSString *)connectedHost; -- (uint16_t)connectedPort; - -/** - * Returns whether or not this socket has been connected to a single host. - * By design, UDP is a connectionless protocol, and connecting is not needed. - * If connected, the socket will only be able to send/receive data to/from the connected host. -**/ -- (BOOL)isConnected; - -/** - * Returns whether or not this socket has been closed. - * The only way a socket can be closed is if you explicitly call one of the close methods. -**/ -- (BOOL)isClosed; - -/** - * Returns whether or not this socket is IPv4. - * - * By default this will be true, unless: - * - IPv4 is disabled (via setIPv4Enabled:) - * - The socket is explicitly bound to an IPv6 address - * - The socket is connected to an IPv6 address -**/ -- (BOOL)isIPv4; - -/** - * Returns whether or not this socket is IPv6. - * - * By default this will be true, unless: - * - IPv6 is disabled (via setIPv6Enabled:) - * - The socket is explicitly bound to an IPv4 address - * _ The socket is connected to an IPv4 address - * - * This method will also return false on platforms that do not support IPv6. - * Note: The iPhone does not currently support IPv6. -**/ -- (BOOL)isIPv6; - -#pragma mark Binding - -/** - * Binds the UDP socket to the given port. - * Binding should be done for server sockets that receive data prior to sending it. - * Client sockets can skip binding, - * as the OS will automatically assign the socket an available port when it starts sending data. - * - * You may optionally pass a port number of zero to immediately bind the socket, - * yet still allow the OS to automatically assign an available port. - * - * You cannot bind a socket after its been connected. - * You can only bind a socket once. - * You can still connect a socket (if desired) after binding. - * - * On success, returns YES. - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass NULL for errPtr. -**/ -- (BOOL)bindToPort:(uint16_t)port error:(NSError **)errPtr; - -/** - * Binds the UDP socket to the given port and optional interface. - * Binding should be done for server sockets that receive data prior to sending it. - * Client sockets can skip binding, - * as the OS will automatically assign the socket an available port when it starts sending data. - * - * You may optionally pass a port number of zero to immediately bind the socket, - * yet still allow the OS to automatically assign an available port. - * - * The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35"). - * You may also use the special strings "localhost" or "loopback" to specify that - * the socket only accept packets from the local machine. - * - * You cannot bind a socket after its been connected. - * You can only bind a socket once. - * You can still connect a socket (if desired) after binding. - * - * On success, returns YES. - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass NULL for errPtr. -**/ -- (BOOL)bindToPort:(uint16_t)port interface:(nullable NSString *)interface error:(NSError **)errPtr; - -/** - * Binds the UDP socket to the given address, specified as a sockaddr structure wrapped in a NSData object. - * - * If you have an existing struct sockaddr you can convert it to a NSData object like so: - * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len]; - * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len]; - * - * Binding should be done for server sockets that receive data prior to sending it. - * Client sockets can skip binding, - * as the OS will automatically assign the socket an available port when it starts sending data. - * - * You cannot bind a socket after its been connected. - * You can only bind a socket once. - * You can still connect a socket (if desired) after binding. - * - * On success, returns YES. - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass NULL for errPtr. -**/ -- (BOOL)bindToAddress:(NSData *)localAddr error:(NSError **)errPtr; - -#pragma mark Connecting - -/** - * Connects the UDP socket to the given host and port. - * By design, UDP is a connectionless protocol, and connecting is not needed. - * - * Choosing to connect to a specific host/port has the following effect: - * - You will only be able to send data to the connected host/port. - * - You will only be able to receive data from the connected host/port. - * - You will receive ICMP messages that come from the connected host/port, such as "connection refused". - * - * The actual process of connecting a UDP socket does not result in any communication on the socket. - * It simply changes the internal state of the socket. - * - * You cannot bind a socket after it has been connected. - * You can only connect a socket once. - * - * The host may be a domain name (e.g. "deusty.com") or an IP address string (e.g. "192.168.0.2"). - * - * This method is asynchronous as it requires a DNS lookup to resolve the given host name. - * If an obvious error is detected, this method immediately returns NO and sets errPtr. - * If you don't care about the error, you can pass nil for errPtr. - * Otherwise, this method returns YES and begins the asynchronous connection process. - * The result of the asynchronous connection process will be reported via the delegate methods. - **/ -- (BOOL)connectToHost:(NSString *)host onPort:(uint16_t)port error:(NSError **)errPtr; - -/** - * Connects the UDP socket to the given address, specified as a sockaddr structure wrapped in a NSData object. - * - * If you have an existing struct sockaddr you can convert it to a NSData object like so: - * struct sockaddr sa -> NSData *dsa = [NSData dataWithBytes:&remoteAddr length:remoteAddr.sa_len]; - * struct sockaddr *sa -> NSData *dsa = [NSData dataWithBytes:remoteAddr length:remoteAddr->sa_len]; - * - * By design, UDP is a connectionless protocol, and connecting is not needed. - * - * Choosing to connect to a specific address has the following effect: - * - You will only be able to send data to the connected address. - * - You will only be able to receive data from the connected address. - * - You will receive ICMP messages that come from the connected address, such as "connection refused". - * - * Connecting a UDP socket does not result in any communication on the socket. - * It simply changes the internal state of the socket. - * - * You cannot bind a socket after its been connected. - * You can only connect a socket once. - * - * On success, returns YES. - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. - * - * Note: Unlike the connectToHost:onPort:error: method, this method does not require a DNS lookup. - * Thus when this method returns, the connection has either failed or fully completed. - * In other words, this method is synchronous, unlike the asynchronous connectToHost::: method. - * However, for compatibility and simplification of delegate code, if this method returns YES - * then the corresponding delegate method (udpSocket:didConnectToHost:port:) is still invoked. -**/ -- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr; - -#pragma mark Multicast - -/** - * Join multicast group. - * Group should be an IP address (eg @"225.228.0.1"). - * - * On success, returns YES. - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. -**/ -- (BOOL)joinMulticastGroup:(NSString *)group error:(NSError **)errPtr; - -/** - * Join multicast group. - * Group should be an IP address (eg @"225.228.0.1"). - * The interface may be a name (e.g. "en1" or "lo0") or the corresponding IP address (e.g. "192.168.4.35"). - * - * On success, returns YES. - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. -**/ -- (BOOL)joinMulticastGroup:(NSString *)group onInterface:(nullable NSString *)interface error:(NSError **)errPtr; - -- (BOOL)leaveMulticastGroup:(NSString *)group error:(NSError **)errPtr; -- (BOOL)leaveMulticastGroup:(NSString *)group onInterface:(nullable NSString *)interface error:(NSError **)errPtr; - -/** - * Send multicast on a specified interface. - * For IPv4, interface should be the the IP address of the interface (eg @"192.168.10.1"). - * For IPv6, interface should be the a network interface name (eg @"en0"). - * - * On success, returns YES. - * Otherwise returns NO, and sets errPtr. If you don't care about the error, you can pass nil for errPtr. -**/ - -- (BOOL)sendIPv4MulticastOnInterface:(NSString*)interface error:(NSError **)errPtr; -- (BOOL)sendIPv6MulticastOnInterface:(NSString*)interface error:(NSError **)errPtr; - -#pragma mark Reuse Port - -/** - * By default, only one socket can be bound to a given IP address + port at a time. - * To enable multiple processes to simultaneously bind to the same address+port, - * you need to enable this functionality in the socket. All processes that wish to - * use the address+port simultaneously must all enable reuse port on the socket - * bound to that port. - **/ -- (BOOL)enableReusePort:(BOOL)flag error:(NSError **)errPtr; - -#pragma mark Broadcast - -/** - * By default, the underlying socket in the OS will not allow you to send broadcast messages. - * In order to send broadcast messages, you need to enable this functionality in the socket. - * - * A broadcast is a UDP message to addresses like "192.168.255.255" or "255.255.255.255" that is - * delivered to every host on the network. - * The reason this is generally disabled by default (by the OS) is to prevent - * accidental broadcast messages from flooding the network. -**/ -- (BOOL)enableBroadcast:(BOOL)flag error:(NSError **)errPtr; - -#pragma mark Sending - -/** - * Asynchronously sends the given data, with the given timeout and tag. - * - * This method may only be used with a connected socket. - * Recall that connecting is optional for a UDP socket. - * For connected sockets, data can only be sent to the connected address. - * For non-connected sockets, the remote destination is specified for each packet. - * For more information about optionally connecting udp sockets, see the documentation for the connect methods above. - * - * @param data - * The data to send. - * If data is nil or zero-length, this method does nothing. - * If passing NSMutableData, please read the thread-safety notice below. - * - * @param timeout - * The timeout for the send opeartion. - * If the timeout value is negative, the send operation will not use a timeout. - * - * @param tag - * The tag is for your convenience. - * It is not sent or received over the socket in any manner what-so-ever. - * It is reported back as a parameter in the udpSocket:didSendDataWithTag: - * or udpSocket:didNotSendDataWithTag:dueToError: methods. - * You can use it as an array index, state id, type constant, etc. - * - * - * Thread-Safety Note: - * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while - * the socket is sending it. In other words, it's not safe to alter the data until after the delegate method - * udpSocket:didSendDataWithTag: or udpSocket:didNotSendDataWithTag:dueToError: is invoked signifying - * that this particular send operation has completed. - * This is due to the fact that GCDAsyncUdpSocket does NOT copy the data. - * It simply retains it for performance reasons. - * Often times, if NSMutableData is passed, it is because a request/response was built up in memory. - * Copying this data adds an unwanted/unneeded overhead. - * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket - * completes sending the bytes (which is NOT immediately after this method returns, but rather at a later time - * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method. -**/ -- (void)sendData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag; - -/** - * Asynchronously sends the given data, with the given timeout and tag, to the given host and port. - * - * This method cannot be used with a connected socket. - * Recall that connecting is optional for a UDP socket. - * For connected sockets, data can only be sent to the connected address. - * For non-connected sockets, the remote destination is specified for each packet. - * For more information about optionally connecting udp sockets, see the documentation for the connect methods above. - * - * @param data - * The data to send. - * If data is nil or zero-length, this method does nothing. - * If passing NSMutableData, please read the thread-safety notice below. - * - * @param host - * The destination to send the udp packet to. - * May be specified as a domain name (e.g. "deusty.com") or an IP address string (e.g. "192.168.0.2"). - * You may also use the convenience strings of "loopback" or "localhost". - * - * @param port - * The port of the host to send to. - * - * @param timeout - * The timeout for the send opeartion. - * If the timeout value is negative, the send operation will not use a timeout. - * - * @param tag - * The tag is for your convenience. - * It is not sent or received over the socket in any manner what-so-ever. - * It is reported back as a parameter in the udpSocket:didSendDataWithTag: - * or udpSocket:didNotSendDataWithTag:dueToError: methods. - * You can use it as an array index, state id, type constant, etc. - * - * - * Thread-Safety Note: - * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while - * the socket is sending it. In other words, it's not safe to alter the data until after the delegate method - * udpSocket:didSendDataWithTag: or udpSocket:didNotSendDataWithTag:dueToError: is invoked signifying - * that this particular send operation has completed. - * This is due to the fact that GCDAsyncUdpSocket does NOT copy the data. - * It simply retains it for performance reasons. - * Often times, if NSMutableData is passed, it is because a request/response was built up in memory. - * Copying this data adds an unwanted/unneeded overhead. - * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket - * completes sending the bytes (which is NOT immediately after this method returns, but rather at a later time - * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method. -**/ -- (void)sendData:(NSData *)data - toHost:(NSString *)host - port:(uint16_t)port - withTimeout:(NSTimeInterval)timeout - tag:(long)tag; - -/** - * Asynchronously sends the given data, with the given timeout and tag, to the given address. - * - * This method cannot be used with a connected socket. - * Recall that connecting is optional for a UDP socket. - * For connected sockets, data can only be sent to the connected address. - * For non-connected sockets, the remote destination is specified for each packet. - * For more information about optionally connecting udp sockets, see the documentation for the connect methods above. - * - * @param data - * The data to send. - * If data is nil or zero-length, this method does nothing. - * If passing NSMutableData, please read the thread-safety notice below. - * - * @param remoteAddr - * The address to send the data to (specified as a sockaddr structure wrapped in a NSData object). - * - * @param timeout - * The timeout for the send opeartion. - * If the timeout value is negative, the send operation will not use a timeout. - * - * @param tag - * The tag is for your convenience. - * It is not sent or received over the socket in any manner what-so-ever. - * It is reported back as a parameter in the udpSocket:didSendDataWithTag: - * or udpSocket:didNotSendDataWithTag:dueToError: methods. - * You can use it as an array index, state id, type constant, etc. - * - * - * Thread-Safety Note: - * If the given data parameter is mutable (NSMutableData) then you MUST NOT alter the data while - * the socket is sending it. In other words, it's not safe to alter the data until after the delegate method - * udpSocket:didSendDataWithTag: or udpSocket:didNotSendDataWithTag:dueToError: is invoked signifying - * that this particular send operation has completed. - * This is due to the fact that GCDAsyncUdpSocket does NOT copy the data. - * It simply retains it for performance reasons. - * Often times, if NSMutableData is passed, it is because a request/response was built up in memory. - * Copying this data adds an unwanted/unneeded overhead. - * If you need to write data from an immutable buffer, and you need to alter the buffer before the socket - * completes sending the bytes (which is NOT immediately after this method returns, but rather at a later time - * when the delegate method notifies you), then you should first copy the bytes, and pass the copy to this method. -**/ -- (void)sendData:(NSData *)data toAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout tag:(long)tag; - -/** - * You may optionally set a send filter for the socket. - * A filter can provide several interesting possibilities: - * - * 1. Optional caching of resolved addresses for domain names. - * The cache could later be consulted, resulting in fewer system calls to getaddrinfo. - * - * 2. Reusable modules of code for bandwidth monitoring. - * - * 3. Sometimes traffic shapers are needed to simulate real world environments. - * A filter allows you to write custom code to simulate such environments. - * The ability to code this yourself is especially helpful when your simulated environment - * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router), - * or the system tools to handle this aren't available (e.g. on a mobile device). - * - * For more information about GCDAsyncUdpSocketSendFilterBlock, see the documentation for its typedef. - * To remove a previously set filter, invoke this method and pass a nil filterBlock and NULL filterQueue. - * - * Note: This method invokes setSendFilter:withQueue:isAsynchronous: (documented below), - * passing YES for the isAsynchronous parameter. -**/ -- (void)setSendFilter:(nullable GCDAsyncUdpSocketSendFilterBlock)filterBlock withQueue:(nullable dispatch_queue_t)filterQueue; - -/** - * The receive filter can be run via dispatch_async or dispatch_sync. - * Most typical situations call for asynchronous operation. - * - * However, there are a few situations in which synchronous operation is preferred. - * Such is the case when the filter is extremely minimal and fast. - * This is because dispatch_sync is faster than dispatch_async. - * - * If you choose synchronous operation, be aware of possible deadlock conditions. - * Since the socket queue is executing your block via dispatch_sync, - * then you cannot perform any tasks which may invoke dispatch_sync on the socket queue. - * For example, you can't query properties on the socket. -**/ -- (void)setSendFilter:(nullable GCDAsyncUdpSocketSendFilterBlock)filterBlock - withQueue:(nullable dispatch_queue_t)filterQueue - isAsynchronous:(BOOL)isAsynchronous; - -#pragma mark Receiving - -/** - * There are two modes of operation for receiving packets: one-at-a-time & continuous. - * - * In one-at-a-time mode, you call receiveOnce everytime your delegate is ready to process an incoming udp packet. - * Receiving packets one-at-a-time may be better suited for implementing certain state machine code, - * where your state machine may not always be ready to process incoming packets. - * - * In continuous mode, the delegate is invoked immediately everytime incoming udp packets are received. - * Receiving packets continuously is better suited to real-time streaming applications. - * - * You may switch back and forth between one-at-a-time mode and continuous mode. - * If the socket is currently in continuous mode, calling this method will switch it to one-at-a-time mode. - * - * When a packet is received (and not filtered by the optional receive filter), - * the delegate method (udpSocket:didReceiveData:fromAddress:withFilterContext:) is invoked. - * - * If the socket is able to begin receiving packets, this method returns YES. - * Otherwise it returns NO, and sets the errPtr with appropriate error information. - * - * An example error: - * You created a udp socket to act as a server, and immediately called receive. - * You forgot to first bind the socket to a port number, and received a error with a message like: - * "Must bind socket before you can receive data." -**/ -- (BOOL)receiveOnce:(NSError **)errPtr; - -/** - * There are two modes of operation for receiving packets: one-at-a-time & continuous. - * - * In one-at-a-time mode, you call receiveOnce everytime your delegate is ready to process an incoming udp packet. - * Receiving packets one-at-a-time may be better suited for implementing certain state machine code, - * where your state machine may not always be ready to process incoming packets. - * - * In continuous mode, the delegate is invoked immediately everytime incoming udp packets are received. - * Receiving packets continuously is better suited to real-time streaming applications. - * - * You may switch back and forth between one-at-a-time mode and continuous mode. - * If the socket is currently in one-at-a-time mode, calling this method will switch it to continuous mode. - * - * For every received packet (not filtered by the optional receive filter), - * the delegate method (udpSocket:didReceiveData:fromAddress:withFilterContext:) is invoked. - * - * If the socket is able to begin receiving packets, this method returns YES. - * Otherwise it returns NO, and sets the errPtr with appropriate error information. - * - * An example error: - * You created a udp socket to act as a server, and immediately called receive. - * You forgot to first bind the socket to a port number, and received a error with a message like: - * "Must bind socket before you can receive data." -**/ -- (BOOL)beginReceiving:(NSError **)errPtr; - -/** - * If the socket is currently receiving (beginReceiving has been called), this method pauses the receiving. - * That is, it won't read any more packets from the underlying OS socket until beginReceiving is called again. - * - * Important Note: - * GCDAsyncUdpSocket may be running in parallel with your code. - * That is, your delegate is likely running on a separate thread/dispatch_queue. - * When you invoke this method, GCDAsyncUdpSocket may have already dispatched delegate methods to be invoked. - * Thus, if those delegate methods have already been dispatch_async'd, - * your didReceive delegate method may still be invoked after this method has been called. - * You should be aware of this, and program defensively. -**/ -- (void)pauseReceiving; - -/** - * You may optionally set a receive filter for the socket. - * This receive filter may be set to run in its own queue (independent of delegate queue). - * - * A filter can provide several useful features. - * - * 1. Many times udp packets need to be parsed. - * Since the filter can run in its own independent queue, you can parallelize this parsing quite easily. - * The end result is a parallel socket io, datagram parsing, and packet processing. - * - * 2. Many times udp packets are discarded because they are duplicate/unneeded/unsolicited. - * The filter can prevent such packets from arriving at the delegate. - * And because the filter can run in its own independent queue, this doesn't slow down the delegate. - * - * - Since the udp protocol does not guarantee delivery, udp packets may be lost. - * Many protocols built atop udp thus provide various resend/re-request algorithms. - * This sometimes results in duplicate packets arriving. - * A filter may allow you to architect the duplicate detection code to run in parallel to normal processing. - * - * - Since the udp socket may be connectionless, its possible for unsolicited packets to arrive. - * Such packets need to be ignored. - * - * 3. Sometimes traffic shapers are needed to simulate real world environments. - * A filter allows you to write custom code to simulate such environments. - * The ability to code this yourself is especially helpful when your simulated environment - * is more complicated than simple traffic shaping (e.g. simulating a cone port restricted router), - * or the system tools to handle this aren't available (e.g. on a mobile device). - * - * Example: - * - * GCDAsyncUdpSocketReceiveFilterBlock filter = ^BOOL (NSData *data, NSData *address, id *context) { - * - * MyProtocolMessage *msg = [MyProtocol parseMessage:data]; - * - * *context = response; - * return (response != nil); - * }; - * [udpSocket setReceiveFilter:filter withQueue:myParsingQueue]; - * - * For more information about GCDAsyncUdpSocketReceiveFilterBlock, see the documentation for its typedef. - * To remove a previously set filter, invoke this method and pass a nil filterBlock and NULL filterQueue. - * - * Note: This method invokes setReceiveFilter:withQueue:isAsynchronous: (documented below), - * passing YES for the isAsynchronous parameter. -**/ -- (void)setReceiveFilter:(nullable GCDAsyncUdpSocketReceiveFilterBlock)filterBlock withQueue:(nullable dispatch_queue_t)filterQueue; - -/** - * The receive filter can be run via dispatch_async or dispatch_sync. - * Most typical situations call for asynchronous operation. - * - * However, there are a few situations in which synchronous operation is preferred. - * Such is the case when the filter is extremely minimal and fast. - * This is because dispatch_sync is faster than dispatch_async. - * - * If you choose synchronous operation, be aware of possible deadlock conditions. - * Since the socket queue is executing your block via dispatch_sync, - * then you cannot perform any tasks which may invoke dispatch_sync on the socket queue. - * For example, you can't query properties on the socket. -**/ -- (void)setReceiveFilter:(nullable GCDAsyncUdpSocketReceiveFilterBlock)filterBlock - withQueue:(nullable dispatch_queue_t)filterQueue - isAsynchronous:(BOOL)isAsynchronous; - -#pragma mark Closing - -/** - * Immediately closes the underlying socket. - * Any pending send operations are discarded. - * - * The GCDAsyncUdpSocket instance may optionally be used again. - * (it will setup/configure/use another unnderlying BSD socket). -**/ -- (void)close; - -/** - * Closes the underlying socket after all pending send operations have been sent. - * - * The GCDAsyncUdpSocket instance may optionally be used again. - * (it will setup/configure/use another unnderlying BSD socket). -**/ -- (void)closeAfterSending; - -#pragma mark Advanced -/** - * GCDAsyncSocket maintains thread safety by using an internal serial dispatch_queue. - * In most cases, the instance creates this queue itself. - * However, to allow for maximum flexibility, the internal queue may be passed in the init method. - * This allows for some advanced options such as controlling socket priority via target queues. - * However, when one begins to use target queues like this, they open the door to some specific deadlock issues. - * - * For example, imagine there are 2 queues: - * dispatch_queue_t socketQueue; - * dispatch_queue_t socketTargetQueue; - * - * If you do this (pseudo-code): - * socketQueue.targetQueue = socketTargetQueue; - * - * Then all socketQueue operations will actually get run on the given socketTargetQueue. - * This is fine and works great in most situations. - * But if you run code directly from within the socketTargetQueue that accesses the socket, - * you could potentially get deadlock. Imagine the following code: - * - * - (BOOL)socketHasSomething - * { - * __block BOOL result = NO; - * dispatch_block_t block = ^{ - * result = [self someInternalMethodToBeRunOnlyOnSocketQueue]; - * } - * if (is_executing_on_queue(socketQueue)) - * block(); - * else - * dispatch_sync(socketQueue, block); - * - * return result; - * } - * - * What happens if you call this method from the socketTargetQueue? The result is deadlock. - * This is because the GCD API offers no mechanism to discover a queue's targetQueue. - * Thus we have no idea if our socketQueue is configured with a targetQueue. - * If we had this information, we could easily avoid deadlock. - * But, since these API's are missing or unfeasible, you'll have to explicitly set it. - * - * IF you pass a socketQueue via the init method, - * AND you've configured the passed socketQueue with a targetQueue, - * THEN you should pass the end queue in the target hierarchy. - * - * For example, consider the following queue hierarchy: - * socketQueue -> ipQueue -> moduleQueue - * - * This example demonstrates priority shaping within some server. - * All incoming client connections from the same IP address are executed on the same target queue. - * And all connections for a particular module are executed on the same target queue. - * Thus, the priority of all networking for the entire module can be changed on the fly. - * Additionally, networking traffic from a single IP cannot monopolize the module. - * - * Here's how you would accomplish something like that: - * - (dispatch_queue_t)newSocketQueueForConnectionFromAddress:(NSData *)address onSocket:(GCDAsyncSocket *)sock - * { - * dispatch_queue_t socketQueue = dispatch_queue_create("", NULL); - * dispatch_queue_t ipQueue = [self ipQueueForAddress:address]; - * - * dispatch_set_target_queue(socketQueue, ipQueue); - * dispatch_set_target_queue(iqQueue, moduleQueue); - * - * return socketQueue; - * } - * - (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket - * { - * [clientConnections addObject:newSocket]; - * [newSocket markSocketQueueTargetQueue:moduleQueue]; - * } - * - * Note: This workaround is ONLY needed if you intend to execute code directly on the ipQueue or moduleQueue. - * This is often NOT the case, as such queues are used solely for execution shaping. - **/ -- (void)markSocketQueueTargetQueue:(dispatch_queue_t)socketQueuesPreConfiguredTargetQueue; -- (void)unmarkSocketQueueTargetQueue:(dispatch_queue_t)socketQueuesPreviouslyConfiguredTargetQueue; - -/** - * It's not thread-safe to access certain variables from outside the socket's internal queue. - * - * For example, the socket file descriptor. - * File descriptors are simply integers which reference an index in the per-process file table. - * However, when one requests a new file descriptor (by opening a file or socket), - * the file descriptor returned is guaranteed to be the lowest numbered unused descriptor. - * So if we're not careful, the following could be possible: - * - * - Thread A invokes a method which returns the socket's file descriptor. - * - The socket is closed via the socket's internal queue on thread B. - * - Thread C opens a file, and subsequently receives the file descriptor that was previously the socket's FD. - * - Thread A is now accessing/altering the file instead of the socket. - * - * In addition to this, other variables are not actually objects, - * and thus cannot be retained/released or even autoreleased. - * An example is the sslContext, of type SSLContextRef, which is actually a malloc'd struct. - * - * Although there are internal variables that make it difficult to maintain thread-safety, - * it is important to provide access to these variables - * to ensure this class can be used in a wide array of environments. - * This method helps to accomplish this by invoking the current block on the socket's internal queue. - * The methods below can be invoked from within the block to access - * those generally thread-unsafe internal variables in a thread-safe manner. - * The given block will be invoked synchronously on the socket's internal queue. - * - * If you save references to any protected variables and use them outside the block, you do so at your own peril. -**/ -- (void)performBlock:(dispatch_block_t)block; - -/** - * These methods are only available from within the context of a performBlock: invocation. - * See the documentation for the performBlock: method above. - * - * Provides access to the socket's file descriptor(s). - * If the socket isn't connected, or explicity bound to a particular interface, - * it might actually have multiple internal socket file descriptors - one for IPv4 and one for IPv6. -**/ -- (int)socketFD; -- (int)socket4FD; -- (int)socket6FD; - -#if TARGET_OS_IPHONE - -/** - * These methods are only available from within the context of a performBlock: invocation. - * See the documentation for the performBlock: method above. - * - * Returns (creating if necessary) a CFReadStream/CFWriteStream for the internal socket. - * - * Generally GCDAsyncUdpSocket doesn't use CFStream. (It uses the faster GCD API's.) - * However, if you need one for any reason, - * these methods are a convenient way to get access to a safe instance of one. -**/ -- (nullable CFReadStreamRef)readStream; -- (nullable CFWriteStreamRef)writeStream; - -/** - * This method is only available from within the context of a performBlock: invocation. - * See the documentation for the performBlock: method above. - * - * Configures the socket to allow it to operate when the iOS application has been backgrounded. - * In other words, this method creates a read & write stream, and invokes: - * - * CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); - * CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); - * - * Returns YES if successful, NO otherwise. - * - * Example usage: - * - * [asyncUdpSocket performBlock:^{ - * [asyncUdpSocket enableBackgroundingOnSocket]; - * }]; - * - * - * NOTE : Apple doesn't currently support backgrounding UDP sockets. (Only TCP for now). -**/ -//- (BOOL)enableBackgroundingOnSockets; - -#endif - -#pragma mark Utilities - -/** - * Extracting host/port/family information from raw address data. -**/ - -+ (nullable NSString *)hostFromAddress:(NSData *)address; -+ (uint16_t)portFromAddress:(NSData *)address; -+ (int)familyFromAddress:(NSData *)address; - -+ (BOOL)isIPv4Address:(NSData *)address; -+ (BOOL)isIPv6Address:(NSData *)address; - -+ (BOOL)getHost:(NSString * __nullable * __nullable)hostPtr port:(uint16_t * __nullable)portPtr fromAddress:(NSData *)address; -+ (BOOL)getHost:(NSString * __nullable * __nullable)hostPtr port:(uint16_t * __nullable)portPtr family:(int * __nullable)afPtr fromAddress:(NSData *)address; - -@end - -NS_ASSUME_NONNULL_END diff --git a/ios/Pods/CocoaAsyncSocket/Source/GCD/GCDAsyncUdpSocket.m b/ios/Pods/CocoaAsyncSocket/Source/GCD/GCDAsyncUdpSocket.m deleted file mode 100755 index b0c59c3..0000000 --- a/ios/Pods/CocoaAsyncSocket/Source/GCD/GCDAsyncUdpSocket.m +++ /dev/null @@ -1,5632 +0,0 @@ -// -// GCDAsyncUdpSocket -// -// This class is in the public domain. -// Originally created by Robbie Hanson of Deusty LLC. -// Updated and maintained by Deusty LLC and the Apple development community. -// -// https://github.com/robbiehanson/CocoaAsyncSocket -// - -#import "GCDAsyncUdpSocket.h" - -#if ! __has_feature(objc_arc) -#warning This file must be compiled with ARC. Use -fobjc-arc flag (or convert project to ARC). -// For more information see: https://github.com/robbiehanson/CocoaAsyncSocket/wiki/ARC -#endif - -#if TARGET_OS_IPHONE - #import - #import -#endif - -#import -#import -#import -#import -#import -#import -#import - - -#if 0 - -// Logging Enabled - See log level below - -// Logging uses the CocoaLumberjack framework (which is also GCD based). -// https://github.com/robbiehanson/CocoaLumberjack -// -// It allows us to do a lot of logging without significantly slowing down the code. -#import "DDLog.h" - -#define LogAsync NO -#define LogContext 65535 - -#define LogObjc(flg, frmt, ...) LOG_OBJC_MAYBE(LogAsync, logLevel, flg, LogContext, frmt, ##__VA_ARGS__) -#define LogC(flg, frmt, ...) LOG_C_MAYBE(LogAsync, logLevel, flg, LogContext, frmt, ##__VA_ARGS__) - -#define LogError(frmt, ...) LogObjc(LOG_FLAG_ERROR, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) -#define LogWarn(frmt, ...) LogObjc(LOG_FLAG_WARN, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) -#define LogInfo(frmt, ...) LogObjc(LOG_FLAG_INFO, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) -#define LogVerbose(frmt, ...) LogObjc(LOG_FLAG_VERBOSE, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) - -#define LogCError(frmt, ...) LogC(LOG_FLAG_ERROR, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) -#define LogCWarn(frmt, ...) LogC(LOG_FLAG_WARN, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) -#define LogCInfo(frmt, ...) LogC(LOG_FLAG_INFO, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) -#define LogCVerbose(frmt, ...) LogC(LOG_FLAG_VERBOSE, (@"%@: " frmt), THIS_FILE, ##__VA_ARGS__) - -#define LogTrace() LogObjc(LOG_FLAG_VERBOSE, @"%@: %@", THIS_FILE, THIS_METHOD) -#define LogCTrace() LogC(LOG_FLAG_VERBOSE, @"%@: %s", THIS_FILE, __FUNCTION__) - -// Log levels : off, error, warn, info, verbose -static const int logLevel = LOG_LEVEL_VERBOSE; - -#else - -// Logging Disabled - -#define LogError(frmt, ...) {} -#define LogWarn(frmt, ...) {} -#define LogInfo(frmt, ...) {} -#define LogVerbose(frmt, ...) {} - -#define LogCError(frmt, ...) {} -#define LogCWarn(frmt, ...) {} -#define LogCInfo(frmt, ...) {} -#define LogCVerbose(frmt, ...) {} - -#define LogTrace() {} -#define LogCTrace(frmt, ...) {} - -#endif - -/** - * Seeing a return statements within an inner block - * can sometimes be mistaken for a return point of the enclosing method. - * This makes inline blocks a bit easier to read. -**/ -#define return_from_block return - -/** - * A socket file descriptor is really just an integer. - * It represents the index of the socket within the kernel. - * This makes invalid file descriptor comparisons easier to read. -**/ -#define SOCKET_NULL -1 - -/** - * Just to type less code. -**/ -#define AutoreleasedBlock(block) ^{ @autoreleasepool { block(); }} - - -@class GCDAsyncUdpSendPacket; - -NSString *const GCDAsyncUdpSocketException = @"GCDAsyncUdpSocketException"; -NSString *const GCDAsyncUdpSocketErrorDomain = @"GCDAsyncUdpSocketErrorDomain"; - -NSString *const GCDAsyncUdpSocketQueueName = @"GCDAsyncUdpSocket"; -NSString *const GCDAsyncUdpSocketThreadName = @"GCDAsyncUdpSocket-CFStream"; - -enum GCDAsyncUdpSocketFlags -{ - kDidCreateSockets = 1 << 0, // If set, the sockets have been created. - kDidBind = 1 << 1, // If set, bind has been called. - kConnecting = 1 << 2, // If set, a connection attempt is in progress. - kDidConnect = 1 << 3, // If set, socket is connected. - kReceiveOnce = 1 << 4, // If set, one-at-a-time receive is enabled - kReceiveContinuous = 1 << 5, // If set, continuous receive is enabled - kIPv4Deactivated = 1 << 6, // If set, socket4 was closed due to bind or connect on IPv6. - kIPv6Deactivated = 1 << 7, // If set, socket6 was closed due to bind or connect on IPv4. - kSend4SourceSuspended = 1 << 8, // If set, send4Source is suspended. - kSend6SourceSuspended = 1 << 9, // If set, send6Source is suspended. - kReceive4SourceSuspended = 1 << 10, // If set, receive4Source is suspended. - kReceive6SourceSuspended = 1 << 11, // If set, receive6Source is suspended. - kSock4CanAcceptBytes = 1 << 12, // If set, we know socket4 can accept bytes. If unset, it's unknown. - kSock6CanAcceptBytes = 1 << 13, // If set, we know socket6 can accept bytes. If unset, it's unknown. - kForbidSendReceive = 1 << 14, // If set, no new send or receive operations are allowed to be queued. - kCloseAfterSends = 1 << 15, // If set, close as soon as no more sends are queued. - kFlipFlop = 1 << 16, // Used to alternate between IPv4 and IPv6 sockets. -#if TARGET_OS_IPHONE - kAddedStreamListener = 1 << 17, // If set, CFStreams have been added to listener thread -#endif -}; - -enum GCDAsyncUdpSocketConfig -{ - kIPv4Disabled = 1 << 0, // If set, IPv4 is disabled - kIPv6Disabled = 1 << 1, // If set, IPv6 is disabled - kPreferIPv4 = 1 << 2, // If set, IPv4 is preferred over IPv6 - kPreferIPv6 = 1 << 3, // If set, IPv6 is preferred over IPv4 -}; - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@interface GCDAsyncUdpSocket () -{ -#if __has_feature(objc_arc_weak) - __weak id delegate; -#else - __unsafe_unretained id delegate; -#endif - dispatch_queue_t delegateQueue; - - GCDAsyncUdpSocketReceiveFilterBlock receiveFilterBlock; - dispatch_queue_t receiveFilterQueue; - BOOL receiveFilterAsync; - - GCDAsyncUdpSocketSendFilterBlock sendFilterBlock; - dispatch_queue_t sendFilterQueue; - BOOL sendFilterAsync; - - uint32_t flags; - uint16_t config; - - uint16_t max4ReceiveSize; - uint32_t max6ReceiveSize; - - uint16_t maxSendSize; - - int socket4FD; - int socket6FD; - - dispatch_queue_t socketQueue; - - dispatch_source_t send4Source; - dispatch_source_t send6Source; - dispatch_source_t receive4Source; - dispatch_source_t receive6Source; - dispatch_source_t sendTimer; - - GCDAsyncUdpSendPacket *currentSend; - NSMutableArray *sendQueue; - - unsigned long socket4FDBytesAvailable; - unsigned long socket6FDBytesAvailable; - - uint32_t pendingFilterOperations; - - NSData *cachedLocalAddress4; - NSString *cachedLocalHost4; - uint16_t cachedLocalPort4; - - NSData *cachedLocalAddress6; - NSString *cachedLocalHost6; - uint16_t cachedLocalPort6; - - NSData *cachedConnectedAddress; - NSString *cachedConnectedHost; - uint16_t cachedConnectedPort; - int cachedConnectedFamily; - - void *IsOnSocketQueueOrTargetQueueKey; - -#if TARGET_OS_IPHONE - CFStreamClientContext streamContext; - CFReadStreamRef readStream4; - CFReadStreamRef readStream6; - CFWriteStreamRef writeStream4; - CFWriteStreamRef writeStream6; -#endif - - id userData; -} - -- (void)resumeSend4Source; -- (void)resumeSend6Source; -- (void)resumeReceive4Source; -- (void)resumeReceive6Source; -- (void)closeSockets; - -- (void)maybeConnect; -- (BOOL)connectWithAddress4:(NSData *)address4 error:(NSError **)errPtr; -- (BOOL)connectWithAddress6:(NSData *)address6 error:(NSError **)errPtr; - -- (void)maybeDequeueSend; -- (void)doPreSend; -- (void)doSend; -- (void)endCurrentSend; -- (void)setupSendTimerWithTimeout:(NSTimeInterval)timeout; - -- (void)doReceive; -- (void)doReceiveEOF; - -- (void)closeWithError:(NSError *)error; - -- (BOOL)performMulticastRequest:(int)requestType forGroup:(NSString *)group onInterface:(NSString *)interface error:(NSError **)errPtr; - -#if TARGET_OS_IPHONE -- (BOOL)createReadAndWriteStreams:(NSError **)errPtr; -- (BOOL)registerForStreamCallbacks:(NSError **)errPtr; -- (BOOL)addStreamsToRunLoop:(NSError **)errPtr; -- (BOOL)openStreams:(NSError **)errPtr; -- (void)removeStreamsFromRunLoop; -- (void)closeReadAndWriteStreams; -#endif - -+ (NSString *)hostFromSockaddr4:(const struct sockaddr_in *)pSockaddr4; -+ (NSString *)hostFromSockaddr6:(const struct sockaddr_in6 *)pSockaddr6; -+ (uint16_t)portFromSockaddr4:(const struct sockaddr_in *)pSockaddr4; -+ (uint16_t)portFromSockaddr6:(const struct sockaddr_in6 *)pSockaddr6; - -#if TARGET_OS_IPHONE -// Forward declaration -+ (void)listenerThread:(id)unused; -#endif - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * The GCDAsyncUdpSendPacket encompasses the instructions for a single send/write. -**/ -@interface GCDAsyncUdpSendPacket : NSObject { -@public - NSData *buffer; - NSTimeInterval timeout; - long tag; - - BOOL resolveInProgress; - BOOL filterInProgress; - - NSArray *resolvedAddresses; - NSError *resolveError; - - NSData *address; - int addressFamily; -} - -- (instancetype)initWithData:(NSData *)d timeout:(NSTimeInterval)t tag:(long)i NS_DESIGNATED_INITIALIZER; - -@end - -@implementation GCDAsyncUdpSendPacket - -// Cover the superclass' designated initializer -- (instancetype)init NS_UNAVAILABLE -{ - NSAssert(0, @"Use the designated initializer"); - return nil; -} - -- (instancetype)initWithData:(NSData *)d timeout:(NSTimeInterval)t tag:(long)i -{ - if ((self = [super init])) - { - buffer = d; - timeout = t; - tag = i; - - resolveInProgress = NO; - } - return self; -} - - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@interface GCDAsyncUdpSpecialPacket : NSObject { -@public -// uint8_t type; - - BOOL resolveInProgress; - - NSArray *addresses; - NSError *error; -} - -- (instancetype)init NS_DESIGNATED_INITIALIZER; - -@end - -@implementation GCDAsyncUdpSpecialPacket - -- (instancetype)init -{ - self = [super init]; - return self; -} - - -@end - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -@implementation GCDAsyncUdpSocket - -- (instancetype)init -{ - LogTrace(); - - return [self initWithDelegate:nil delegateQueue:NULL socketQueue:NULL]; -} - -- (instancetype)initWithSocketQueue:(dispatch_queue_t)sq -{ - LogTrace(); - - return [self initWithDelegate:nil delegateQueue:NULL socketQueue:sq]; -} - -- (instancetype)initWithDelegate:(id)aDelegate delegateQueue:(dispatch_queue_t)dq -{ - LogTrace(); - - return [self initWithDelegate:aDelegate delegateQueue:dq socketQueue:NULL]; -} - -- (instancetype)initWithDelegate:(id)aDelegate delegateQueue:(dispatch_queue_t)dq socketQueue:(dispatch_queue_t)sq -{ - LogTrace(); - - if ((self = [super init])) - { - delegate = aDelegate; - - if (dq) - { - delegateQueue = dq; - #if !OS_OBJECT_USE_OBJC - dispatch_retain(delegateQueue); - #endif - } - - max4ReceiveSize = 65535; - max6ReceiveSize = 65535; - - maxSendSize = 65535; - - socket4FD = SOCKET_NULL; - socket6FD = SOCKET_NULL; - - if (sq) - { - NSAssert(sq != dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), - @"The given socketQueue parameter must not be a concurrent queue."); - NSAssert(sq != dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), - @"The given socketQueue parameter must not be a concurrent queue."); - NSAssert(sq != dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), - @"The given socketQueue parameter must not be a concurrent queue."); - - socketQueue = sq; - #if !OS_OBJECT_USE_OBJC - dispatch_retain(socketQueue); - #endif - } - else - { - socketQueue = dispatch_queue_create([GCDAsyncUdpSocketQueueName UTF8String], NULL); - } - - // The dispatch_queue_set_specific() and dispatch_get_specific() functions take a "void *key" parameter. - // From the documentation: - // - // > Keys are only compared as pointers and are never dereferenced. - // > Thus, you can use a pointer to a static variable for a specific subsystem or - // > any other value that allows you to identify the value uniquely. - // - // We're just going to use the memory address of an ivar. - // Specifically an ivar that is explicitly named for our purpose to make the code more readable. - // - // However, it feels tedious (and less readable) to include the "&" all the time: - // dispatch_get_specific(&IsOnSocketQueueOrTargetQueueKey) - // - // So we're going to make it so it doesn't matter if we use the '&' or not, - // by assigning the value of the ivar to the address of the ivar. - // Thus: IsOnSocketQueueOrTargetQueueKey == &IsOnSocketQueueOrTargetQueueKey; - - IsOnSocketQueueOrTargetQueueKey = &IsOnSocketQueueOrTargetQueueKey; - - void *nonNullUnusedPointer = (__bridge void *)self; - dispatch_queue_set_specific(socketQueue, IsOnSocketQueueOrTargetQueueKey, nonNullUnusedPointer, NULL); - - currentSend = nil; - sendQueue = [[NSMutableArray alloc] initWithCapacity:5]; - - #if TARGET_OS_IPHONE - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(applicationWillEnterForeground:) - name:UIApplicationWillEnterForegroundNotification - object:nil]; - #endif - } - return self; -} - -- (void)dealloc -{ - LogInfo(@"%@ - %@ (start)", THIS_METHOD, self); - -#if TARGET_OS_IPHONE - [[NSNotificationCenter defaultCenter] removeObserver:self]; -#endif - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - [self closeWithError:nil]; - } - else - { - dispatch_sync(socketQueue, ^{ - [self closeWithError:nil]; - }); - } - - delegate = nil; - #if !OS_OBJECT_USE_OBJC - if (delegateQueue) dispatch_release(delegateQueue); - #endif - delegateQueue = NULL; - - #if !OS_OBJECT_USE_OBJC - if (socketQueue) dispatch_release(socketQueue); - #endif - socketQueue = NULL; - - LogInfo(@"%@ - %@ (finish)", THIS_METHOD, self); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Configuration -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (id)delegate -{ - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - return delegate; - } - else - { - __block id result = nil; - - dispatch_sync(socketQueue, ^{ - result = self->delegate; - }); - - return result; - } -} - -- (void)setDelegate:(id)newDelegate synchronously:(BOOL)synchronously -{ - dispatch_block_t block = ^{ - self->delegate = newDelegate; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) { - block(); - } - else { - if (synchronously) - dispatch_sync(socketQueue, block); - else - dispatch_async(socketQueue, block); - } -} - -- (void)setDelegate:(id)newDelegate -{ - [self setDelegate:newDelegate synchronously:NO]; -} - -- (void)synchronouslySetDelegate:(id)newDelegate -{ - [self setDelegate:newDelegate synchronously:YES]; -} - -- (dispatch_queue_t)delegateQueue -{ - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - return delegateQueue; - } - else - { - __block dispatch_queue_t result = NULL; - - dispatch_sync(socketQueue, ^{ - result = self->delegateQueue; - }); - - return result; - } -} - -- (void)setDelegateQueue:(dispatch_queue_t)newDelegateQueue synchronously:(BOOL)synchronously -{ - dispatch_block_t block = ^{ - - #if !OS_OBJECT_USE_OBJC - if (self->delegateQueue) dispatch_release(self->delegateQueue); - if (newDelegateQueue) dispatch_retain(newDelegateQueue); - #endif - - self->delegateQueue = newDelegateQueue; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) { - block(); - } - else { - if (synchronously) - dispatch_sync(socketQueue, block); - else - dispatch_async(socketQueue, block); - } -} - -- (void)setDelegateQueue:(dispatch_queue_t)newDelegateQueue -{ - [self setDelegateQueue:newDelegateQueue synchronously:NO]; -} - -- (void)synchronouslySetDelegateQueue:(dispatch_queue_t)newDelegateQueue -{ - [self setDelegateQueue:newDelegateQueue synchronously:YES]; -} - -- (void)getDelegate:(id *)delegatePtr delegateQueue:(dispatch_queue_t *)delegateQueuePtr -{ - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - if (delegatePtr) *delegatePtr = delegate; - if (delegateQueuePtr) *delegateQueuePtr = delegateQueue; - } - else - { - __block id dPtr = NULL; - __block dispatch_queue_t dqPtr = NULL; - - dispatch_sync(socketQueue, ^{ - dPtr = self->delegate; - dqPtr = self->delegateQueue; - }); - - if (delegatePtr) *delegatePtr = dPtr; - if (delegateQueuePtr) *delegateQueuePtr = dqPtr; - } -} - -- (void)setDelegate:(id)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue synchronously:(BOOL)synchronously -{ - dispatch_block_t block = ^{ - - self->delegate = newDelegate; - - #if !OS_OBJECT_USE_OBJC - if (self->delegateQueue) dispatch_release(self->delegateQueue); - if (newDelegateQueue) dispatch_retain(newDelegateQueue); - #endif - - self->delegateQueue = newDelegateQueue; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) { - block(); - } - else { - if (synchronously) - dispatch_sync(socketQueue, block); - else - dispatch_async(socketQueue, block); - } -} - -- (void)setDelegate:(id)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue -{ - [self setDelegate:newDelegate delegateQueue:newDelegateQueue synchronously:NO]; -} - -- (void)synchronouslySetDelegate:(id)newDelegate delegateQueue:(dispatch_queue_t)newDelegateQueue -{ - [self setDelegate:newDelegate delegateQueue:newDelegateQueue synchronously:YES]; -} - -- (BOOL)isIPv4Enabled -{ - // Note: YES means kIPv4Disabled is OFF - - __block BOOL result = NO; - - dispatch_block_t block = ^{ - - result = ((self->config & kIPv4Disabled) == 0); - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -- (void)setIPv4Enabled:(BOOL)flag -{ - // Note: YES means kIPv4Disabled is OFF - - dispatch_block_t block = ^{ - - LogVerbose(@"%@ %@", THIS_METHOD, (flag ? @"YES" : @"NO")); - - if (flag) - self->config &= ~kIPv4Disabled; - else - self->config |= kIPv4Disabled; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -- (BOOL)isIPv6Enabled -{ - // Note: YES means kIPv6Disabled is OFF - - __block BOOL result = NO; - - dispatch_block_t block = ^{ - - result = ((self->config & kIPv6Disabled) == 0); - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -- (void)setIPv6Enabled:(BOOL)flag -{ - // Note: YES means kIPv6Disabled is OFF - - dispatch_block_t block = ^{ - - LogVerbose(@"%@ %@", THIS_METHOD, (flag ? @"YES" : @"NO")); - - if (flag) - self->config &= ~kIPv6Disabled; - else - self->config |= kIPv6Disabled; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -- (BOOL)isIPv4Preferred -{ - __block BOOL result = NO; - - dispatch_block_t block = ^{ - result = (self->config & kPreferIPv4) ? YES : NO; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -- (BOOL)isIPv6Preferred -{ - __block BOOL result = NO; - - dispatch_block_t block = ^{ - result = (self->config & kPreferIPv6) ? YES : NO; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -- (BOOL)isIPVersionNeutral -{ - __block BOOL result = NO; - - dispatch_block_t block = ^{ - result = (self->config & (kPreferIPv4 | kPreferIPv6)) == 0; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -- (void)setPreferIPv4 -{ - dispatch_block_t block = ^{ - - LogTrace(); - - self->config |= kPreferIPv4; - self->config &= ~kPreferIPv6; - - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -- (void)setPreferIPv6 -{ - dispatch_block_t block = ^{ - - LogTrace(); - - self->config &= ~kPreferIPv4; - self->config |= kPreferIPv6; - - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -- (void)setIPVersionNeutral -{ - dispatch_block_t block = ^{ - - LogTrace(); - - self->config &= ~kPreferIPv4; - self->config &= ~kPreferIPv6; - - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -- (uint16_t)maxReceiveIPv4BufferSize -{ - __block uint16_t result = 0; - - dispatch_block_t block = ^{ - - result = self->max4ReceiveSize; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -- (void)setMaxReceiveIPv4BufferSize:(uint16_t)max -{ - dispatch_block_t block = ^{ - - LogVerbose(@"%@ %u", THIS_METHOD, (unsigned)max); - - self->max4ReceiveSize = max; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -- (uint32_t)maxReceiveIPv6BufferSize -{ - __block uint32_t result = 0; - - dispatch_block_t block = ^{ - - result = self->max6ReceiveSize; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -- (void)setMaxReceiveIPv6BufferSize:(uint32_t)max -{ - dispatch_block_t block = ^{ - - LogVerbose(@"%@ %u", THIS_METHOD, (unsigned)max); - - self->max6ReceiveSize = max; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -- (void)setMaxSendBufferSize:(uint16_t)max -{ - dispatch_block_t block = ^{ - - LogVerbose(@"%@ %u", THIS_METHOD, (unsigned)max); - - self->maxSendSize = max; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -- (uint16_t)maxSendBufferSize -{ - __block uint16_t result = 0; - - dispatch_block_t block = ^{ - - result = self->maxSendSize; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -- (id)userData -{ - __block id result = nil; - - dispatch_block_t block = ^{ - - result = self->userData; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -- (void)setUserData:(id)arbitraryUserData -{ - dispatch_block_t block = ^{ - - if (self->userData != arbitraryUserData) - { - self->userData = arbitraryUserData; - } - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Delegate Helpers -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)notifyDidConnectToAddress:(NSData *)anAddress -{ - LogTrace(); - - __strong id theDelegate = delegate; - if (delegateQueue && [theDelegate respondsToSelector:@selector(udpSocket:didConnectToAddress:)]) - { - NSData *address = [anAddress copy]; // In case param is NSMutableData - - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - [theDelegate udpSocket:self didConnectToAddress:address]; - }}); - } -} - -- (void)notifyDidNotConnect:(NSError *)error -{ - LogTrace(); - - __strong id theDelegate = delegate; - if (delegateQueue && [theDelegate respondsToSelector:@selector(udpSocket:didNotConnect:)]) - { - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - [theDelegate udpSocket:self didNotConnect:error]; - }}); - } -} - -- (void)notifyDidSendDataWithTag:(long)tag -{ - LogTrace(); - - __strong id theDelegate = delegate; - if (delegateQueue && [theDelegate respondsToSelector:@selector(udpSocket:didSendDataWithTag:)]) - { - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - [theDelegate udpSocket:self didSendDataWithTag:tag]; - }}); - } -} - -- (void)notifyDidNotSendDataWithTag:(long)tag dueToError:(NSError *)error -{ - LogTrace(); - - __strong id theDelegate = delegate; - if (delegateQueue && [theDelegate respondsToSelector:@selector(udpSocket:didNotSendDataWithTag:dueToError:)]) - { - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - [theDelegate udpSocket:self didNotSendDataWithTag:tag dueToError:error]; - }}); - } -} - -- (void)notifyDidReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)context -{ - LogTrace(); - - SEL selector = @selector(udpSocket:didReceiveData:fromAddress:withFilterContext:); - - __strong id theDelegate = delegate; - if (delegateQueue && [theDelegate respondsToSelector:selector]) - { - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - [theDelegate udpSocket:self didReceiveData:data fromAddress:address withFilterContext:context]; - }}); - } -} - -- (void)notifyDidCloseWithError:(NSError *)error -{ - LogTrace(); - - __strong id theDelegate = delegate; - if (delegateQueue && [theDelegate respondsToSelector:@selector(udpSocketDidClose:withError:)]) - { - dispatch_async(delegateQueue, ^{ @autoreleasepool { - - [theDelegate udpSocketDidClose:self withError:error]; - }}); - } -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Errors -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (NSError *)badConfigError:(NSString *)errMsg -{ - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - return [NSError errorWithDomain:GCDAsyncUdpSocketErrorDomain - code:GCDAsyncUdpSocketBadConfigError - userInfo:userInfo]; -} - -- (NSError *)badParamError:(NSString *)errMsg -{ - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - return [NSError errorWithDomain:GCDAsyncUdpSocketErrorDomain - code:GCDAsyncUdpSocketBadParamError - userInfo:userInfo]; -} - -- (NSError *)gaiError:(int)gai_error -{ - NSString *errMsg = [NSString stringWithCString:gai_strerror(gai_error) encoding:NSASCIIStringEncoding]; - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - return [NSError errorWithDomain:@"kCFStreamErrorDomainNetDB" code:gai_error userInfo:userInfo]; -} - -- (NSError *)errnoErrorWithReason:(NSString *)reason -{ - NSString *errMsg = [NSString stringWithUTF8String:strerror(errno)]; - NSDictionary *userInfo; - - if (reason) - userInfo = @{NSLocalizedDescriptionKey : errMsg, - NSLocalizedFailureReasonErrorKey : reason}; - else - userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - return [NSError errorWithDomain:NSPOSIXErrorDomain code:errno userInfo:userInfo]; -} - -- (NSError *)errnoError -{ - return [self errnoErrorWithReason:nil]; -} - -/** - * Returns a standard send timeout error. -**/ -- (NSError *)sendTimeoutError -{ - NSString *errMsg = NSLocalizedStringWithDefaultValue(@"GCDAsyncUdpSocketSendTimeoutError", - @"GCDAsyncUdpSocket", [NSBundle mainBundle], - @"Send operation timed out", nil); - - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - return [NSError errorWithDomain:GCDAsyncUdpSocketErrorDomain - code:GCDAsyncUdpSocketSendTimeoutError - userInfo:userInfo]; -} - -- (NSError *)socketClosedError -{ - NSString *errMsg = NSLocalizedStringWithDefaultValue(@"GCDAsyncUdpSocketClosedError", - @"GCDAsyncUdpSocket", [NSBundle mainBundle], - @"Socket closed", nil); - - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - return [NSError errorWithDomain:GCDAsyncUdpSocketErrorDomain code:GCDAsyncUdpSocketClosedError userInfo:userInfo]; -} - -- (NSError *)otherError:(NSString *)errMsg -{ - NSDictionary *userInfo = @{NSLocalizedDescriptionKey : errMsg}; - - return [NSError errorWithDomain:GCDAsyncUdpSocketErrorDomain - code:GCDAsyncUdpSocketOtherError - userInfo:userInfo]; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Utilities -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (BOOL)preOp:(NSError **)errPtr -{ - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - if (delegate == nil) // Must have delegate set - { - if (errPtr) - { - NSString *msg = @"Attempting to use socket without a delegate. Set a delegate first."; - *errPtr = [self badConfigError:msg]; - } - return NO; - } - - if (delegateQueue == NULL) // Must have delegate queue set - { - if (errPtr) - { - NSString *msg = @"Attempting to use socket without a delegate queue. Set a delegate queue first."; - *errPtr = [self badConfigError:msg]; - } - return NO; - } - - return YES; -} - -/** - * This method executes on a global concurrent queue. - * When complete, it executes the given completion block on the socketQueue. -**/ -- (void)asyncResolveHost:(NSString *)aHost - port:(uint16_t)port - withCompletionBlock:(void (^)(NSArray *addresses, NSError *error))completionBlock -{ - LogTrace(); - - // Check parameter(s) - - if (aHost == nil) - { - NSString *msg = @"The host param is nil. Should be domain name or IP address string."; - NSError *error = [self badParamError:msg]; - - // We should still use dispatch_async since this method is expected to be asynchronous - - dispatch_async(socketQueue, ^{ @autoreleasepool { - - completionBlock(nil, error); - }}); - - return; - } - - // It's possible that the given aHost parameter is actually a NSMutableString. - // So we want to copy it now, within this block that will be executed synchronously. - // This way the asynchronous lookup block below doesn't have to worry about it changing. - - NSString *host = [aHost copy]; - - - dispatch_queue_t globalConcurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); - dispatch_async(globalConcurrentQueue, ^{ @autoreleasepool { - - NSMutableArray *addresses = [NSMutableArray arrayWithCapacity:2]; - NSError *error = nil; - - if ([host isEqualToString:@"localhost"] || [host isEqualToString:@"loopback"]) - { - // Use LOOPBACK address - struct sockaddr_in sockaddr4; - memset(&sockaddr4, 0, sizeof(sockaddr4)); - - sockaddr4.sin_len = sizeof(struct sockaddr_in); - sockaddr4.sin_family = AF_INET; - sockaddr4.sin_port = htons(port); - sockaddr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - - struct sockaddr_in6 sockaddr6; - memset(&sockaddr6, 0, sizeof(sockaddr6)); - - sockaddr6.sin6_len = sizeof(struct sockaddr_in6); - sockaddr6.sin6_family = AF_INET6; - sockaddr6.sin6_port = htons(port); - sockaddr6.sin6_addr = in6addr_loopback; - - // Wrap the native address structures and add to list - [addresses addObject:[NSData dataWithBytes:&sockaddr4 length:sizeof(sockaddr4)]]; - [addresses addObject:[NSData dataWithBytes:&sockaddr6 length:sizeof(sockaddr6)]]; - } - else - { - NSString *portStr = [NSString stringWithFormat:@"%hu", port]; - - struct addrinfo hints, *res, *res0; - - memset(&hints, 0, sizeof(hints)); - hints.ai_family = PF_UNSPEC; - hints.ai_socktype = SOCK_DGRAM; - hints.ai_protocol = IPPROTO_UDP; - - int gai_error = getaddrinfo([host UTF8String], [portStr UTF8String], &hints, &res0); - - if (gai_error) - { - error = [self gaiError:gai_error]; - } - else - { - for(res = res0; res; res = res->ai_next) - { - if (res->ai_family == AF_INET) - { - // Found IPv4 address - // Wrap the native address structure and add to list - - [addresses addObject:[NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]]; - } - else if (res->ai_family == AF_INET6) - { - - // Fixes connection issues with IPv6, it is the same solution for udp socket. - // https://github.com/robbiehanson/CocoaAsyncSocket/issues/429#issuecomment-222477158 - struct sockaddr_in6 *sockaddr = (struct sockaddr_in6 *)(void *)res->ai_addr; - in_port_t *portPtr = &sockaddr->sin6_port; - if ((portPtr != NULL) && (*portPtr == 0)) { - *portPtr = htons(port); - } - - // Found IPv6 address - // Wrap the native address structure and add to list - [addresses addObject:[NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]]; - } - } - freeaddrinfo(res0); - - if ([addresses count] == 0) - { - error = [self gaiError:EAI_FAIL]; - } - } - } - - dispatch_async(self->socketQueue, ^{ @autoreleasepool { - - completionBlock(addresses, error); - }}); - - }}); -} - -/** - * This method picks an address from the given list of addresses. - * The address picked depends upon which protocols are disabled, deactived, & preferred. - * - * Returns the address family (AF_INET or AF_INET6) of the picked address, - * or AF_UNSPEC and the corresponding error is there's a problem. -**/ -- (int)getAddress:(NSData **)addressPtr error:(NSError **)errorPtr fromAddresses:(NSArray *)addresses -{ - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - NSAssert([addresses count] > 0, @"Expected at least one address"); - - int resultAF = AF_UNSPEC; - NSData *resultAddress = nil; - NSError *resultError = nil; - - // Check for problems - - BOOL resolvedIPv4Address = NO; - BOOL resolvedIPv6Address = NO; - - for (NSData *address in addresses) - { - switch ([[self class] familyFromAddress:address]) - { - case AF_INET : resolvedIPv4Address = YES; break; - case AF_INET6 : resolvedIPv6Address = YES; break; - - default : NSAssert(NO, @"Addresses array contains invalid address"); - } - } - - BOOL isIPv4Disabled = (config & kIPv4Disabled) ? YES : NO; - BOOL isIPv6Disabled = (config & kIPv6Disabled) ? YES : NO; - - if (isIPv4Disabled && !resolvedIPv6Address) - { - NSString *msg = @"IPv4 has been disabled and DNS lookup found no IPv6 address(es)."; - resultError = [self otherError:msg]; - - if (addressPtr) *addressPtr = resultAddress; - if (errorPtr) *errorPtr = resultError; - - return resultAF; - } - - if (isIPv6Disabled && !resolvedIPv4Address) - { - NSString *msg = @"IPv6 has been disabled and DNS lookup found no IPv4 address(es)."; - resultError = [self otherError:msg]; - - if (addressPtr) *addressPtr = resultAddress; - if (errorPtr) *errorPtr = resultError; - - return resultAF; - } - - BOOL isIPv4Deactivated = (flags & kIPv4Deactivated) ? YES : NO; - BOOL isIPv6Deactivated = (flags & kIPv6Deactivated) ? YES : NO; - - if (isIPv4Deactivated && !resolvedIPv6Address) - { - NSString *msg = @"IPv4 has been deactivated due to bind/connect, and DNS lookup found no IPv6 address(es)."; - resultError = [self otherError:msg]; - - if (addressPtr) *addressPtr = resultAddress; - if (errorPtr) *errorPtr = resultError; - - return resultAF; - } - - if (isIPv6Deactivated && !resolvedIPv4Address) - { - NSString *msg = @"IPv6 has been deactivated due to bind/connect, and DNS lookup found no IPv4 address(es)."; - resultError = [self otherError:msg]; - - if (addressPtr) *addressPtr = resultAddress; - if (errorPtr) *errorPtr = resultError; - - return resultAF; - } - - // Extract first IPv4 and IPv6 address in list - - BOOL ipv4WasFirstInList = YES; - NSData *address4 = nil; - NSData *address6 = nil; - - for (NSData *address in addresses) - { - int af = [[self class] familyFromAddress:address]; - - if (af == AF_INET) - { - if (address4 == nil) - { - address4 = address; - - if (address6) - break; - else - ipv4WasFirstInList = YES; - } - } - else // af == AF_INET6 - { - if (address6 == nil) - { - address6 = address; - - if (address4) - break; - else - ipv4WasFirstInList = NO; - } - } - } - - // Determine socket type - - BOOL preferIPv4 = (config & kPreferIPv4) ? YES : NO; - BOOL preferIPv6 = (config & kPreferIPv6) ? YES : NO; - - BOOL useIPv4 = ((preferIPv4 && address4) || (address6 == nil)); - BOOL useIPv6 = ((preferIPv6 && address6) || (address4 == nil)); - - NSAssert(!(preferIPv4 && preferIPv6), @"Invalid config state"); - NSAssert(!(useIPv4 && useIPv6), @"Invalid logic"); - - if (useIPv4 || (!useIPv6 && ipv4WasFirstInList)) - { - resultAF = AF_INET; - resultAddress = address4; - } - else - { - resultAF = AF_INET6; - resultAddress = address6; - } - - if (addressPtr) *addressPtr = resultAddress; - if (errorPtr) *errorPtr = resultError; - - return resultAF; -} - -/** - * Finds the address(es) of an interface description. - * An inteface description may be an interface name (en0, en1, lo0) or corresponding IP (192.168.4.34). -**/ -- (void)convertIntefaceDescription:(NSString *)interfaceDescription - port:(uint16_t)port - intoAddress4:(NSData **)interfaceAddr4Ptr - address6:(NSData **)interfaceAddr6Ptr -{ - NSData *addr4 = nil; - NSData *addr6 = nil; - - if (interfaceDescription == nil) - { - // ANY address - - struct sockaddr_in sockaddr4; - memset(&sockaddr4, 0, sizeof(sockaddr4)); - - sockaddr4.sin_len = sizeof(sockaddr4); - sockaddr4.sin_family = AF_INET; - sockaddr4.sin_port = htons(port); - sockaddr4.sin_addr.s_addr = htonl(INADDR_ANY); - - struct sockaddr_in6 sockaddr6; - memset(&sockaddr6, 0, sizeof(sockaddr6)); - - sockaddr6.sin6_len = sizeof(sockaddr6); - sockaddr6.sin6_family = AF_INET6; - sockaddr6.sin6_port = htons(port); - sockaddr6.sin6_addr = in6addr_any; - - addr4 = [NSData dataWithBytes:&sockaddr4 length:sizeof(sockaddr4)]; - addr6 = [NSData dataWithBytes:&sockaddr6 length:sizeof(sockaddr6)]; - } - else if ([interfaceDescription isEqualToString:@"localhost"] || - [interfaceDescription isEqualToString:@"loopback"]) - { - // LOOPBACK address - - struct sockaddr_in sockaddr4; - memset(&sockaddr4, 0, sizeof(sockaddr4)); - - sockaddr4.sin_len = sizeof(struct sockaddr_in); - sockaddr4.sin_family = AF_INET; - sockaddr4.sin_port = htons(port); - sockaddr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - - struct sockaddr_in6 sockaddr6; - memset(&sockaddr6, 0, sizeof(sockaddr6)); - - sockaddr6.sin6_len = sizeof(struct sockaddr_in6); - sockaddr6.sin6_family = AF_INET6; - sockaddr6.sin6_port = htons(port); - sockaddr6.sin6_addr = in6addr_loopback; - - addr4 = [NSData dataWithBytes:&sockaddr4 length:sizeof(sockaddr4)]; - addr6 = [NSData dataWithBytes:&sockaddr6 length:sizeof(sockaddr6)]; - } - else - { - const char *iface = [interfaceDescription UTF8String]; - - struct ifaddrs *addrs; - const struct ifaddrs *cursor; - - if ((getifaddrs(&addrs) == 0)) - { - cursor = addrs; - while (cursor != NULL) - { - if ((addr4 == nil) && (cursor->ifa_addr->sa_family == AF_INET)) - { - // IPv4 - - struct sockaddr_in *addr = (struct sockaddr_in *)(void *)cursor->ifa_addr; - - if (strcmp(cursor->ifa_name, iface) == 0) - { - // Name match - - struct sockaddr_in nativeAddr4 = *addr; - nativeAddr4.sin_port = htons(port); - - addr4 = [NSData dataWithBytes:&nativeAddr4 length:sizeof(nativeAddr4)]; - } - else - { - char ip[INET_ADDRSTRLEN]; - - const char *conversion; - conversion = inet_ntop(AF_INET, &addr->sin_addr, ip, sizeof(ip)); - - if ((conversion != NULL) && (strcmp(ip, iface) == 0)) - { - // IP match - - struct sockaddr_in nativeAddr4 = *addr; - nativeAddr4.sin_port = htons(port); - - addr4 = [NSData dataWithBytes:&nativeAddr4 length:sizeof(nativeAddr4)]; - } - } - } - else if ((addr6 == nil) && (cursor->ifa_addr->sa_family == AF_INET6)) - { - // IPv6 - - const struct sockaddr_in6 *addr = (const struct sockaddr_in6 *)(const void *)cursor->ifa_addr; - - if (strcmp(cursor->ifa_name, iface) == 0) - { - // Name match - - struct sockaddr_in6 nativeAddr6 = *addr; - nativeAddr6.sin6_port = htons(port); - - addr6 = [NSData dataWithBytes:&nativeAddr6 length:sizeof(nativeAddr6)]; - } - else - { - char ip[INET6_ADDRSTRLEN]; - - const char *conversion; - conversion = inet_ntop(AF_INET6, &addr->sin6_addr, ip, sizeof(ip)); - - if ((conversion != NULL) && (strcmp(ip, iface) == 0)) - { - // IP match - - struct sockaddr_in6 nativeAddr6 = *addr; - nativeAddr6.sin6_port = htons(port); - - addr6 = [NSData dataWithBytes:&nativeAddr6 length:sizeof(nativeAddr6)]; - } - } - } - - cursor = cursor->ifa_next; - } - - freeifaddrs(addrs); - } - } - - if (interfaceAddr4Ptr) *interfaceAddr4Ptr = addr4; - if (interfaceAddr6Ptr) *interfaceAddr6Ptr = addr6; -} - -/** - * Converts a numeric hostname into its corresponding address. - * The hostname is expected to be an IPv4 or IPv6 address represented as a human-readable string. (e.g. 192.168.4.34) -**/ -- (void)convertNumericHost:(NSString *)numericHost - port:(uint16_t)port - intoAddress4:(NSData **)addr4Ptr - address6:(NSData **)addr6Ptr -{ - NSData *addr4 = nil; - NSData *addr6 = nil; - - if (numericHost) - { - NSString *portStr = [NSString stringWithFormat:@"%hu", port]; - - struct addrinfo hints, *res, *res0; - - memset(&hints, 0, sizeof(hints)); - hints.ai_family = PF_UNSPEC; - hints.ai_socktype = SOCK_DGRAM; - hints.ai_protocol = IPPROTO_UDP; - hints.ai_flags = AI_NUMERICHOST; // No name resolution should be attempted - - if (getaddrinfo([numericHost UTF8String], [portStr UTF8String], &hints, &res0) == 0) - { - for (res = res0; res; res = res->ai_next) - { - if ((addr4 == nil) && (res->ai_family == AF_INET)) - { - // Found IPv4 address - // Wrap the native address structure - addr4 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]; - } - else if ((addr6 == nil) && (res->ai_family == AF_INET6)) - { - // Found IPv6 address - // Wrap the native address structure - addr6 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]; - } - } - freeaddrinfo(res0); - } - } - - if (addr4Ptr) *addr4Ptr = addr4; - if (addr6Ptr) *addr6Ptr = addr6; -} - -- (BOOL)isConnectedToAddress4:(NSData *)someAddr4 -{ - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - NSAssert(flags & kDidConnect, @"Not connected"); - NSAssert(cachedConnectedAddress, @"Expected cached connected address"); - - if (cachedConnectedFamily != AF_INET) - { - return NO; - } - - const struct sockaddr_in *sSockaddr4 = (const struct sockaddr_in *)[someAddr4 bytes]; - const struct sockaddr_in *cSockaddr4 = (const struct sockaddr_in *)[cachedConnectedAddress bytes]; - - if (memcmp(&sSockaddr4->sin_addr, &cSockaddr4->sin_addr, sizeof(struct in_addr)) != 0) - { - return NO; - } - if (memcmp(&sSockaddr4->sin_port, &cSockaddr4->sin_port, sizeof(in_port_t)) != 0) - { - return NO; - } - - return YES; -} - -- (BOOL)isConnectedToAddress6:(NSData *)someAddr6 -{ - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - NSAssert(flags & kDidConnect, @"Not connected"); - NSAssert(cachedConnectedAddress, @"Expected cached connected address"); - - if (cachedConnectedFamily != AF_INET6) - { - return NO; - } - - const struct sockaddr_in6 *sSockaddr6 = (const struct sockaddr_in6 *)[someAddr6 bytes]; - const struct sockaddr_in6 *cSockaddr6 = (const struct sockaddr_in6 *)[cachedConnectedAddress bytes]; - - if (memcmp(&sSockaddr6->sin6_addr, &cSockaddr6->sin6_addr, sizeof(struct in6_addr)) != 0) - { - return NO; - } - if (memcmp(&sSockaddr6->sin6_port, &cSockaddr6->sin6_port, sizeof(in_port_t)) != 0) - { - return NO; - } - - return YES; -} - -- (unsigned int)indexOfInterfaceAddr4:(NSData *)interfaceAddr4 -{ - if (interfaceAddr4 == nil) - return 0; - if ([interfaceAddr4 length] != sizeof(struct sockaddr_in)) - return 0; - - int result = 0; - const struct sockaddr_in *ifaceAddr = (const struct sockaddr_in *)[interfaceAddr4 bytes]; - - struct ifaddrs *addrs; - const struct ifaddrs *cursor; - - if ((getifaddrs(&addrs) == 0)) - { - cursor = addrs; - while (cursor != NULL) - { - if (cursor->ifa_addr->sa_family == AF_INET) - { - // IPv4 - - const struct sockaddr_in *addr = (const struct sockaddr_in *)(const void *)cursor->ifa_addr; - - if (memcmp(&addr->sin_addr, &ifaceAddr->sin_addr, sizeof(struct in_addr)) == 0) - { - result = if_nametoindex(cursor->ifa_name); - break; - } - } - - cursor = cursor->ifa_next; - } - - freeifaddrs(addrs); - } - - return result; -} - -- (unsigned int)indexOfInterfaceAddr6:(NSData *)interfaceAddr6 -{ - if (interfaceAddr6 == nil) - return 0; - if ([interfaceAddr6 length] != sizeof(struct sockaddr_in6)) - return 0; - - int result = 0; - const struct sockaddr_in6 *ifaceAddr = (const struct sockaddr_in6 *)[interfaceAddr6 bytes]; - - struct ifaddrs *addrs; - const struct ifaddrs *cursor; - - if ((getifaddrs(&addrs) == 0)) - { - cursor = addrs; - while (cursor != NULL) - { - if (cursor->ifa_addr->sa_family == AF_INET6) - { - // IPv6 - - const struct sockaddr_in6 *addr = (const struct sockaddr_in6 *)(const void *)cursor->ifa_addr; - - if (memcmp(&addr->sin6_addr, &ifaceAddr->sin6_addr, sizeof(struct in6_addr)) == 0) - { - result = if_nametoindex(cursor->ifa_name); - break; - } - } - - cursor = cursor->ifa_next; - } - - freeifaddrs(addrs); - } - - return result; -} - -- (void)setupSendAndReceiveSourcesForSocket4 -{ - LogTrace(); - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - send4Source = dispatch_source_create(DISPATCH_SOURCE_TYPE_WRITE, socket4FD, 0, socketQueue); - receive4Source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, socket4FD, 0, socketQueue); - - // Setup event handlers - - dispatch_source_set_event_handler(send4Source, ^{ @autoreleasepool { - - LogVerbose(@"send4EventBlock"); - LogVerbose(@"dispatch_source_get_data(send4Source) = %lu", dispatch_source_get_data(send4Source)); - - self->flags |= kSock4CanAcceptBytes; - - // If we're ready to send data, do so immediately. - // Otherwise pause the send source or it will continue to fire over and over again. - - if (self->currentSend == nil) - { - LogVerbose(@"Nothing to send"); - [self suspendSend4Source]; - } - else if (self->currentSend->resolveInProgress) - { - LogVerbose(@"currentSend - waiting for address resolve"); - [self suspendSend4Source]; - } - else if (self->currentSend->filterInProgress) - { - LogVerbose(@"currentSend - waiting on sendFilter"); - [self suspendSend4Source]; - } - else - { - [self doSend]; - } - - }}); - - dispatch_source_set_event_handler(receive4Source, ^{ @autoreleasepool { - - LogVerbose(@"receive4EventBlock"); - - self->socket4FDBytesAvailable = dispatch_source_get_data(self->receive4Source); - LogVerbose(@"socket4FDBytesAvailable: %lu", socket4FDBytesAvailable); - - if (self->socket4FDBytesAvailable > 0) - [self doReceive]; - else - [self doReceiveEOF]; - - }}); - - // Setup cancel handlers - - __block int socketFDRefCount = 2; - - int theSocketFD = socket4FD; - - #if !OS_OBJECT_USE_OBJC - dispatch_source_t theSendSource = send4Source; - dispatch_source_t theReceiveSource = receive4Source; - #endif - - dispatch_source_set_cancel_handler(send4Source, ^{ - - LogVerbose(@"send4CancelBlock"); - - #if !OS_OBJECT_USE_OBJC - LogVerbose(@"dispatch_release(send4Source)"); - dispatch_release(theSendSource); - #endif - - if (--socketFDRefCount == 0) - { - LogVerbose(@"close(socket4FD)"); - close(theSocketFD); - } - }); - - dispatch_source_set_cancel_handler(receive4Source, ^{ - - LogVerbose(@"receive4CancelBlock"); - - #if !OS_OBJECT_USE_OBJC - LogVerbose(@"dispatch_release(receive4Source)"); - dispatch_release(theReceiveSource); - #endif - - if (--socketFDRefCount == 0) - { - LogVerbose(@"close(socket4FD)"); - close(theSocketFD); - } - }); - - // We will not be able to receive until the socket is bound to a port, - // either explicitly via bind, or implicitly by connect or by sending data. - // - // But we should be able to send immediately. - - socket4FDBytesAvailable = 0; - flags |= kSock4CanAcceptBytes; - - flags |= kSend4SourceSuspended; - flags |= kReceive4SourceSuspended; -} - -- (void)setupSendAndReceiveSourcesForSocket6 -{ - LogTrace(); - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - send6Source = dispatch_source_create(DISPATCH_SOURCE_TYPE_WRITE, socket6FD, 0, socketQueue); - receive6Source = dispatch_source_create(DISPATCH_SOURCE_TYPE_READ, socket6FD, 0, socketQueue); - - // Setup event handlers - - dispatch_source_set_event_handler(send6Source, ^{ @autoreleasepool { - - LogVerbose(@"send6EventBlock"); - LogVerbose(@"dispatch_source_get_data(send6Source) = %lu", dispatch_source_get_data(send6Source)); - - self->flags |= kSock6CanAcceptBytes; - - // If we're ready to send data, do so immediately. - // Otherwise pause the send source or it will continue to fire over and over again. - - if (self->currentSend == nil) - { - LogVerbose(@"Nothing to send"); - [self suspendSend6Source]; - } - else if (self->currentSend->resolveInProgress) - { - LogVerbose(@"currentSend - waiting for address resolve"); - [self suspendSend6Source]; - } - else if (self->currentSend->filterInProgress) - { - LogVerbose(@"currentSend - waiting on sendFilter"); - [self suspendSend6Source]; - } - else - { - [self doSend]; - } - - }}); - - dispatch_source_set_event_handler(receive6Source, ^{ @autoreleasepool { - - LogVerbose(@"receive6EventBlock"); - - self->socket6FDBytesAvailable = dispatch_source_get_data(self->receive6Source); - LogVerbose(@"socket6FDBytesAvailable: %lu", socket6FDBytesAvailable); - - if (self->socket6FDBytesAvailable > 0) - [self doReceive]; - else - [self doReceiveEOF]; - - }}); - - // Setup cancel handlers - - __block int socketFDRefCount = 2; - - int theSocketFD = socket6FD; - - #if !OS_OBJECT_USE_OBJC - dispatch_source_t theSendSource = send6Source; - dispatch_source_t theReceiveSource = receive6Source; - #endif - - dispatch_source_set_cancel_handler(send6Source, ^{ - - LogVerbose(@"send6CancelBlock"); - - #if !OS_OBJECT_USE_OBJC - LogVerbose(@"dispatch_release(send6Source)"); - dispatch_release(theSendSource); - #endif - - if (--socketFDRefCount == 0) - { - LogVerbose(@"close(socket6FD)"); - close(theSocketFD); - } - }); - - dispatch_source_set_cancel_handler(receive6Source, ^{ - - LogVerbose(@"receive6CancelBlock"); - - #if !OS_OBJECT_USE_OBJC - LogVerbose(@"dispatch_release(receive6Source)"); - dispatch_release(theReceiveSource); - #endif - - if (--socketFDRefCount == 0) - { - LogVerbose(@"close(socket6FD)"); - close(theSocketFD); - } - }); - - // We will not be able to receive until the socket is bound to a port, - // either explicitly via bind, or implicitly by connect or by sending data. - // - // But we should be able to send immediately. - - socket6FDBytesAvailable = 0; - flags |= kSock6CanAcceptBytes; - - flags |= kSend6SourceSuspended; - flags |= kReceive6SourceSuspended; -} - -- (BOOL)createSocket4:(BOOL)useIPv4 socket6:(BOOL)useIPv6 error:(NSError * __autoreleasing *)errPtr -{ - LogTrace(); - - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - NSAssert(((flags & kDidCreateSockets) == 0), @"Sockets have already been created"); - - // CreateSocket Block - // This block will be invoked below. - - int(^createSocket)(int) = ^int (int domain) { - - int socketFD = socket(domain, SOCK_DGRAM, 0); - - if (socketFD == SOCKET_NULL) - { - if (errPtr) - *errPtr = [self errnoErrorWithReason:@"Error in socket() function"]; - - return SOCKET_NULL; - } - - int status; - - // Set socket options - - status = fcntl(socketFD, F_SETFL, O_NONBLOCK); - if (status == -1) - { - if (errPtr) - *errPtr = [self errnoErrorWithReason:@"Error enabling non-blocking IO on socket (fcntl)"]; - - close(socketFD); - return SOCKET_NULL; - } - - int reuseaddr = 1; - status = setsockopt(socketFD, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr)); - if (status == -1) - { - if (errPtr) - *errPtr = [self errnoErrorWithReason:@"Error enabling address reuse (setsockopt)"]; - - close(socketFD); - return SOCKET_NULL; - } - - int nosigpipe = 1; - status = setsockopt(socketFD, SOL_SOCKET, SO_NOSIGPIPE, &nosigpipe, sizeof(nosigpipe)); - if (status == -1) - { - if (errPtr) - *errPtr = [self errnoErrorWithReason:@"Error disabling sigpipe (setsockopt)"]; - - close(socketFD); - return SOCKET_NULL; - } - - /** - * The theoretical maximum size of any IPv4 UDP packet is UINT16_MAX = 65535. - * The theoretical maximum size of any IPv6 UDP packet is UINT32_MAX = 4294967295. - * - * The default maximum size of the UDP buffer in iOS is 9216 bytes. - * - * This is the reason of #222(GCD does not necessarily return the size of an entire UDP packet) and - * #535(GCDAsyncUDPSocket can not send data when data is greater than 9K) - * - * - * Enlarge the maximum size of UDP packet. - * I can not ensure the protocol type now so that the max size is set to 65535 :) - **/ - - status = setsockopt(socketFD, SOL_SOCKET, SO_SNDBUF, (const char*)&self->maxSendSize, sizeof(int)); - if (status == -1) - { - if (errPtr) - *errPtr = [self errnoErrorWithReason:@"Error setting send buffer size (setsockopt)"]; - close(socketFD); - return SOCKET_NULL; - } - - status = setsockopt(socketFD, SOL_SOCKET, SO_RCVBUF, (const char*)&self->maxSendSize, sizeof(int)); - if (status == -1) - { - if (errPtr) - *errPtr = [self errnoErrorWithReason:@"Error setting receive buffer size (setsockopt)"]; - close(socketFD); - return SOCKET_NULL; - } - - - return socketFD; - }; - - // Create sockets depending upon given configuration. - - if (useIPv4) - { - LogVerbose(@"Creating IPv4 socket"); - - socket4FD = createSocket(AF_INET); - if (socket4FD == SOCKET_NULL) - { - // errPtr set in local createSocket() block - return NO; - } - } - - if (useIPv6) - { - LogVerbose(@"Creating IPv6 socket"); - - socket6FD = createSocket(AF_INET6); - if (socket6FD == SOCKET_NULL) - { - // errPtr set in local createSocket() block - - if (socket4FD != SOCKET_NULL) - { - close(socket4FD); - socket4FD = SOCKET_NULL; - } - - return NO; - } - } - - // Setup send and receive sources - - if (useIPv4) - [self setupSendAndReceiveSourcesForSocket4]; - if (useIPv6) - [self setupSendAndReceiveSourcesForSocket6]; - - flags |= kDidCreateSockets; - return YES; -} - -- (BOOL)createSockets:(NSError **)errPtr -{ - LogTrace(); - - BOOL useIPv4 = [self isIPv4Enabled]; - BOOL useIPv6 = [self isIPv6Enabled]; - - return [self createSocket4:useIPv4 socket6:useIPv6 error:errPtr]; -} - -- (void)suspendSend4Source -{ - if (send4Source && !(flags & kSend4SourceSuspended)) - { - LogVerbose(@"dispatch_suspend(send4Source)"); - - dispatch_suspend(send4Source); - flags |= kSend4SourceSuspended; - } -} - -- (void)suspendSend6Source -{ - if (send6Source && !(flags & kSend6SourceSuspended)) - { - LogVerbose(@"dispatch_suspend(send6Source)"); - - dispatch_suspend(send6Source); - flags |= kSend6SourceSuspended; - } -} - -- (void)resumeSend4Source -{ - if (send4Source && (flags & kSend4SourceSuspended)) - { - LogVerbose(@"dispatch_resume(send4Source)"); - - dispatch_resume(send4Source); - flags &= ~kSend4SourceSuspended; - } -} - -- (void)resumeSend6Source -{ - if (send6Source && (flags & kSend6SourceSuspended)) - { - LogVerbose(@"dispatch_resume(send6Source)"); - - dispatch_resume(send6Source); - flags &= ~kSend6SourceSuspended; - } -} - -- (void)suspendReceive4Source -{ - if (receive4Source && !(flags & kReceive4SourceSuspended)) - { - LogVerbose(@"dispatch_suspend(receive4Source)"); - - dispatch_suspend(receive4Source); - flags |= kReceive4SourceSuspended; - } -} - -- (void)suspendReceive6Source -{ - if (receive6Source && !(flags & kReceive6SourceSuspended)) - { - LogVerbose(@"dispatch_suspend(receive6Source)"); - - dispatch_suspend(receive6Source); - flags |= kReceive6SourceSuspended; - } -} - -- (void)resumeReceive4Source -{ - if (receive4Source && (flags & kReceive4SourceSuspended)) - { - LogVerbose(@"dispatch_resume(receive4Source)"); - - dispatch_resume(receive4Source); - flags &= ~kReceive4SourceSuspended; - } -} - -- (void)resumeReceive6Source -{ - if (receive6Source && (flags & kReceive6SourceSuspended)) - { - LogVerbose(@"dispatch_resume(receive6Source)"); - - dispatch_resume(receive6Source); - flags &= ~kReceive6SourceSuspended; - } -} - -- (void)closeSocket4 -{ - if (socket4FD != SOCKET_NULL) - { - LogVerbose(@"dispatch_source_cancel(send4Source)"); - dispatch_source_cancel(send4Source); - - LogVerbose(@"dispatch_source_cancel(receive4Source)"); - dispatch_source_cancel(receive4Source); - - // For some crazy reason (in my opinion), cancelling a dispatch source doesn't - // invoke the cancel handler if the dispatch source is paused. - // So we have to unpause the source if needed. - // This allows the cancel handler to be run, which in turn releases the source and closes the socket. - - [self resumeSend4Source]; - [self resumeReceive4Source]; - - // The sockets will be closed by the cancel handlers of the corresponding source - - send4Source = NULL; - receive4Source = NULL; - - socket4FD = SOCKET_NULL; - - // Clear socket states - - socket4FDBytesAvailable = 0; - flags &= ~kSock4CanAcceptBytes; - - // Clear cached info - - cachedLocalAddress4 = nil; - cachedLocalHost4 = nil; - cachedLocalPort4 = 0; - } -} - -- (void)closeSocket6 -{ - if (socket6FD != SOCKET_NULL) - { - LogVerbose(@"dispatch_source_cancel(send6Source)"); - dispatch_source_cancel(send6Source); - - LogVerbose(@"dispatch_source_cancel(receive6Source)"); - dispatch_source_cancel(receive6Source); - - // For some crazy reason (in my opinion), cancelling a dispatch source doesn't - // invoke the cancel handler if the dispatch source is paused. - // So we have to unpause the source if needed. - // This allows the cancel handler to be run, which in turn releases the source and closes the socket. - - [self resumeSend6Source]; - [self resumeReceive6Source]; - - send6Source = NULL; - receive6Source = NULL; - - // The sockets will be closed by the cancel handlers of the corresponding source - - socket6FD = SOCKET_NULL; - - // Clear socket states - - socket6FDBytesAvailable = 0; - flags &= ~kSock6CanAcceptBytes; - - // Clear cached info - - cachedLocalAddress6 = nil; - cachedLocalHost6 = nil; - cachedLocalPort6 = 0; - } -} - -- (void)closeSockets -{ - [self closeSocket4]; - [self closeSocket6]; - - flags &= ~kDidCreateSockets; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Diagnostics -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (BOOL)getLocalAddress:(NSData **)dataPtr - host:(NSString **)hostPtr - port:(uint16_t *)portPtr - forSocket:(int)socketFD - withFamily:(int)socketFamily -{ - - NSData *data = nil; - NSString *host = nil; - uint16_t port = 0; - - if (socketFamily == AF_INET) - { - struct sockaddr_in sockaddr4; - socklen_t sockaddr4len = sizeof(sockaddr4); - - if (getsockname(socketFD, (struct sockaddr *)&sockaddr4, &sockaddr4len) == 0) - { - data = [NSData dataWithBytes:&sockaddr4 length:sockaddr4len]; - host = [[self class] hostFromSockaddr4:&sockaddr4]; - port = [[self class] portFromSockaddr4:&sockaddr4]; - } - else - { - LogWarn(@"Error in getsockname: %@", [self errnoError]); - } - } - else if (socketFamily == AF_INET6) - { - struct sockaddr_in6 sockaddr6; - socklen_t sockaddr6len = sizeof(sockaddr6); - - if (getsockname(socketFD, (struct sockaddr *)&sockaddr6, &sockaddr6len) == 0) - { - data = [NSData dataWithBytes:&sockaddr6 length:sockaddr6len]; - host = [[self class] hostFromSockaddr6:&sockaddr6]; - port = [[self class] portFromSockaddr6:&sockaddr6]; - } - else - { - LogWarn(@"Error in getsockname: %@", [self errnoError]); - } - } - - if (dataPtr) *dataPtr = data; - if (hostPtr) *hostPtr = host; - if (portPtr) *portPtr = port; - - return (data != nil); -} - -- (void)maybeUpdateCachedLocalAddress4Info -{ - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - if ( cachedLocalAddress4 || ((flags & kDidBind) == 0) || (socket4FD == SOCKET_NULL) ) - { - return; - } - - NSData *address = nil; - NSString *host = nil; - uint16_t port = 0; - - if ([self getLocalAddress:&address host:&host port:&port forSocket:socket4FD withFamily:AF_INET]) - { - - cachedLocalAddress4 = address; - cachedLocalHost4 = host; - cachedLocalPort4 = port; - } -} - -- (void)maybeUpdateCachedLocalAddress6Info -{ - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - if ( cachedLocalAddress6 || ((flags & kDidBind) == 0) || (socket6FD == SOCKET_NULL) ) - { - return; - } - - NSData *address = nil; - NSString *host = nil; - uint16_t port = 0; - - if ([self getLocalAddress:&address host:&host port:&port forSocket:socket6FD withFamily:AF_INET6]) - { - - cachedLocalAddress6 = address; - cachedLocalHost6 = host; - cachedLocalPort6 = port; - } -} - -- (NSData *)localAddress -{ - __block NSData *result = nil; - - dispatch_block_t block = ^{ - - if (self->socket4FD != SOCKET_NULL) - { - [self maybeUpdateCachedLocalAddress4Info]; - result = self->cachedLocalAddress4; - } - else - { - [self maybeUpdateCachedLocalAddress6Info]; - result = self->cachedLocalAddress6; - } - - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, AutoreleasedBlock(block)); - - return result; -} - -- (NSString *)localHost -{ - __block NSString *result = nil; - - dispatch_block_t block = ^{ - - if (self->socket4FD != SOCKET_NULL) - { - [self maybeUpdateCachedLocalAddress4Info]; - result = self->cachedLocalHost4; - } - else - { - [self maybeUpdateCachedLocalAddress6Info]; - result = self->cachedLocalHost6; - } - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, AutoreleasedBlock(block)); - - return result; -} - -- (uint16_t)localPort -{ - __block uint16_t result = 0; - - dispatch_block_t block = ^{ - - if (self->socket4FD != SOCKET_NULL) - { - [self maybeUpdateCachedLocalAddress4Info]; - result = self->cachedLocalPort4; - } - else - { - [self maybeUpdateCachedLocalAddress6Info]; - result = self->cachedLocalPort6; - } - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, AutoreleasedBlock(block)); - - return result; -} - -- (NSData *)localAddress_IPv4 -{ - __block NSData *result = nil; - - dispatch_block_t block = ^{ - - [self maybeUpdateCachedLocalAddress4Info]; - result = self->cachedLocalAddress4; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, AutoreleasedBlock(block)); - - return result; -} - -- (NSString *)localHost_IPv4 -{ - __block NSString *result = nil; - - dispatch_block_t block = ^{ - - [self maybeUpdateCachedLocalAddress4Info]; - result = self->cachedLocalHost4; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, AutoreleasedBlock(block)); - - return result; -} - -- (uint16_t)localPort_IPv4 -{ - __block uint16_t result = 0; - - dispatch_block_t block = ^{ - - [self maybeUpdateCachedLocalAddress4Info]; - result = self->cachedLocalPort4; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, AutoreleasedBlock(block)); - - return result; -} - -- (NSData *)localAddress_IPv6 -{ - __block NSData *result = nil; - - dispatch_block_t block = ^{ - - [self maybeUpdateCachedLocalAddress6Info]; - result = self->cachedLocalAddress6; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, AutoreleasedBlock(block)); - - return result; -} - -- (NSString *)localHost_IPv6 -{ - __block NSString *result = nil; - - dispatch_block_t block = ^{ - - [self maybeUpdateCachedLocalAddress6Info]; - result = self->cachedLocalHost6; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, AutoreleasedBlock(block)); - - return result; -} - -- (uint16_t)localPort_IPv6 -{ - __block uint16_t result = 0; - - dispatch_block_t block = ^{ - - [self maybeUpdateCachedLocalAddress6Info]; - result = self->cachedLocalPort6; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, AutoreleasedBlock(block)); - - return result; -} - -- (void)maybeUpdateCachedConnectedAddressInfo -{ - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - if (cachedConnectedAddress || (flags & kDidConnect) == 0) - { - return; - } - - NSData *data = nil; - NSString *host = nil; - uint16_t port = 0; - int family = AF_UNSPEC; - - if (socket4FD != SOCKET_NULL) - { - struct sockaddr_in sockaddr4; - socklen_t sockaddr4len = sizeof(sockaddr4); - - if (getpeername(socket4FD, (struct sockaddr *)&sockaddr4, &sockaddr4len) == 0) - { - data = [NSData dataWithBytes:&sockaddr4 length:sockaddr4len]; - host = [[self class] hostFromSockaddr4:&sockaddr4]; - port = [[self class] portFromSockaddr4:&sockaddr4]; - family = AF_INET; - } - else - { - LogWarn(@"Error in getpeername: %@", [self errnoError]); - } - } - else if (socket6FD != SOCKET_NULL) - { - struct sockaddr_in6 sockaddr6; - socklen_t sockaddr6len = sizeof(sockaddr6); - - if (getpeername(socket6FD, (struct sockaddr *)&sockaddr6, &sockaddr6len) == 0) - { - data = [NSData dataWithBytes:&sockaddr6 length:sockaddr6len]; - host = [[self class] hostFromSockaddr6:&sockaddr6]; - port = [[self class] portFromSockaddr6:&sockaddr6]; - family = AF_INET6; - } - else - { - LogWarn(@"Error in getpeername: %@", [self errnoError]); - } - } - - - cachedConnectedAddress = data; - cachedConnectedHost = host; - cachedConnectedPort = port; - cachedConnectedFamily = family; -} - -- (NSData *)connectedAddress -{ - __block NSData *result = nil; - - dispatch_block_t block = ^{ - - [self maybeUpdateCachedConnectedAddressInfo]; - result = self->cachedConnectedAddress; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, AutoreleasedBlock(block)); - - return result; -} - -- (NSString *)connectedHost -{ - __block NSString *result = nil; - - dispatch_block_t block = ^{ - - [self maybeUpdateCachedConnectedAddressInfo]; - result = self->cachedConnectedHost; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, AutoreleasedBlock(block)); - - return result; -} - -- (uint16_t)connectedPort -{ - __block uint16_t result = 0; - - dispatch_block_t block = ^{ - - [self maybeUpdateCachedConnectedAddressInfo]; - result = self->cachedConnectedPort; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, AutoreleasedBlock(block)); - - return result; -} - -- (BOOL)isConnected -{ - __block BOOL result = NO; - - dispatch_block_t block = ^{ - result = (self->flags & kDidConnect) ? YES : NO; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -- (BOOL)isClosed -{ - __block BOOL result = YES; - - dispatch_block_t block = ^{ - - result = (self->flags & kDidCreateSockets) ? NO : YES; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -- (BOOL)isIPv4 -{ - __block BOOL result = NO; - - dispatch_block_t block = ^{ - - if (self->flags & kDidCreateSockets) - { - result = (self->socket4FD != SOCKET_NULL); - } - else - { - result = [self isIPv4Enabled]; - } - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -- (BOOL)isIPv6 -{ - __block BOOL result = NO; - - dispatch_block_t block = ^{ - - if (self->flags & kDidCreateSockets) - { - result = (self->socket6FD != SOCKET_NULL); - } - else - { - result = [self isIPv6Enabled]; - } - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - return result; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Binding -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * This method runs through the various checks required prior to a bind attempt. - * It is shared between the various bind methods. -**/ -- (BOOL)preBind:(NSError **)errPtr -{ - if (![self preOp:errPtr]) - { - return NO; - } - - if (flags & kDidBind) - { - if (errPtr) - { - NSString *msg = @"Cannot bind a socket more than once."; - *errPtr = [self badConfigError:msg]; - } - return NO; - } - - if ((flags & kConnecting) || (flags & kDidConnect)) - { - if (errPtr) - { - NSString *msg = @"Cannot bind after connecting. If needed, bind first, then connect."; - *errPtr = [self badConfigError:msg]; - } - return NO; - } - - BOOL isIPv4Disabled = (config & kIPv4Disabled) ? YES : NO; - BOOL isIPv6Disabled = (config & kIPv6Disabled) ? YES : NO; - - if (isIPv4Disabled && isIPv6Disabled) // Must have IPv4 or IPv6 enabled - { - if (errPtr) - { - NSString *msg = @"Both IPv4 and IPv6 have been disabled. Must enable at least one protocol first."; - *errPtr = [self badConfigError:msg]; - } - return NO; - } - - return YES; -} - -- (BOOL)bindToPort:(uint16_t)port error:(NSError **)errPtr -{ - return [self bindToPort:port interface:nil error:errPtr]; -} - -- (BOOL)bindToPort:(uint16_t)port interface:(NSString *)interface error:(NSError **)errPtr -{ - __block BOOL result = NO; - __block NSError *err = nil; - - dispatch_block_t block = ^{ @autoreleasepool { - - // Run through sanity checks - - if (![self preBind:&err]) - { - return_from_block; - } - - // Check the given interface - - NSData *interface4 = nil; - NSData *interface6 = nil; - - [self convertIntefaceDescription:interface port:port intoAddress4:&interface4 address6:&interface6]; - - if ((interface4 == nil) && (interface6 == nil)) - { - NSString *msg = @"Unknown interface. Specify valid interface by name (e.g. \"en1\") or IP address."; - err = [self badParamError:msg]; - - return_from_block; - } - - BOOL isIPv4Disabled = (self->config & kIPv4Disabled) ? YES : NO; - BOOL isIPv6Disabled = (self->config & kIPv6Disabled) ? YES : NO; - - if (isIPv4Disabled && (interface6 == nil)) - { - NSString *msg = @"IPv4 has been disabled and specified interface doesn't support IPv6."; - err = [self badParamError:msg]; - - return_from_block; - } - - if (isIPv6Disabled && (interface4 == nil)) - { - NSString *msg = @"IPv6 has been disabled and specified interface doesn't support IPv4."; - err = [self badParamError:msg]; - - return_from_block; - } - - // Determine protocol(s) - - BOOL useIPv4 = !isIPv4Disabled && (interface4 != nil); - BOOL useIPv6 = !isIPv6Disabled && (interface6 != nil); - - // Create the socket(s) if needed - - if ((self->flags & kDidCreateSockets) == 0) - { - if (![self createSocket4:useIPv4 socket6:useIPv6 error:&err]) - { - return_from_block; - } - } - - // Bind the socket(s) - - LogVerbose(@"Binding socket to port(%hu) interface(%@)", port, interface); - - if (useIPv4) - { - int status = bind(self->socket4FD, (const struct sockaddr *)[interface4 bytes], (socklen_t)[interface4 length]); - if (status == -1) - { - [self closeSockets]; - - NSString *reason = @"Error in bind() function"; - err = [self errnoErrorWithReason:reason]; - - return_from_block; - } - } - - if (useIPv6) - { - int status = bind(self->socket6FD, (const struct sockaddr *)[interface6 bytes], (socklen_t)[interface6 length]); - if (status == -1) - { - [self closeSockets]; - - NSString *reason = @"Error in bind() function"; - err = [self errnoErrorWithReason:reason]; - - return_from_block; - } - } - - // Update flags - - self->flags |= kDidBind; - - if (!useIPv4) self->flags |= kIPv4Deactivated; - if (!useIPv6) self->flags |= kIPv6Deactivated; - - result = YES; - - }}; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - if (err) - LogError(@"Error binding to port/interface: %@", err); - - if (errPtr) - *errPtr = err; - - return result; -} - -- (BOOL)bindToAddress:(NSData *)localAddr error:(NSError **)errPtr -{ - __block BOOL result = NO; - __block NSError *err = nil; - - dispatch_block_t block = ^{ @autoreleasepool { - - // Run through sanity checks - - if (![self preBind:&err]) - { - return_from_block; - } - - // Check the given address - - int addressFamily = [[self class] familyFromAddress:localAddr]; - - if (addressFamily == AF_UNSPEC) - { - NSString *msg = @"A valid IPv4 or IPv6 address was not given"; - err = [self badParamError:msg]; - - return_from_block; - } - - NSData *localAddr4 = (addressFamily == AF_INET) ? localAddr : nil; - NSData *localAddr6 = (addressFamily == AF_INET6) ? localAddr : nil; - - BOOL isIPv4Disabled = (self->config & kIPv4Disabled) ? YES : NO; - BOOL isIPv6Disabled = (self->config & kIPv6Disabled) ? YES : NO; - - if (isIPv4Disabled && localAddr4) - { - NSString *msg = @"IPv4 has been disabled and an IPv4 address was passed."; - err = [self badParamError:msg]; - - return_from_block; - } - - if (isIPv6Disabled && localAddr6) - { - NSString *msg = @"IPv6 has been disabled and an IPv6 address was passed."; - err = [self badParamError:msg]; - - return_from_block; - } - - // Determine protocol(s) - - BOOL useIPv4 = !isIPv4Disabled && (localAddr4 != nil); - BOOL useIPv6 = !isIPv6Disabled && (localAddr6 != nil); - - // Create the socket(s) if needed - - if ((self->flags & kDidCreateSockets) == 0) - { - if (![self createSocket4:useIPv4 socket6:useIPv6 error:&err]) - { - return_from_block; - } - } - - // Bind the socket(s) - - if (useIPv4) - { - LogVerbose(@"Binding socket to address(%@:%hu)", - [[self class] hostFromAddress:localAddr4], - [[self class] portFromAddress:localAddr4]); - - int status = bind(self->socket4FD, (const struct sockaddr *)[localAddr4 bytes], (socklen_t)[localAddr4 length]); - if (status == -1) - { - [self closeSockets]; - - NSString *reason = @"Error in bind() function"; - err = [self errnoErrorWithReason:reason]; - - return_from_block; - } - } - else - { - LogVerbose(@"Binding socket to address(%@:%hu)", - [[self class] hostFromAddress:localAddr6], - [[self class] portFromAddress:localAddr6]); - - int status = bind(self->socket6FD, (const struct sockaddr *)[localAddr6 bytes], (socklen_t)[localAddr6 length]); - if (status == -1) - { - [self closeSockets]; - - NSString *reason = @"Error in bind() function"; - err = [self errnoErrorWithReason:reason]; - - return_from_block; - } - } - - // Update flags - - self->flags |= kDidBind; - - if (!useIPv4) self->flags |= kIPv4Deactivated; - if (!useIPv6) self->flags |= kIPv6Deactivated; - - result = YES; - - }}; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - if (err) - LogError(@"Error binding to address: %@", err); - - if (errPtr) - *errPtr = err; - - return result; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Connecting -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * This method runs through the various checks required prior to a connect attempt. - * It is shared between the various connect methods. -**/ -- (BOOL)preConnect:(NSError **)errPtr -{ - if (![self preOp:errPtr]) - { - return NO; - } - - if ((flags & kConnecting) || (flags & kDidConnect)) - { - if (errPtr) - { - NSString *msg = @"Cannot connect a socket more than once."; - *errPtr = [self badConfigError:msg]; - } - return NO; - } - - BOOL isIPv4Disabled = (config & kIPv4Disabled) ? YES : NO; - BOOL isIPv6Disabled = (config & kIPv6Disabled) ? YES : NO; - - if (isIPv4Disabled && isIPv6Disabled) // Must have IPv4 or IPv6 enabled - { - if (errPtr) - { - NSString *msg = @"Both IPv4 and IPv6 have been disabled. Must enable at least one protocol first."; - *errPtr = [self badConfigError:msg]; - } - return NO; - } - - return YES; -} - -- (BOOL)connectToHost:(NSString *)host onPort:(uint16_t)port error:(NSError **)errPtr -{ - __block BOOL result = NO; - __block NSError *err = nil; - - dispatch_block_t block = ^{ @autoreleasepool { - - // Run through sanity checks. - - if (![self preConnect:&err]) - { - return_from_block; - } - - // Check parameter(s) - - if (host == nil) - { - NSString *msg = @"The host param is nil. Should be domain name or IP address string."; - err = [self badParamError:msg]; - - return_from_block; - } - - // Create the socket(s) if needed - - if ((self->flags & kDidCreateSockets) == 0) - { - if (![self createSockets:&err]) - { - return_from_block; - } - } - - // Create special connect packet - - GCDAsyncUdpSpecialPacket *packet = [[GCDAsyncUdpSpecialPacket alloc] init]; - packet->resolveInProgress = YES; - - // Start asynchronous DNS resolve for host:port on background queue - - LogVerbose(@"Dispatching DNS resolve for connect..."); - - [self asyncResolveHost:host port:port withCompletionBlock:^(NSArray *addresses, NSError *error) { - - // The asyncResolveHost:port:: method asynchronously dispatches a task onto the global concurrent queue, - // and immediately returns. Once the async resolve task completes, - // this block is executed on our socketQueue. - - packet->resolveInProgress = NO; - - packet->addresses = addresses; - packet->error = error; - - [self maybeConnect]; - }]; - - // Updates flags, add connect packet to send queue, and pump send queue - - self->flags |= kConnecting; - - [self->sendQueue addObject:packet]; - [self maybeDequeueSend]; - - result = YES; - }}; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - if (err) - LogError(@"Error connecting to host/port: %@", err); - - if (errPtr) - *errPtr = err; - - return result; -} - -- (BOOL)connectToAddress:(NSData *)remoteAddr error:(NSError **)errPtr -{ - __block BOOL result = NO; - __block NSError *err = nil; - - dispatch_block_t block = ^{ @autoreleasepool { - - // Run through sanity checks. - - if (![self preConnect:&err]) - { - return_from_block; - } - - // Check parameter(s) - - if (remoteAddr == nil) - { - NSString *msg = @"The address param is nil. Should be a valid address."; - err = [self badParamError:msg]; - - return_from_block; - } - - // Create the socket(s) if needed - - if ((self->flags & kDidCreateSockets) == 0) - { - if (![self createSockets:&err]) - { - return_from_block; - } - } - - // The remoteAddr parameter could be of type NSMutableData. - // So we copy it to be safe. - - NSData *address = [remoteAddr copy]; - NSArray *addresses = [NSArray arrayWithObject:address]; - - GCDAsyncUdpSpecialPacket *packet = [[GCDAsyncUdpSpecialPacket alloc] init]; - packet->addresses = addresses; - - // Updates flags, add connect packet to send queue, and pump send queue - - self->flags |= kConnecting; - - [self->sendQueue addObject:packet]; - [self maybeDequeueSend]; - - result = YES; - }}; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - if (err) - LogError(@"Error connecting to address: %@", err); - - if (errPtr) - *errPtr = err; - - return result; -} - -- (void)maybeConnect -{ - LogTrace(); - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - - BOOL sendQueueReady = [currentSend isKindOfClass:[GCDAsyncUdpSpecialPacket class]]; - - if (sendQueueReady) - { - GCDAsyncUdpSpecialPacket *connectPacket = (GCDAsyncUdpSpecialPacket *)currentSend; - - if (connectPacket->resolveInProgress) - { - LogVerbose(@"Waiting for DNS resolve..."); - } - else - { - if (connectPacket->error) - { - [self notifyDidNotConnect:connectPacket->error]; - } - else - { - NSData *address = nil; - NSError *error = nil; - - int addressFamily = [self getAddress:&address error:&error fromAddresses:connectPacket->addresses]; - - // Perform connect - - BOOL result = NO; - - switch (addressFamily) - { - case AF_INET : result = [self connectWithAddress4:address error:&error]; break; - case AF_INET6 : result = [self connectWithAddress6:address error:&error]; break; - } - - if (result) - { - flags |= kDidBind; - flags |= kDidConnect; - - cachedConnectedAddress = address; - cachedConnectedHost = [[self class] hostFromAddress:address]; - cachedConnectedPort = [[self class] portFromAddress:address]; - cachedConnectedFamily = addressFamily; - - [self notifyDidConnectToAddress:address]; - } - else - { - [self notifyDidNotConnect:error]; - } - } - - flags &= ~kConnecting; - - [self endCurrentSend]; - [self maybeDequeueSend]; - } - } -} - -- (BOOL)connectWithAddress4:(NSData *)address4 error:(NSError **)errPtr -{ - LogTrace(); - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - int status = connect(socket4FD, (const struct sockaddr *)[address4 bytes], (socklen_t)[address4 length]); - if (status != 0) - { - if (errPtr) - *errPtr = [self errnoErrorWithReason:@"Error in connect() function"]; - - return NO; - } - - [self closeSocket6]; - flags |= kIPv6Deactivated; - - return YES; -} - -- (BOOL)connectWithAddress6:(NSData *)address6 error:(NSError **)errPtr -{ - LogTrace(); - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - int status = connect(socket6FD, (const struct sockaddr *)[address6 bytes], (socklen_t)[address6 length]); - if (status != 0) - { - if (errPtr) - *errPtr = [self errnoErrorWithReason:@"Error in connect() function"]; - - return NO; - } - - [self closeSocket4]; - flags |= kIPv4Deactivated; - - return YES; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Multicast -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (BOOL)preJoin:(NSError **)errPtr -{ - if (![self preOp:errPtr]) - { - return NO; - } - - if (!(flags & kDidBind)) - { - if (errPtr) - { - NSString *msg = @"Must bind a socket before joining a multicast group."; - *errPtr = [self badConfigError:msg]; - } - return NO; - } - - if ((flags & kConnecting) || (flags & kDidConnect)) - { - if (errPtr) - { - NSString *msg = @"Cannot join a multicast group if connected."; - *errPtr = [self badConfigError:msg]; - } - return NO; - } - - return YES; -} - -- (BOOL)joinMulticastGroup:(NSString *)group error:(NSError **)errPtr -{ - return [self joinMulticastGroup:group onInterface:nil error:errPtr]; -} - -- (BOOL)joinMulticastGroup:(NSString *)group onInterface:(NSString *)interface error:(NSError **)errPtr -{ - // IP_ADD_MEMBERSHIP == IPV6_JOIN_GROUP - return [self performMulticastRequest:IP_ADD_MEMBERSHIP forGroup:group onInterface:interface error:errPtr]; -} - -- (BOOL)leaveMulticastGroup:(NSString *)group error:(NSError **)errPtr -{ - return [self leaveMulticastGroup:group onInterface:nil error:errPtr]; -} - -- (BOOL)leaveMulticastGroup:(NSString *)group onInterface:(NSString *)interface error:(NSError **)errPtr -{ - // IP_DROP_MEMBERSHIP == IPV6_LEAVE_GROUP - return [self performMulticastRequest:IP_DROP_MEMBERSHIP forGroup:group onInterface:interface error:errPtr]; -} - -- (BOOL)performMulticastRequest:(int)requestType - forGroup:(NSString *)group - onInterface:(NSString *)interface - error:(NSError **)errPtr -{ - __block BOOL result = NO; - __block NSError *err = nil; - - dispatch_block_t block = ^{ @autoreleasepool { - - // Run through sanity checks - - if (![self preJoin:&err]) - { - return_from_block; - } - - // Convert group to address - - NSData *groupAddr4 = nil; - NSData *groupAddr6 = nil; - - [self convertNumericHost:group port:0 intoAddress4:&groupAddr4 address6:&groupAddr6]; - - if ((groupAddr4 == nil) && (groupAddr6 == nil)) - { - NSString *msg = @"Unknown group. Specify valid group IP address."; - err = [self badParamError:msg]; - - return_from_block; - } - - // Convert interface to address - - NSData *interfaceAddr4 = nil; - NSData *interfaceAddr6 = nil; - - [self convertIntefaceDescription:interface port:0 intoAddress4:&interfaceAddr4 address6:&interfaceAddr6]; - - if ((interfaceAddr4 == nil) && (interfaceAddr6 == nil)) - { - NSString *msg = @"Unknown interface. Specify valid interface by name (e.g. \"en1\") or IP address."; - err = [self badParamError:msg]; - - return_from_block; - } - - // Perform join - - if ((self->socket4FD != SOCKET_NULL) && groupAddr4 && interfaceAddr4) - { - const struct sockaddr_in *nativeGroup = (const struct sockaddr_in *)[groupAddr4 bytes]; - const struct sockaddr_in *nativeIface = (const struct sockaddr_in *)[interfaceAddr4 bytes]; - - struct ip_mreq imreq; - imreq.imr_multiaddr = nativeGroup->sin_addr; - imreq.imr_interface = nativeIface->sin_addr; - - int status = setsockopt(self->socket4FD, IPPROTO_IP, requestType, (const void *)&imreq, sizeof(imreq)); - if (status != 0) - { - err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; - - return_from_block; - } - - // Using IPv4 only - [self closeSocket6]; - - result = YES; - } - else if ((self->socket6FD != SOCKET_NULL) && groupAddr6 && interfaceAddr6) - { - const struct sockaddr_in6 *nativeGroup = (const struct sockaddr_in6 *)[groupAddr6 bytes]; - - struct ipv6_mreq imreq; - imreq.ipv6mr_multiaddr = nativeGroup->sin6_addr; - imreq.ipv6mr_interface = [self indexOfInterfaceAddr6:interfaceAddr6]; - - int status = setsockopt(self->socket6FD, IPPROTO_IPV6, requestType, (const void *)&imreq, sizeof(imreq)); - if (status != 0) - { - err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; - - return_from_block; - } - - // Using IPv6 only - [self closeSocket4]; - - result = YES; - } - else - { - NSString *msg = @"Socket, group, and interface do not have matching IP versions"; - err = [self badParamError:msg]; - - return_from_block; - } - - }}; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - if (errPtr) - *errPtr = err; - - return result; -} - -- (BOOL)sendIPv4MulticastOnInterface:(NSString*)interface error:(NSError **)errPtr -{ - __block BOOL result = NO; - __block NSError *err = nil; - - dispatch_block_t block = ^{ @autoreleasepool { - - if (![self preOp:&err]) - { - return_from_block; - } - - if ((self->flags & kDidCreateSockets) == 0) - { - if (![self createSockets:&err]) - { - return_from_block; - } - } - - // Convert interface to address - - NSData *interfaceAddr4 = nil; - NSData *interfaceAddr6 = nil; - - [self convertIntefaceDescription:interface port:0 intoAddress4:&interfaceAddr4 address6:&interfaceAddr6]; - - if (interfaceAddr4 == nil) - { - NSString *msg = @"Unknown interface. Specify valid interface by IP address."; - err = [self badParamError:msg]; - return_from_block; - } - - if (self->socket4FD != SOCKET_NULL) { - const struct sockaddr_in *nativeIface = (struct sockaddr_in *)[interfaceAddr4 bytes]; - struct in_addr interface_addr = nativeIface->sin_addr; - int status = setsockopt(self->socket4FD, IPPROTO_IP, IP_MULTICAST_IF, &interface_addr, sizeof(interface_addr)); - if (status != 0) { - err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; - return_from_block; - result = YES; - } - } - - }}; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - if (errPtr) - *errPtr = err; - - return result; -} - -- (BOOL)sendIPv6MulticastOnInterface:(NSString*)interface error:(NSError **)errPtr -{ - __block BOOL result = NO; - __block NSError *err = nil; - - dispatch_block_t block = ^{ @autoreleasepool { - - if (![self preOp:&err]) - { - return_from_block; - } - - if ((self->flags & kDidCreateSockets) == 0) - { - if (![self createSockets:&err]) - { - return_from_block; - } - } - - // Convert interface to address - - NSData *interfaceAddr4 = nil; - NSData *interfaceAddr6 = nil; - - [self convertIntefaceDescription:interface port:0 intoAddress4:&interfaceAddr4 address6:&interfaceAddr6]; - - if (interfaceAddr6 == nil) - { - NSString *msg = @"Unknown interface. Specify valid interface by name (e.g. \"en1\")."; - err = [self badParamError:msg]; - return_from_block; - } - - if ((self->socket6FD != SOCKET_NULL)) { - uint32_t scope_id = [self indexOfInterfaceAddr6:interfaceAddr6]; - int status = setsockopt(self->socket6FD, IPPROTO_IPV6, IPV6_MULTICAST_IF, &scope_id, sizeof(scope_id)); - if (status != 0) { - err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; - return_from_block; - } - result = YES; - } - - }}; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - if (errPtr) - *errPtr = err; - - return result; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Reuse port -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (BOOL)enableReusePort:(BOOL)flag error:(NSError **)errPtr -{ - __block BOOL result = NO; - __block NSError *err = nil; - - dispatch_block_t block = ^{ @autoreleasepool { - - if (![self preOp:&err]) - { - return_from_block; - } - - if ((self->flags & kDidCreateSockets) == 0) - { - if (![self createSockets:&err]) - { - return_from_block; - } - } - - int value = flag ? 1 : 0; - if (self->socket4FD != SOCKET_NULL) - { - int error = setsockopt(self->socket4FD, SOL_SOCKET, SO_REUSEPORT, (const void *)&value, sizeof(value)); - - if (error) - { - err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; - - return_from_block; - } - result = YES; - } - - if (self->socket6FD != SOCKET_NULL) - { - int error = setsockopt(self->socket6FD, SOL_SOCKET, SO_REUSEPORT, (const void *)&value, sizeof(value)); - - if (error) - { - err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; - - return_from_block; - } - result = YES; - } - - }}; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - if (errPtr) - *errPtr = err; - - return result; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Broadcast -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (BOOL)enableBroadcast:(BOOL)flag error:(NSError **)errPtr -{ - __block BOOL result = NO; - __block NSError *err = nil; - - dispatch_block_t block = ^{ @autoreleasepool { - - if (![self preOp:&err]) - { - return_from_block; - } - - if ((self->flags & kDidCreateSockets) == 0) - { - if (![self createSockets:&err]) - { - return_from_block; - } - } - - if (self->socket4FD != SOCKET_NULL) - { - int value = flag ? 1 : 0; - int error = setsockopt(self->socket4FD, SOL_SOCKET, SO_BROADCAST, (const void *)&value, sizeof(value)); - - if (error) - { - err = [self errnoErrorWithReason:@"Error in setsockopt() function"]; - - return_from_block; - } - result = YES; - } - - // IPv6 does not implement broadcast, the ability to send a packet to all hosts on the attached link. - // The same effect can be achieved by sending a packet to the link-local all hosts multicast group. - - }}; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - if (errPtr) - *errPtr = err; - - return result; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Sending -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)sendData:(NSData *)data withTag:(long)tag -{ - [self sendData:data withTimeout:-1.0 tag:tag]; -} - -- (void)sendData:(NSData *)data withTimeout:(NSTimeInterval)timeout tag:(long)tag -{ - LogTrace(); - - if ([data length] == 0) - { - LogWarn(@"Ignoring attempt to send nil/empty data."); - return; - } - - - - GCDAsyncUdpSendPacket *packet = [[GCDAsyncUdpSendPacket alloc] initWithData:data timeout:timeout tag:tag]; - - dispatch_async(socketQueue, ^{ @autoreleasepool { - - [self->sendQueue addObject:packet]; - [self maybeDequeueSend]; - }}); - -} - -- (void)sendData:(NSData *)data - toHost:(NSString *)host - port:(uint16_t)port - withTimeout:(NSTimeInterval)timeout - tag:(long)tag -{ - LogTrace(); - - if ([data length] == 0) - { - LogWarn(@"Ignoring attempt to send nil/empty data."); - return; - } - - GCDAsyncUdpSendPacket *packet = [[GCDAsyncUdpSendPacket alloc] initWithData:data timeout:timeout tag:tag]; - packet->resolveInProgress = YES; - - [self asyncResolveHost:host port:port withCompletionBlock:^(NSArray *addresses, NSError *error) { - - // The asyncResolveHost:port:: method asynchronously dispatches a task onto the global concurrent queue, - // and immediately returns. Once the async resolve task completes, - // this block is executed on our socketQueue. - - packet->resolveInProgress = NO; - - packet->resolvedAddresses = addresses; - packet->resolveError = error; - - if (packet == self->currentSend) - { - LogVerbose(@"currentSend - address resolved"); - [self doPreSend]; - } - }]; - - dispatch_async(socketQueue, ^{ @autoreleasepool { - - [self->sendQueue addObject:packet]; - [self maybeDequeueSend]; - - }}); - -} - -- (void)sendData:(NSData *)data toAddress:(NSData *)remoteAddr withTimeout:(NSTimeInterval)timeout tag:(long)tag -{ - LogTrace(); - - if ([data length] == 0) - { - LogWarn(@"Ignoring attempt to send nil/empty data."); - return; - } - - GCDAsyncUdpSendPacket *packet = [[GCDAsyncUdpSendPacket alloc] initWithData:data timeout:timeout tag:tag]; - packet->addressFamily = [GCDAsyncUdpSocket familyFromAddress:remoteAddr]; - packet->address = remoteAddr; - - dispatch_async(socketQueue, ^{ @autoreleasepool { - - [self->sendQueue addObject:packet]; - [self maybeDequeueSend]; - }}); -} - -- (void)setSendFilter:(GCDAsyncUdpSocketSendFilterBlock)filterBlock withQueue:(dispatch_queue_t)filterQueue -{ - [self setSendFilter:filterBlock withQueue:filterQueue isAsynchronous:YES]; -} - -- (void)setSendFilter:(GCDAsyncUdpSocketSendFilterBlock)filterBlock - withQueue:(dispatch_queue_t)filterQueue - isAsynchronous:(BOOL)isAsynchronous -{ - GCDAsyncUdpSocketSendFilterBlock newFilterBlock = NULL; - dispatch_queue_t newFilterQueue = NULL; - - if (filterBlock) - { - NSAssert(filterQueue, @"Must provide a dispatch_queue in which to run the filter block."); - - newFilterBlock = [filterBlock copy]; - newFilterQueue = filterQueue; - #if !OS_OBJECT_USE_OBJC - dispatch_retain(newFilterQueue); - #endif - } - - dispatch_block_t block = ^{ - - #if !OS_OBJECT_USE_OBJC - if (self->sendFilterQueue) dispatch_release(self->sendFilterQueue); - #endif - - self->sendFilterBlock = newFilterBlock; - self->sendFilterQueue = newFilterQueue; - self->sendFilterAsync = isAsynchronous; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -- (void)maybeDequeueSend -{ - LogTrace(); - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - // If we don't have a send operation already in progress - if (currentSend == nil) - { - // Create the sockets if needed - if ((flags & kDidCreateSockets) == 0) - { - NSError *err = nil; - if (![self createSockets:&err]) - { - [self closeWithError:err]; - return; - } - } - - while ([sendQueue count] > 0) - { - // Dequeue the next object in the queue - currentSend = [sendQueue objectAtIndex:0]; - [sendQueue removeObjectAtIndex:0]; - - if ([currentSend isKindOfClass:[GCDAsyncUdpSpecialPacket class]]) - { - [self maybeConnect]; - - return; // The maybeConnect method, if it connects, will invoke this method again - } - else if (currentSend->resolveError) - { - // Notify delegate - [self notifyDidNotSendDataWithTag:currentSend->tag dueToError:currentSend->resolveError]; - - // Clear currentSend - currentSend = nil; - - continue; - } - else - { - // Start preprocessing checks on the send packet - [self doPreSend]; - - break; - } - } - - if ((currentSend == nil) && (flags & kCloseAfterSends)) - { - [self closeWithError:nil]; - } - } -} - -/** - * This method is called after a sendPacket has been dequeued. - * It performs various preprocessing checks on the packet, - * and queries the sendFilter (if set) to determine if the packet can be sent. - * - * If the packet passes all checks, it will be passed on to the doSend method. -**/ -- (void)doPreSend -{ - LogTrace(); - - // - // 1. Check for problems with send packet - // - - BOOL waitingForResolve = NO; - NSError *error = nil; - - if (flags & kDidConnect) - { - // Connected socket - - if (currentSend->resolveInProgress || currentSend->resolvedAddresses || currentSend->resolveError) - { - NSString *msg = @"Cannot specify destination of packet for connected socket"; - error = [self badConfigError:msg]; - } - else - { - currentSend->address = cachedConnectedAddress; - currentSend->addressFamily = cachedConnectedFamily; - } - } - else - { - // Non-Connected socket - - if (currentSend->resolveInProgress) - { - // We're waiting for the packet's destination to be resolved. - waitingForResolve = YES; - } - else if (currentSend->resolveError) - { - error = currentSend->resolveError; - } - else if (currentSend->address == nil) - { - if (currentSend->resolvedAddresses == nil) - { - NSString *msg = @"You must specify destination of packet for a non-connected socket"; - error = [self badConfigError:msg]; - } - else - { - // Pick the proper address to use (out of possibly several resolved addresses) - - NSData *address = nil; - int addressFamily = AF_UNSPEC; - - addressFamily = [self getAddress:&address error:&error fromAddresses:currentSend->resolvedAddresses]; - - currentSend->address = address; - currentSend->addressFamily = addressFamily; - } - } - } - - if (waitingForResolve) - { - // We're waiting for the packet's destination to be resolved. - - LogVerbose(@"currentSend - waiting for address resolve"); - - if (flags & kSock4CanAcceptBytes) { - [self suspendSend4Source]; - } - if (flags & kSock6CanAcceptBytes) { - [self suspendSend6Source]; - } - - return; - } - - if (error) - { - // Unable to send packet due to some error. - // Notify delegate and move on. - - [self notifyDidNotSendDataWithTag:currentSend->tag dueToError:error]; - [self endCurrentSend]; - [self maybeDequeueSend]; - - return; - } - - // - // 2. Query sendFilter (if applicable) - // - - if (sendFilterBlock && sendFilterQueue) - { - // Query sendFilter - - if (sendFilterAsync) - { - // Scenario 1 of 3 - Need to asynchronously query sendFilter - - currentSend->filterInProgress = YES; - GCDAsyncUdpSendPacket *sendPacket = currentSend; - - dispatch_async(sendFilterQueue, ^{ @autoreleasepool { - - BOOL allowed = self->sendFilterBlock(sendPacket->buffer, sendPacket->address, sendPacket->tag); - - dispatch_async(self->socketQueue, ^{ @autoreleasepool { - - sendPacket->filterInProgress = NO; - if (sendPacket == self->currentSend) - { - if (allowed) - { - [self doSend]; - } - else - { - LogVerbose(@"currentSend - silently dropped by sendFilter"); - - [self notifyDidSendDataWithTag:self->currentSend->tag]; - [self endCurrentSend]; - [self maybeDequeueSend]; - } - } - }}); - }}); - } - else - { - // Scenario 2 of 3 - Need to synchronously query sendFilter - - __block BOOL allowed = YES; - - dispatch_sync(sendFilterQueue, ^{ @autoreleasepool { - - allowed = self->sendFilterBlock(self->currentSend->buffer, self->currentSend->address, self->currentSend->tag); - }}); - - if (allowed) - { - [self doSend]; - } - else - { - LogVerbose(@"currentSend - silently dropped by sendFilter"); - - [self notifyDidSendDataWithTag:currentSend->tag]; - [self endCurrentSend]; - [self maybeDequeueSend]; - } - } - } - else // if (!sendFilterBlock || !sendFilterQueue) - { - // Scenario 3 of 3 - No sendFilter. Just go straight into sending. - - [self doSend]; - } -} - -/** - * This method performs the actual sending of data in the currentSend packet. - * It should only be called if the -**/ -- (void)doSend -{ - LogTrace(); - - NSAssert(currentSend != nil, @"Invalid logic"); - - // Perform the actual send - - ssize_t result = 0; - - if (flags & kDidConnect) - { - // Connected socket - - const void *buffer = [currentSend->buffer bytes]; - size_t length = (size_t)[currentSend->buffer length]; - - if (currentSend->addressFamily == AF_INET) - { - result = send(socket4FD, buffer, length, 0); - LogVerbose(@"send(socket4FD) = %d", result); - } - else - { - result = send(socket6FD, buffer, length, 0); - LogVerbose(@"send(socket6FD) = %d", result); - } - } - else - { - // Non-Connected socket - - const void *buffer = [currentSend->buffer bytes]; - size_t length = (size_t)[currentSend->buffer length]; - - const void *dst = [currentSend->address bytes]; - socklen_t dstSize = (socklen_t)[currentSend->address length]; - - if (currentSend->addressFamily == AF_INET) - { - result = sendto(socket4FD, buffer, length, 0, dst, dstSize); - LogVerbose(@"sendto(socket4FD) = %d", result); - } - else - { - result = sendto(socket6FD, buffer, length, 0, dst, dstSize); - LogVerbose(@"sendto(socket6FD) = %d", result); - } - } - - // If the socket wasn't bound before, it is now - - if ((flags & kDidBind) == 0) - { - flags |= kDidBind; - } - - // Check the results. - // - // From the send() & sendto() manpage: - // - // Upon successful completion, the number of bytes which were sent is returned. - // Otherwise, -1 is returned and the global variable errno is set to indicate the error. - - BOOL waitingForSocket = NO; - NSError *socketError = nil; - - if (result == 0) - { - waitingForSocket = YES; - } - else if (result < 0) - { - if (errno == EAGAIN) - waitingForSocket = YES; - else - socketError = [self errnoErrorWithReason:@"Error in send() function."]; - } - - if (waitingForSocket) - { - // Not enough room in the underlying OS socket send buffer. - // Wait for a notification of available space. - - LogVerbose(@"currentSend - waiting for socket"); - - if (!(flags & kSock4CanAcceptBytes)) { - [self resumeSend4Source]; - } - if (!(flags & kSock6CanAcceptBytes)) { - [self resumeSend6Source]; - } - - if ((sendTimer == NULL) && (currentSend->timeout >= 0.0)) - { - // Unable to send packet right away. - // Start timer to timeout the send operation. - - [self setupSendTimerWithTimeout:currentSend->timeout]; - } - } - else if (socketError) - { - [self closeWithError:socketError]; - } - else // done - { - [self notifyDidSendDataWithTag:currentSend->tag]; - [self endCurrentSend]; - [self maybeDequeueSend]; - } -} - -/** - * Releases all resources associated with the currentSend. -**/ -- (void)endCurrentSend -{ - if (sendTimer) - { - dispatch_source_cancel(sendTimer); - #if !OS_OBJECT_USE_OBJC - dispatch_release(sendTimer); - #endif - sendTimer = NULL; - } - - currentSend = nil; -} - -/** - * Performs the operations to timeout the current send operation, and move on. -**/ -- (void)doSendTimeout -{ - LogTrace(); - - [self notifyDidNotSendDataWithTag:currentSend->tag dueToError:[self sendTimeoutError]]; - [self endCurrentSend]; - [self maybeDequeueSend]; -} - -/** - * Sets up a timer that fires to timeout the current send operation. - * This method should only be called once per send packet. -**/ -- (void)setupSendTimerWithTimeout:(NSTimeInterval)timeout -{ - NSAssert(sendTimer == NULL, @"Invalid logic"); - NSAssert(timeout >= 0.0, @"Invalid logic"); - - LogTrace(); - - sendTimer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, socketQueue); - - dispatch_source_set_event_handler(sendTimer, ^{ @autoreleasepool { - - [self doSendTimeout]; - }}); - - dispatch_time_t tt = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(timeout * NSEC_PER_SEC)); - - dispatch_source_set_timer(sendTimer, tt, DISPATCH_TIME_FOREVER, 0); - dispatch_resume(sendTimer); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Receiving -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (BOOL)receiveOnce:(NSError **)errPtr -{ - LogTrace(); - - __block BOOL result = NO; - __block NSError *err = nil; - - dispatch_block_t block = ^{ - - if ((self->flags & kReceiveOnce) == 0) - { - if ((self->flags & kDidCreateSockets) == 0) - { - NSString *msg = @"Must bind socket before you can receive data. " - @"You can do this explicitly via bind, or implicitly via connect or by sending data."; - - err = [self badConfigError:msg]; - return_from_block; - } - - self->flags |= kReceiveOnce; // Enable - self->flags &= ~kReceiveContinuous; // Disable - - dispatch_async(self->socketQueue, ^{ @autoreleasepool { - - [self doReceive]; - }}); - } - - result = YES; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - if (err) - LogError(@"Error in beginReceiving: %@", err); - - if (errPtr) - *errPtr = err; - - return result; -} - -- (BOOL)beginReceiving:(NSError **)errPtr -{ - LogTrace(); - - __block BOOL result = NO; - __block NSError *err = nil; - - dispatch_block_t block = ^{ - - if ((self->flags & kReceiveContinuous) == 0) - { - if ((self->flags & kDidCreateSockets) == 0) - { - NSString *msg = @"Must bind socket before you can receive data. " - @"You can do this explicitly via bind, or implicitly via connect or by sending data."; - - err = [self badConfigError:msg]; - return_from_block; - } - - self->flags |= kReceiveContinuous; // Enable - self->flags &= ~kReceiveOnce; // Disable - - dispatch_async(self->socketQueue, ^{ @autoreleasepool { - - [self doReceive]; - }}); - } - - result = YES; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); - - if (err) - LogError(@"Error in beginReceiving: %@", err); - - if (errPtr) - *errPtr = err; - - return result; -} - -- (void)pauseReceiving -{ - LogTrace(); - - dispatch_block_t block = ^{ - - self->flags &= ~kReceiveOnce; // Disable - self->flags &= ~kReceiveContinuous; // Disable - - if (self->socket4FDBytesAvailable > 0) { - [self suspendReceive4Source]; - } - if (self->socket6FDBytesAvailable > 0) { - [self suspendReceive6Source]; - } - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -- (void)setReceiveFilter:(GCDAsyncUdpSocketReceiveFilterBlock)filterBlock withQueue:(dispatch_queue_t)filterQueue -{ - [self setReceiveFilter:filterBlock withQueue:filterQueue isAsynchronous:YES]; -} - -- (void)setReceiveFilter:(GCDAsyncUdpSocketReceiveFilterBlock)filterBlock - withQueue:(dispatch_queue_t)filterQueue - isAsynchronous:(BOOL)isAsynchronous -{ - GCDAsyncUdpSocketReceiveFilterBlock newFilterBlock = NULL; - dispatch_queue_t newFilterQueue = NULL; - - if (filterBlock) - { - NSAssert(filterQueue, @"Must provide a dispatch_queue in which to run the filter block."); - - newFilterBlock = [filterBlock copy]; - newFilterQueue = filterQueue; - #if !OS_OBJECT_USE_OBJC - dispatch_retain(newFilterQueue); - #endif - } - - dispatch_block_t block = ^{ - - #if !OS_OBJECT_USE_OBJC - if (self->receiveFilterQueue) dispatch_release(self->receiveFilterQueue); - #endif - - self->receiveFilterBlock = newFilterBlock; - self->receiveFilterQueue = newFilterQueue; - self->receiveFilterAsync = isAsynchronous; - }; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -- (void)doReceive -{ - LogTrace(); - - if ((flags & (kReceiveOnce | kReceiveContinuous)) == 0) - { - LogVerbose(@"Receiving is paused..."); - - if (socket4FDBytesAvailable > 0) { - [self suspendReceive4Source]; - } - if (socket6FDBytesAvailable > 0) { - [self suspendReceive6Source]; - } - - return; - } - - if ((flags & kReceiveOnce) && (pendingFilterOperations > 0)) - { - LogVerbose(@"Receiving is temporarily paused (pending filter operations)..."); - - if (socket4FDBytesAvailable > 0) { - [self suspendReceive4Source]; - } - if (socket6FDBytesAvailable > 0) { - [self suspendReceive6Source]; - } - - return; - } - - if ((socket4FDBytesAvailable == 0) && (socket6FDBytesAvailable == 0)) - { - LogVerbose(@"No data available to receive..."); - - if (socket4FDBytesAvailable == 0) { - [self resumeReceive4Source]; - } - if (socket6FDBytesAvailable == 0) { - [self resumeReceive6Source]; - } - - return; - } - - // Figure out if we should receive on socket4 or socket6 - - BOOL doReceive4; - - if (flags & kDidConnect) - { - // Connected socket - - doReceive4 = (socket4FD != SOCKET_NULL); - } - else - { - // Non-Connected socket - - if (socket4FDBytesAvailable > 0) - { - if (socket6FDBytesAvailable > 0) - { - // Bytes available on socket4 & socket6 - - doReceive4 = (flags & kFlipFlop) ? YES : NO; - - flags ^= kFlipFlop; // flags = flags xor kFlipFlop; (toggle flip flop bit) - } - else { - // Bytes available on socket4, but not socket6 - doReceive4 = YES; - } - } - else { - // Bytes available on socket6, but not socket4 - doReceive4 = NO; - } - } - - // Perform socket IO - - ssize_t result = 0; - - NSData *data = nil; - NSData *addr4 = nil; - NSData *addr6 = nil; - - if (doReceive4) - { - NSAssert(socket4FDBytesAvailable > 0, @"Invalid logic"); - LogVerbose(@"Receiving on IPv4"); - - struct sockaddr_in sockaddr4; - socklen_t sockaddr4len = sizeof(sockaddr4); - - // #222: GCD does not necessarily return the size of an entire UDP packet - // from dispatch_source_get_data(), so we must use the maximum packet size. - size_t bufSize = max4ReceiveSize; - void *buf = malloc(bufSize); - - result = recvfrom(socket4FD, buf, bufSize, 0, (struct sockaddr *)&sockaddr4, &sockaddr4len); - LogVerbose(@"recvfrom(socket4FD) = %i", (int)result); - - if (result > 0) - { - if ((size_t)result >= socket4FDBytesAvailable) - socket4FDBytesAvailable = 0; - else - socket4FDBytesAvailable -= result; - - if ((size_t)result != bufSize) { - buf = realloc(buf, result); - } - - data = [NSData dataWithBytesNoCopy:buf length:result freeWhenDone:YES]; - addr4 = [NSData dataWithBytes:&sockaddr4 length:sockaddr4len]; - } - else - { - LogVerbose(@"recvfrom(socket4FD) = %@", [self errnoError]); - socket4FDBytesAvailable = 0; - free(buf); - } - } - else - { - NSAssert(socket6FDBytesAvailable > 0, @"Invalid logic"); - LogVerbose(@"Receiving on IPv6"); - - struct sockaddr_in6 sockaddr6; - socklen_t sockaddr6len = sizeof(sockaddr6); - - // #222: GCD does not necessarily return the size of an entire UDP packet - // from dispatch_source_get_data(), so we must use the maximum packet size. - size_t bufSize = max6ReceiveSize; - void *buf = malloc(bufSize); - - result = recvfrom(socket6FD, buf, bufSize, 0, (struct sockaddr *)&sockaddr6, &sockaddr6len); - LogVerbose(@"recvfrom(socket6FD) -> %i", (int)result); - - if (result > 0) - { - if ((size_t)result >= socket6FDBytesAvailable) - socket6FDBytesAvailable = 0; - else - socket6FDBytesAvailable -= result; - - if ((size_t)result != bufSize) { - buf = realloc(buf, result); - } - - data = [NSData dataWithBytesNoCopy:buf length:result freeWhenDone:YES]; - addr6 = [NSData dataWithBytes:&sockaddr6 length:sockaddr6len]; - } - else - { - LogVerbose(@"recvfrom(socket6FD) = %@", [self errnoError]); - socket6FDBytesAvailable = 0; - free(buf); - } - } - - - BOOL waitingForSocket = NO; - BOOL notifiedDelegate = NO; - BOOL ignored = NO; - - NSError *socketError = nil; - - if (result == 0) - { - waitingForSocket = YES; - } - else if (result < 0) - { - if (errno == EAGAIN) - waitingForSocket = YES; - else - socketError = [self errnoErrorWithReason:@"Error in recvfrom() function"]; - } - else - { - if (flags & kDidConnect) - { - if (addr4 && ![self isConnectedToAddress4:addr4]) - ignored = YES; - if (addr6 && ![self isConnectedToAddress6:addr6]) - ignored = YES; - } - - NSData *addr = (addr4 != nil) ? addr4 : addr6; - - if (!ignored) - { - if (receiveFilterBlock && receiveFilterQueue) - { - // Run data through filter, and if approved, notify delegate - - __block id filterContext = nil; - __block BOOL allowed = NO; - - if (receiveFilterAsync) - { - pendingFilterOperations++; - dispatch_async(receiveFilterQueue, ^{ @autoreleasepool { - - allowed = self->receiveFilterBlock(data, addr, &filterContext); - - // Transition back to socketQueue to get the current delegate / delegateQueue - dispatch_async(self->socketQueue, ^{ @autoreleasepool { - - self->pendingFilterOperations--; - - if (allowed) - { - [self notifyDidReceiveData:data fromAddress:addr withFilterContext:filterContext]; - } - else - { - LogVerbose(@"received packet silently dropped by receiveFilter"); - } - - if (self->flags & kReceiveOnce) - { - if (allowed) - { - // The delegate has been notified, - // so our receive once operation has completed. - self->flags &= ~kReceiveOnce; - } - else if (self->pendingFilterOperations == 0) - { - // All pending filter operations have completed, - // and none were allowed through. - // Our receive once operation hasn't completed yet. - [self doReceive]; - } - } - }}); - }}); - } - else // if (!receiveFilterAsync) - { - dispatch_sync(receiveFilterQueue, ^{ @autoreleasepool { - - allowed = self->receiveFilterBlock(data, addr, &filterContext); - }}); - - if (allowed) - { - [self notifyDidReceiveData:data fromAddress:addr withFilterContext:filterContext]; - notifiedDelegate = YES; - } - else - { - LogVerbose(@"received packet silently dropped by receiveFilter"); - ignored = YES; - } - } - } - else // if (!receiveFilterBlock || !receiveFilterQueue) - { - [self notifyDidReceiveData:data fromAddress:addr withFilterContext:nil]; - notifiedDelegate = YES; - } - } - } - - if (waitingForSocket) - { - // Wait for a notification of available data. - - if (socket4FDBytesAvailable == 0) { - [self resumeReceive4Source]; - } - if (socket6FDBytesAvailable == 0) { - [self resumeReceive6Source]; - } - } - else if (socketError) - { - [self closeWithError:socketError]; - } - else - { - if (flags & kReceiveContinuous) - { - // Continuous receive mode - [self doReceive]; - } - else - { - // One-at-a-time receive mode - if (notifiedDelegate) - { - // The delegate has been notified (no set filter). - // So our receive once operation has completed. - flags &= ~kReceiveOnce; - } - else if (ignored) - { - [self doReceive]; - } - else - { - // Waiting on asynchronous receive filter... - } - } - } -} - -- (void)doReceiveEOF -{ - LogTrace(); - - [self closeWithError:[self socketClosedError]]; -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Closing -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -- (void)closeWithError:(NSError *)error -{ - LogVerbose(@"closeWithError: %@", error); - - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - if (currentSend) [self endCurrentSend]; - - [sendQueue removeAllObjects]; - - // If a socket has been created, we should notify the delegate. - BOOL shouldCallDelegate = (flags & kDidCreateSockets) ? YES : NO; - - // Close all sockets, send/receive sources, cfstreams, etc -#if TARGET_OS_IPHONE - [self removeStreamsFromRunLoop]; - [self closeReadAndWriteStreams]; -#endif - [self closeSockets]; - - // Clear all flags (config remains as is) - flags = 0; - - if (shouldCallDelegate) - { - [self notifyDidCloseWithError:error]; - } -} - -- (void)close -{ - LogTrace(); - - dispatch_block_t block = ^{ @autoreleasepool { - - [self closeWithError:nil]; - }}; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); -} - -- (void)closeAfterSending -{ - LogTrace(); - - dispatch_block_t block = ^{ @autoreleasepool { - - self->flags |= kCloseAfterSends; - - if (self->currentSend == nil && [self->sendQueue count] == 0) - { - [self closeWithError:nil]; - } - }}; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark CFStream -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -#if TARGET_OS_IPHONE - -static NSThread *listenerThread; - -+ (void)ignore:(id)_ -{} - -+ (void)startListenerThreadIfNeeded -{ - static dispatch_once_t predicate; - dispatch_once(&predicate, ^{ - - listenerThread = [[NSThread alloc] initWithTarget:self - selector:@selector(listenerThread:) - object:nil]; - [listenerThread start]; - }); -} - -+ (void)listenerThread:(id)unused -{ - @autoreleasepool { - - [[NSThread currentThread] setName:GCDAsyncUdpSocketThreadName]; - - LogInfo(@"ListenerThread: Started"); - - // We can't run the run loop unless it has an associated input source or a timer. - // So we'll just create a timer that will never fire - unless the server runs for a decades. - [NSTimer scheduledTimerWithTimeInterval:[[NSDate distantFuture] timeIntervalSinceNow] - target:self - selector:@selector(ignore:) - userInfo:nil - repeats:YES]; - - [[NSRunLoop currentRunLoop] run]; - - LogInfo(@"ListenerThread: Stopped"); - } -} - -+ (void)addStreamListener:(GCDAsyncUdpSocket *)asyncUdpSocket -{ - LogTrace(); - NSAssert([NSThread currentThread] == listenerThread, @"Invoked on wrong thread"); - - CFRunLoopRef runLoop = CFRunLoopGetCurrent(); - - if (asyncUdpSocket->readStream4) - CFReadStreamScheduleWithRunLoop(asyncUdpSocket->readStream4, runLoop, kCFRunLoopDefaultMode); - - if (asyncUdpSocket->readStream6) - CFReadStreamScheduleWithRunLoop(asyncUdpSocket->readStream6, runLoop, kCFRunLoopDefaultMode); - - if (asyncUdpSocket->writeStream4) - CFWriteStreamScheduleWithRunLoop(asyncUdpSocket->writeStream4, runLoop, kCFRunLoopDefaultMode); - - if (asyncUdpSocket->writeStream6) - CFWriteStreamScheduleWithRunLoop(asyncUdpSocket->writeStream6, runLoop, kCFRunLoopDefaultMode); -} - -+ (void)removeStreamListener:(GCDAsyncUdpSocket *)asyncUdpSocket -{ - LogTrace(); - NSAssert([NSThread currentThread] == listenerThread, @"Invoked on wrong thread"); - - CFRunLoopRef runLoop = CFRunLoopGetCurrent(); - - if (asyncUdpSocket->readStream4) - CFReadStreamUnscheduleFromRunLoop(asyncUdpSocket->readStream4, runLoop, kCFRunLoopDefaultMode); - - if (asyncUdpSocket->readStream6) - CFReadStreamUnscheduleFromRunLoop(asyncUdpSocket->readStream6, runLoop, kCFRunLoopDefaultMode); - - if (asyncUdpSocket->writeStream4) - CFWriteStreamUnscheduleFromRunLoop(asyncUdpSocket->writeStream4, runLoop, kCFRunLoopDefaultMode); - - if (asyncUdpSocket->writeStream6) - CFWriteStreamUnscheduleFromRunLoop(asyncUdpSocket->writeStream6, runLoop, kCFRunLoopDefaultMode); -} - -static void CFReadStreamCallback(CFReadStreamRef stream, CFStreamEventType type, void *pInfo) -{ - @autoreleasepool { - GCDAsyncUdpSocket *asyncUdpSocket = (__bridge GCDAsyncUdpSocket *)pInfo; - - switch(type) - { - case kCFStreamEventOpenCompleted: - { - LogCVerbose(@"CFReadStreamCallback - Open"); - break; - } - case kCFStreamEventHasBytesAvailable: - { - LogCVerbose(@"CFReadStreamCallback - HasBytesAvailable"); - break; - } - case kCFStreamEventErrorOccurred: - case kCFStreamEventEndEncountered: - { - NSError *error = (__bridge_transfer NSError *)CFReadStreamCopyError(stream); - if (error == nil && type == kCFStreamEventEndEncountered) - { - error = [asyncUdpSocket socketClosedError]; - } - - dispatch_async(asyncUdpSocket->socketQueue, ^{ @autoreleasepool { - - LogCVerbose(@"CFReadStreamCallback - %@", - (type == kCFStreamEventErrorOccurred) ? @"Error" : @"EndEncountered"); - - if (stream != asyncUdpSocket->readStream4 && - stream != asyncUdpSocket->readStream6 ) - { - LogCVerbose(@"CFReadStreamCallback - Ignored"); - return_from_block; - } - - [asyncUdpSocket closeWithError:error]; - - }}); - - break; - } - default: - { - LogCError(@"CFReadStreamCallback - UnknownType: %i", (int)type); - } - } - } -} - -static void CFWriteStreamCallback(CFWriteStreamRef stream, CFStreamEventType type, void *pInfo) -{ - @autoreleasepool { - GCDAsyncUdpSocket *asyncUdpSocket = (__bridge GCDAsyncUdpSocket *)pInfo; - - switch(type) - { - case kCFStreamEventOpenCompleted: - { - LogCVerbose(@"CFWriteStreamCallback - Open"); - break; - } - case kCFStreamEventCanAcceptBytes: - { - LogCVerbose(@"CFWriteStreamCallback - CanAcceptBytes"); - break; - } - case kCFStreamEventErrorOccurred: - case kCFStreamEventEndEncountered: - { - NSError *error = (__bridge_transfer NSError *)CFWriteStreamCopyError(stream); - if (error == nil && type == kCFStreamEventEndEncountered) - { - error = [asyncUdpSocket socketClosedError]; - } - - dispatch_async(asyncUdpSocket->socketQueue, ^{ @autoreleasepool { - - LogCVerbose(@"CFWriteStreamCallback - %@", - (type == kCFStreamEventErrorOccurred) ? @"Error" : @"EndEncountered"); - - if (stream != asyncUdpSocket->writeStream4 && - stream != asyncUdpSocket->writeStream6 ) - { - LogCVerbose(@"CFWriteStreamCallback - Ignored"); - return_from_block; - } - - [asyncUdpSocket closeWithError:error]; - - }}); - - break; - } - default: - { - LogCError(@"CFWriteStreamCallback - UnknownType: %i", (int)type); - } - } - } -} - -- (BOOL)createReadAndWriteStreams:(NSError **)errPtr -{ - LogTrace(); - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - NSError *err = nil; - - if (readStream4 || writeStream4 || readStream6 || writeStream6) - { - // Streams already created - return YES; - } - - if (socket4FD == SOCKET_NULL && socket6FD == SOCKET_NULL) - { - err = [self otherError:@"Cannot create streams without a file descriptor"]; - goto Failed; - } - - // Create streams - - LogVerbose(@"Creating read and write stream(s)..."); - - if (socket4FD != SOCKET_NULL) - { - CFStreamCreatePairWithSocket(NULL, (CFSocketNativeHandle)socket4FD, &readStream4, &writeStream4); - if (!readStream4 || !writeStream4) - { - err = [self otherError:@"Error in CFStreamCreatePairWithSocket() [IPv4]"]; - goto Failed; - } - } - - if (socket6FD != SOCKET_NULL) - { - CFStreamCreatePairWithSocket(NULL, (CFSocketNativeHandle)socket6FD, &readStream6, &writeStream6); - if (!readStream6 || !writeStream6) - { - err = [self otherError:@"Error in CFStreamCreatePairWithSocket() [IPv6]"]; - goto Failed; - } - } - - // Ensure the CFStream's don't close our underlying socket - - CFReadStreamSetProperty(readStream4, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse); - CFWriteStreamSetProperty(writeStream4, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse); - - CFReadStreamSetProperty(readStream6, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse); - CFWriteStreamSetProperty(writeStream6, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanFalse); - - return YES; - -Failed: - if (readStream4) - { - CFReadStreamClose(readStream4); - CFRelease(readStream4); - readStream4 = NULL; - } - if (writeStream4) - { - CFWriteStreamClose(writeStream4); - CFRelease(writeStream4); - writeStream4 = NULL; - } - if (readStream6) - { - CFReadStreamClose(readStream6); - CFRelease(readStream6); - readStream6 = NULL; - } - if (writeStream6) - { - CFWriteStreamClose(writeStream6); - CFRelease(writeStream6); - writeStream6 = NULL; - } - - if (errPtr) - *errPtr = err; - - return NO; -} - -- (BOOL)registerForStreamCallbacks:(NSError **)errPtr -{ - LogTrace(); - - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - NSAssert(readStream4 || writeStream4 || readStream6 || writeStream6, @"Read/Write streams are null"); - - NSError *err = nil; - - streamContext.version = 0; - streamContext.info = (__bridge void *)self; - streamContext.retain = nil; - streamContext.release = nil; - streamContext.copyDescription = nil; - - CFOptionFlags readStreamEvents = kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered; - CFOptionFlags writeStreamEvents = kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered; - -// readStreamEvents |= (kCFStreamEventOpenCompleted | kCFStreamEventHasBytesAvailable); -// writeStreamEvents |= (kCFStreamEventOpenCompleted | kCFStreamEventCanAcceptBytes); - - if (socket4FD != SOCKET_NULL) - { - if (readStream4 == NULL || writeStream4 == NULL) - { - err = [self otherError:@"Read/Write stream4 is null"]; - goto Failed; - } - - BOOL r1 = CFReadStreamSetClient(readStream4, readStreamEvents, &CFReadStreamCallback, &streamContext); - BOOL r2 = CFWriteStreamSetClient(writeStream4, writeStreamEvents, &CFWriteStreamCallback, &streamContext); - - if (!r1 || !r2) - { - err = [self otherError:@"Error in CFStreamSetClient(), [IPv4]"]; - goto Failed; - } - } - - if (socket6FD != SOCKET_NULL) - { - if (readStream6 == NULL || writeStream6 == NULL) - { - err = [self otherError:@"Read/Write stream6 is null"]; - goto Failed; - } - - BOOL r1 = CFReadStreamSetClient(readStream6, readStreamEvents, &CFReadStreamCallback, &streamContext); - BOOL r2 = CFWriteStreamSetClient(writeStream6, writeStreamEvents, &CFWriteStreamCallback, &streamContext); - - if (!r1 || !r2) - { - err = [self otherError:@"Error in CFStreamSetClient() [IPv6]"]; - goto Failed; - } - } - - return YES; - -Failed: - if (readStream4) { - CFReadStreamSetClient(readStream4, kCFStreamEventNone, NULL, NULL); - } - if (writeStream4) { - CFWriteStreamSetClient(writeStream4, kCFStreamEventNone, NULL, NULL); - } - if (readStream6) { - CFReadStreamSetClient(readStream6, kCFStreamEventNone, NULL, NULL); - } - if (writeStream6) { - CFWriteStreamSetClient(writeStream6, kCFStreamEventNone, NULL, NULL); - } - - if (errPtr) *errPtr = err; - return NO; -} - -- (BOOL)addStreamsToRunLoop:(NSError **)errPtr -{ - LogTrace(); - - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - NSAssert(readStream4 || writeStream4 || readStream6 || writeStream6, @"Read/Write streams are null"); - - if (!(flags & kAddedStreamListener)) - { - [[self class] startListenerThreadIfNeeded]; - [[self class] performSelector:@selector(addStreamListener:) - onThread:listenerThread - withObject:self - waitUntilDone:YES]; - - flags |= kAddedStreamListener; - } - - return YES; -} - -- (BOOL)openStreams:(NSError **)errPtr -{ - LogTrace(); - - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - NSAssert(readStream4 || writeStream4 || readStream6 || writeStream6, @"Read/Write streams are null"); - - NSError *err = nil; - - if (socket4FD != SOCKET_NULL) - { - BOOL r1 = CFReadStreamOpen(readStream4); - BOOL r2 = CFWriteStreamOpen(writeStream4); - - if (!r1 || !r2) - { - err = [self otherError:@"Error in CFStreamOpen() [IPv4]"]; - goto Failed; - } - } - - if (socket6FD != SOCKET_NULL) - { - BOOL r1 = CFReadStreamOpen(readStream6); - BOOL r2 = CFWriteStreamOpen(writeStream6); - - if (!r1 || !r2) - { - err = [self otherError:@"Error in CFStreamOpen() [IPv6]"]; - goto Failed; - } - } - - return YES; - -Failed: - if (errPtr) *errPtr = err; - return NO; -} - -- (void)removeStreamsFromRunLoop -{ - LogTrace(); - NSAssert(dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey), @"Must be dispatched on socketQueue"); - - if (flags & kAddedStreamListener) - { - [[self class] performSelector:@selector(removeStreamListener:) - onThread:listenerThread - withObject:self - waitUntilDone:YES]; - - flags &= ~kAddedStreamListener; - } -} - -- (void)closeReadAndWriteStreams -{ - LogTrace(); - - if (readStream4) - { - CFReadStreamSetClient(readStream4, kCFStreamEventNone, NULL, NULL); - CFReadStreamClose(readStream4); - CFRelease(readStream4); - readStream4 = NULL; - } - if (writeStream4) - { - CFWriteStreamSetClient(writeStream4, kCFStreamEventNone, NULL, NULL); - CFWriteStreamClose(writeStream4); - CFRelease(writeStream4); - writeStream4 = NULL; - } - if (readStream6) - { - CFReadStreamSetClient(readStream6, kCFStreamEventNone, NULL, NULL); - CFReadStreamClose(readStream6); - CFRelease(readStream6); - readStream6 = NULL; - } - if (writeStream6) - { - CFWriteStreamSetClient(writeStream6, kCFStreamEventNone, NULL, NULL); - CFWriteStreamClose(writeStream6); - CFRelease(writeStream6); - writeStream6 = NULL; - } -} - -#endif - -#if TARGET_OS_IPHONE -- (void)applicationWillEnterForeground:(NSNotification *)notification -{ - LogTrace(); - - // If the application was backgrounded, then iOS may have shut down our sockets. - // So we take a quick look to see if any of them received an EOF. - - dispatch_block_t block = ^{ @autoreleasepool { - - [self resumeReceive4Source]; - [self resumeReceive6Source]; - }}; - - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_async(socketQueue, block); -} -#endif - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Advanced -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** - * See header file for big discussion of this method. - **/ -- (void)markSocketQueueTargetQueue:(dispatch_queue_t)socketNewTargetQueue -{ - void *nonNullUnusedPointer = (__bridge void *)self; - dispatch_queue_set_specific(socketNewTargetQueue, IsOnSocketQueueOrTargetQueueKey, nonNullUnusedPointer, NULL); -} - -/** - * See header file for big discussion of this method. - **/ -- (void)unmarkSocketQueueTargetQueue:(dispatch_queue_t)socketOldTargetQueue -{ - dispatch_queue_set_specific(socketOldTargetQueue, IsOnSocketQueueOrTargetQueueKey, NULL, NULL); -} - -- (void)performBlock:(dispatch_block_t)block -{ - if (dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - block(); - else - dispatch_sync(socketQueue, block); -} - -- (int)socketFD -{ - if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", - THIS_FILE, THIS_METHOD); - return SOCKET_NULL; - } - - if (socket4FD != SOCKET_NULL) - return socket4FD; - else - return socket6FD; -} - -- (int)socket4FD -{ - if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", - THIS_FILE, THIS_METHOD); - return SOCKET_NULL; - } - - return socket4FD; -} - -- (int)socket6FD -{ - if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", - THIS_FILE, THIS_METHOD); - return SOCKET_NULL; - } - - return socket6FD; -} - -#if TARGET_OS_IPHONE - -- (CFReadStreamRef)readStream -{ - if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", - THIS_FILE, THIS_METHOD); - return NULL; - } - - NSError *err = nil; - if (![self createReadAndWriteStreams:&err]) - { - LogError(@"Error creating CFStream(s): %@", err); - return NULL; - } - - // Todo... - - if (readStream4) - return readStream4; - else - return readStream6; -} - -- (CFWriteStreamRef)writeStream -{ - if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", - THIS_FILE, THIS_METHOD); - return NULL; - } - - NSError *err = nil; - if (![self createReadAndWriteStreams:&err]) - { - LogError(@"Error creating CFStream(s): %@", err); - return NULL; - } - - if (writeStream4) - return writeStream4; - else - return writeStream6; -} - -- (BOOL)enableBackgroundingOnSockets -{ - if (! dispatch_get_specific(IsOnSocketQueueOrTargetQueueKey)) - { - LogWarn(@"%@: %@ - Method only available from within the context of a performBlock: invocation", - THIS_FILE, THIS_METHOD); - return NO; - } - - // Why is this commented out? - // See comments below. - -// NSError *err = nil; -// if (![self createReadAndWriteStreams:&err]) -// { -// LogError(@"Error creating CFStream(s): %@", err); -// return NO; -// } -// -// LogVerbose(@"Enabling backgrouding on socket"); -// -// BOOL r1, r2; -// -// if (readStream4 && writeStream4) -// { -// r1 = CFReadStreamSetProperty(readStream4, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); -// r2 = CFWriteStreamSetProperty(writeStream4, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); -// -// if (!r1 || !r2) -// { -// LogError(@"Error setting voip type (IPv4)"); -// return NO; -// } -// } -// -// if (readStream6 && writeStream6) -// { -// r1 = CFReadStreamSetProperty(readStream6, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); -// r2 = CFWriteStreamSetProperty(writeStream6, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP); -// -// if (!r1 || !r2) -// { -// LogError(@"Error setting voip type (IPv6)"); -// return NO; -// } -// } -// -// return YES; - - // The above code will actually appear to work. - // The methods will return YES, and everything will appear fine. - // - // One tiny problem: the sockets will still get closed when the app gets backgrounded. - // - // Apple does not officially support backgrounding UDP sockets. - - return NO; -} - -#endif - -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -#pragma mark Class Methods -//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// - -+ (NSString *)hostFromSockaddr4:(const struct sockaddr_in *)pSockaddr4 -{ - char addrBuf[INET_ADDRSTRLEN]; - - if (inet_ntop(AF_INET, &pSockaddr4->sin_addr, addrBuf, (socklen_t)sizeof(addrBuf)) == NULL) - { - addrBuf[0] = '\0'; - } - - return [NSString stringWithCString:addrBuf encoding:NSASCIIStringEncoding]; -} - -+ (NSString *)hostFromSockaddr6:(const struct sockaddr_in6 *)pSockaddr6 -{ - char addrBuf[INET6_ADDRSTRLEN]; - - if (inet_ntop(AF_INET6, &pSockaddr6->sin6_addr, addrBuf, (socklen_t)sizeof(addrBuf)) == NULL) - { - addrBuf[0] = '\0'; - } - - return [NSString stringWithCString:addrBuf encoding:NSASCIIStringEncoding]; -} - -+ (uint16_t)portFromSockaddr4:(const struct sockaddr_in *)pSockaddr4 -{ - return ntohs(pSockaddr4->sin_port); -} - -+ (uint16_t)portFromSockaddr6:(const struct sockaddr_in6 *)pSockaddr6 -{ - return ntohs(pSockaddr6->sin6_port); -} - -+ (NSString *)hostFromAddress:(NSData *)address -{ - NSString *host = nil; - [self getHost:&host port:NULL family:NULL fromAddress:address]; - - return host; -} - -+ (uint16_t)portFromAddress:(NSData *)address -{ - uint16_t port = 0; - [self getHost:NULL port:&port family:NULL fromAddress:address]; - - return port; -} - -+ (int)familyFromAddress:(NSData *)address -{ - int af = AF_UNSPEC; - [self getHost:NULL port:NULL family:&af fromAddress:address]; - - return af; -} - -+ (BOOL)isIPv4Address:(NSData *)address -{ - int af = AF_UNSPEC; - [self getHost:NULL port:NULL family:&af fromAddress:address]; - - return (af == AF_INET); -} - -+ (BOOL)isIPv6Address:(NSData *)address -{ - int af = AF_UNSPEC; - [self getHost:NULL port:NULL family:&af fromAddress:address]; - - return (af == AF_INET6); -} - -+ (BOOL)getHost:(NSString **)hostPtr port:(uint16_t *)portPtr fromAddress:(NSData *)address -{ - return [self getHost:hostPtr port:portPtr family:NULL fromAddress:address]; -} - -+ (BOOL)getHost:(NSString **)hostPtr port:(uint16_t *)portPtr family:(int *)afPtr fromAddress:(NSData *)address -{ - if ([address length] >= sizeof(struct sockaddr)) - { - const struct sockaddr *addrX = (const struct sockaddr *)[address bytes]; - - if (addrX->sa_family == AF_INET) - { - if ([address length] >= sizeof(struct sockaddr_in)) - { - const struct sockaddr_in *addr4 = (const struct sockaddr_in *)(const void *)addrX; - - if (hostPtr) *hostPtr = [self hostFromSockaddr4:addr4]; - if (portPtr) *portPtr = [self portFromSockaddr4:addr4]; - if (afPtr) *afPtr = AF_INET; - - return YES; - } - } - else if (addrX->sa_family == AF_INET6) - { - if ([address length] >= sizeof(struct sockaddr_in6)) - { - const struct sockaddr_in6 *addr6 = (const struct sockaddr_in6 *)(const void *)addrX; - - if (hostPtr) *hostPtr = [self hostFromSockaddr6:addr6]; - if (portPtr) *portPtr = [self portFromSockaddr6:addr6]; - if (afPtr) *afPtr = AF_INET6; - - return YES; - } - } - } - - if (hostPtr) *hostPtr = nil; - if (portPtr) *portPtr = 0; - if (afPtr) *afPtr = AF_UNSPEC; - - return NO; -} - -@end diff --git a/ios/Pods/DoubleConversion/LICENSE b/ios/Pods/DoubleConversion/LICENSE deleted file mode 100644 index 933718a..0000000 --- a/ios/Pods/DoubleConversion/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -Copyright 2006-2011, the V8 project authors. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of Google Inc. nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ios/Pods/DoubleConversion/README b/ios/Pods/DoubleConversion/README deleted file mode 100644 index 167f9c5..0000000 --- a/ios/Pods/DoubleConversion/README +++ /dev/null @@ -1,54 +0,0 @@ -http://code.google.com/p/double-conversion - -This project (double-conversion) provides binary-decimal and decimal-binary -routines for IEEE doubles. - -The library consists of efficient conversion routines that have been extracted -from the V8 JavaScript engine. The code has been refactored and improved so that -it can be used more easily in other projects. - -There is extensive documentation in src/double-conversion.h. Other examples can -be found in test/cctest/test-conversions.cc. - - -Building -======== - -This library can be built with scons [0] or cmake [1]. -The checked-in Makefile simply forwards to scons, and provides a -shortcut to run all tests: - - make - make test - -Scons ------ - -The easiest way to install this library is to use `scons`. It builds -the static and shared library, and is set up to install those at the -correct locations: - - scons install - -Use the `DESTDIR` option to change the target directory: - - scons DESTDIR=alternative_directory install - -Cmake ------ - -To use cmake run `cmake .` in the root directory. This overwrites the -existing Makefile. - -Use `-DBUILD_SHARED_LIBS=ON` to enable the compilation of shared libraries. -Note that this disables static libraries. There is currently no way to -build both libraries at the same time with cmake. - -Use `-DBUILD_TESTING=ON` to build the test executable. - - cmake . -DBUILD_TESTING=ON - make - test/cctest/cctest --list | tr -d '<' | xargs test/cctest/cctest - -[0]: http://www.scons.org -[1]: http://www.cmake.org diff --git a/ios/Pods/DoubleConversion/double-conversion/bignum-dtoa.cc b/ios/Pods/DoubleConversion/double-conversion/bignum-dtoa.cc deleted file mode 100644 index f1ad7a5..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/bignum-dtoa.cc +++ /dev/null @@ -1,641 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include - -#include "bignum-dtoa.h" - -#include "bignum.h" -#include "ieee.h" - -namespace double_conversion { - -static int NormalizedExponent(uint64_t significand, int exponent) { - ASSERT(significand != 0); - while ((significand & Double::kHiddenBit) == 0) { - significand = significand << 1; - exponent = exponent - 1; - } - return exponent; -} - - -// Forward declarations: -// Returns an estimation of k such that 10^(k-1) <= v < 10^k. -static int EstimatePower(int exponent); -// Computes v / 10^estimated_power exactly, as a ratio of two bignums, numerator -// and denominator. -static void InitialScaledStartValues(uint64_t significand, - int exponent, - bool lower_boundary_is_closer, - int estimated_power, - bool need_boundary_deltas, - Bignum* numerator, - Bignum* denominator, - Bignum* delta_minus, - Bignum* delta_plus); -// Multiplies numerator/denominator so that its values lies in the range 1-10. -// Returns decimal_point s.t. -// v = numerator'/denominator' * 10^(decimal_point-1) -// where numerator' and denominator' are the values of numerator and -// denominator after the call to this function. -static void FixupMultiply10(int estimated_power, bool is_even, - int* decimal_point, - Bignum* numerator, Bignum* denominator, - Bignum* delta_minus, Bignum* delta_plus); -// Generates digits from the left to the right and stops when the generated -// digits yield the shortest decimal representation of v. -static void GenerateShortestDigits(Bignum* numerator, Bignum* denominator, - Bignum* delta_minus, Bignum* delta_plus, - bool is_even, - Vector buffer, int* length); -// Generates 'requested_digits' after the decimal point. -static void BignumToFixed(int requested_digits, int* decimal_point, - Bignum* numerator, Bignum* denominator, - Vector(buffer), int* length); -// Generates 'count' digits of numerator/denominator. -// Once 'count' digits have been produced rounds the result depending on the -// remainder (remainders of exactly .5 round upwards). Might update the -// decimal_point when rounding up (for example for 0.9999). -static void GenerateCountedDigits(int count, int* decimal_point, - Bignum* numerator, Bignum* denominator, - Vector(buffer), int* length); - - -void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits, - Vector buffer, int* length, int* decimal_point) { - ASSERT(v > 0); - ASSERT(!Double(v).IsSpecial()); - uint64_t significand; - int exponent; - bool lower_boundary_is_closer; - if (mode == BIGNUM_DTOA_SHORTEST_SINGLE) { - float f = static_cast(v); - ASSERT(f == v); - significand = Single(f).Significand(); - exponent = Single(f).Exponent(); - lower_boundary_is_closer = Single(f).LowerBoundaryIsCloser(); - } else { - significand = Double(v).Significand(); - exponent = Double(v).Exponent(); - lower_boundary_is_closer = Double(v).LowerBoundaryIsCloser(); - } - bool need_boundary_deltas = - (mode == BIGNUM_DTOA_SHORTEST || mode == BIGNUM_DTOA_SHORTEST_SINGLE); - - bool is_even = (significand & 1) == 0; - int normalized_exponent = NormalizedExponent(significand, exponent); - // estimated_power might be too low by 1. - int estimated_power = EstimatePower(normalized_exponent); - - // Shortcut for Fixed. - // The requested digits correspond to the digits after the point. If the - // number is much too small, then there is no need in trying to get any - // digits. - if (mode == BIGNUM_DTOA_FIXED && -estimated_power - 1 > requested_digits) { - buffer[0] = '\0'; - *length = 0; - // Set decimal-point to -requested_digits. This is what Gay does. - // Note that it should not have any effect anyways since the string is - // empty. - *decimal_point = -requested_digits; - return; - } - - Bignum numerator; - Bignum denominator; - Bignum delta_minus; - Bignum delta_plus; - // Make sure the bignum can grow large enough. The smallest double equals - // 4e-324. In this case the denominator needs fewer than 324*4 binary digits. - // The maximum double is 1.7976931348623157e308 which needs fewer than - // 308*4 binary digits. - ASSERT(Bignum::kMaxSignificantBits >= 324*4); - InitialScaledStartValues(significand, exponent, lower_boundary_is_closer, - estimated_power, need_boundary_deltas, - &numerator, &denominator, - &delta_minus, &delta_plus); - // We now have v = (numerator / denominator) * 10^estimated_power. - FixupMultiply10(estimated_power, is_even, decimal_point, - &numerator, &denominator, - &delta_minus, &delta_plus); - // We now have v = (numerator / denominator) * 10^(decimal_point-1), and - // 1 <= (numerator + delta_plus) / denominator < 10 - switch (mode) { - case BIGNUM_DTOA_SHORTEST: - case BIGNUM_DTOA_SHORTEST_SINGLE: - GenerateShortestDigits(&numerator, &denominator, - &delta_minus, &delta_plus, - is_even, buffer, length); - break; - case BIGNUM_DTOA_FIXED: - BignumToFixed(requested_digits, decimal_point, - &numerator, &denominator, - buffer, length); - break; - case BIGNUM_DTOA_PRECISION: - GenerateCountedDigits(requested_digits, decimal_point, - &numerator, &denominator, - buffer, length); - break; - default: - UNREACHABLE(); - } - buffer[*length] = '\0'; -} - - -// The procedure starts generating digits from the left to the right and stops -// when the generated digits yield the shortest decimal representation of v. A -// decimal representation of v is a number lying closer to v than to any other -// double, so it converts to v when read. -// -// This is true if d, the decimal representation, is between m- and m+, the -// upper and lower boundaries. d must be strictly between them if !is_even. -// m- := (numerator - delta_minus) / denominator -// m+ := (numerator + delta_plus) / denominator -// -// Precondition: 0 <= (numerator+delta_plus) / denominator < 10. -// If 1 <= (numerator+delta_plus) / denominator < 10 then no leading 0 digit -// will be produced. This should be the standard precondition. -static void GenerateShortestDigits(Bignum* numerator, Bignum* denominator, - Bignum* delta_minus, Bignum* delta_plus, - bool is_even, - Vector buffer, int* length) { - // Small optimization: if delta_minus and delta_plus are the same just reuse - // one of the two bignums. - if (Bignum::Equal(*delta_minus, *delta_plus)) { - delta_plus = delta_minus; - } - *length = 0; - for (;;) { - uint16_t digit; - digit = numerator->DivideModuloIntBignum(*denominator); - ASSERT(digit <= 9); // digit is a uint16_t and therefore always positive. - // digit = numerator / denominator (integer division). - // numerator = numerator % denominator. - buffer[(*length)++] = static_cast(digit + '0'); - - // Can we stop already? - // If the remainder of the division is less than the distance to the lower - // boundary we can stop. In this case we simply round down (discarding the - // remainder). - // Similarly we test if we can round up (using the upper boundary). - bool in_delta_room_minus; - bool in_delta_room_plus; - if (is_even) { - in_delta_room_minus = Bignum::LessEqual(*numerator, *delta_minus); - } else { - in_delta_room_minus = Bignum::Less(*numerator, *delta_minus); - } - if (is_even) { - in_delta_room_plus = - Bignum::PlusCompare(*numerator, *delta_plus, *denominator) >= 0; - } else { - in_delta_room_plus = - Bignum::PlusCompare(*numerator, *delta_plus, *denominator) > 0; - } - if (!in_delta_room_minus && !in_delta_room_plus) { - // Prepare for next iteration. - numerator->Times10(); - delta_minus->Times10(); - // We optimized delta_plus to be equal to delta_minus (if they share the - // same value). So don't multiply delta_plus if they point to the same - // object. - if (delta_minus != delta_plus) { - delta_plus->Times10(); - } - } else if (in_delta_room_minus && in_delta_room_plus) { - // Let's see if 2*numerator < denominator. - // If yes, then the next digit would be < 5 and we can round down. - int compare = Bignum::PlusCompare(*numerator, *numerator, *denominator); - if (compare < 0) { - // Remaining digits are less than .5. -> Round down (== do nothing). - } else if (compare > 0) { - // Remaining digits are more than .5 of denominator. -> Round up. - // Note that the last digit could not be a '9' as otherwise the whole - // loop would have stopped earlier. - // We still have an assert here in case the preconditions were not - // satisfied. - ASSERT(buffer[(*length) - 1] != '9'); - buffer[(*length) - 1]++; - } else { - // Halfway case. - // TODO(floitsch): need a way to solve half-way cases. - // For now let's round towards even (since this is what Gay seems to - // do). - - if ((buffer[(*length) - 1] - '0') % 2 == 0) { - // Round down => Do nothing. - } else { - ASSERT(buffer[(*length) - 1] != '9'); - buffer[(*length) - 1]++; - } - } - return; - } else if (in_delta_room_minus) { - // Round down (== do nothing). - return; - } else { // in_delta_room_plus - // Round up. - // Note again that the last digit could not be '9' since this would have - // stopped the loop earlier. - // We still have an ASSERT here, in case the preconditions were not - // satisfied. - ASSERT(buffer[(*length) -1] != '9'); - buffer[(*length) - 1]++; - return; - } - } -} - - -// Let v = numerator / denominator < 10. -// Then we generate 'count' digits of d = x.xxxxx... (without the decimal point) -// from left to right. Once 'count' digits have been produced we decide wether -// to round up or down. Remainders of exactly .5 round upwards. Numbers such -// as 9.999999 propagate a carry all the way, and change the -// exponent (decimal_point), when rounding upwards. -static void GenerateCountedDigits(int count, int* decimal_point, - Bignum* numerator, Bignum* denominator, - Vector buffer, int* length) { - ASSERT(count >= 0); - for (int i = 0; i < count - 1; ++i) { - uint16_t digit; - digit = numerator->DivideModuloIntBignum(*denominator); - ASSERT(digit <= 9); // digit is a uint16_t and therefore always positive. - // digit = numerator / denominator (integer division). - // numerator = numerator % denominator. - buffer[i] = static_cast(digit + '0'); - // Prepare for next iteration. - numerator->Times10(); - } - // Generate the last digit. - uint16_t digit; - digit = numerator->DivideModuloIntBignum(*denominator); - if (Bignum::PlusCompare(*numerator, *numerator, *denominator) >= 0) { - digit++; - } - ASSERT(digit <= 10); - buffer[count - 1] = static_cast(digit + '0'); - // Correct bad digits (in case we had a sequence of '9's). Propagate the - // carry until we hat a non-'9' or til we reach the first digit. - for (int i = count - 1; i > 0; --i) { - if (buffer[i] != '0' + 10) break; - buffer[i] = '0'; - buffer[i - 1]++; - } - if (buffer[0] == '0' + 10) { - // Propagate a carry past the top place. - buffer[0] = '1'; - (*decimal_point)++; - } - *length = count; -} - - -// Generates 'requested_digits' after the decimal point. It might omit -// trailing '0's. If the input number is too small then no digits at all are -// generated (ex.: 2 fixed digits for 0.00001). -// -// Input verifies: 1 <= (numerator + delta) / denominator < 10. -static void BignumToFixed(int requested_digits, int* decimal_point, - Bignum* numerator, Bignum* denominator, - Vector(buffer), int* length) { - // Note that we have to look at more than just the requested_digits, since - // a number could be rounded up. Example: v=0.5 with requested_digits=0. - // Even though the power of v equals 0 we can't just stop here. - if (-(*decimal_point) > requested_digits) { - // The number is definitively too small. - // Ex: 0.001 with requested_digits == 1. - // Set decimal-point to -requested_digits. This is what Gay does. - // Note that it should not have any effect anyways since the string is - // empty. - *decimal_point = -requested_digits; - *length = 0; - return; - } else if (-(*decimal_point) == requested_digits) { - // We only need to verify if the number rounds down or up. - // Ex: 0.04 and 0.06 with requested_digits == 1. - ASSERT(*decimal_point == -requested_digits); - // Initially the fraction lies in range (1, 10]. Multiply the denominator - // by 10 so that we can compare more easily. - denominator->Times10(); - if (Bignum::PlusCompare(*numerator, *numerator, *denominator) >= 0) { - // If the fraction is >= 0.5 then we have to include the rounded - // digit. - buffer[0] = '1'; - *length = 1; - (*decimal_point)++; - } else { - // Note that we caught most of similar cases earlier. - *length = 0; - } - return; - } else { - // The requested digits correspond to the digits after the point. - // The variable 'needed_digits' includes the digits before the point. - int needed_digits = (*decimal_point) + requested_digits; - GenerateCountedDigits(needed_digits, decimal_point, - numerator, denominator, - buffer, length); - } -} - - -// Returns an estimation of k such that 10^(k-1) <= v < 10^k where -// v = f * 2^exponent and 2^52 <= f < 2^53. -// v is hence a normalized double with the given exponent. The output is an -// approximation for the exponent of the decimal approimation .digits * 10^k. -// -// The result might undershoot by 1 in which case 10^k <= v < 10^k+1. -// Note: this property holds for v's upper boundary m+ too. -// 10^k <= m+ < 10^k+1. -// (see explanation below). -// -// Examples: -// EstimatePower(0) => 16 -// EstimatePower(-52) => 0 -// -// Note: e >= 0 => EstimatedPower(e) > 0. No similar claim can be made for e<0. -static int EstimatePower(int exponent) { - // This function estimates log10 of v where v = f*2^e (with e == exponent). - // Note that 10^floor(log10(v)) <= v, but v <= 10^ceil(log10(v)). - // Note that f is bounded by its container size. Let p = 53 (the double's - // significand size). Then 2^(p-1) <= f < 2^p. - // - // Given that log10(v) == log2(v)/log2(10) and e+(len(f)-1) is quite close - // to log2(v) the function is simplified to (e+(len(f)-1)/log2(10)). - // The computed number undershoots by less than 0.631 (when we compute log3 - // and not log10). - // - // Optimization: since we only need an approximated result this computation - // can be performed on 64 bit integers. On x86/x64 architecture the speedup is - // not really measurable, though. - // - // Since we want to avoid overshooting we decrement by 1e10 so that - // floating-point imprecisions don't affect us. - // - // Explanation for v's boundary m+: the computation takes advantage of - // the fact that 2^(p-1) <= f < 2^p. Boundaries still satisfy this requirement - // (even for denormals where the delta can be much more important). - - const double k1Log10 = 0.30102999566398114; // 1/lg(10) - - // For doubles len(f) == 53 (don't forget the hidden bit). - const int kSignificandSize = Double::kSignificandSize; - double estimate = ceil((exponent + kSignificandSize - 1) * k1Log10 - 1e-10); - return static_cast(estimate); -} - - -// See comments for InitialScaledStartValues. -static void InitialScaledStartValuesPositiveExponent( - uint64_t significand, int exponent, - int estimated_power, bool need_boundary_deltas, - Bignum* numerator, Bignum* denominator, - Bignum* delta_minus, Bignum* delta_plus) { - // A positive exponent implies a positive power. - ASSERT(estimated_power >= 0); - // Since the estimated_power is positive we simply multiply the denominator - // by 10^estimated_power. - - // numerator = v. - numerator->AssignUInt64(significand); - numerator->ShiftLeft(exponent); - // denominator = 10^estimated_power. - denominator->AssignPowerUInt16(10, estimated_power); - - if (need_boundary_deltas) { - // Introduce a common denominator so that the deltas to the boundaries are - // integers. - denominator->ShiftLeft(1); - numerator->ShiftLeft(1); - // Let v = f * 2^e, then m+ - v = 1/2 * 2^e; With the common - // denominator (of 2) delta_plus equals 2^e. - delta_plus->AssignUInt16(1); - delta_plus->ShiftLeft(exponent); - // Same for delta_minus. The adjustments if f == 2^p-1 are done later. - delta_minus->AssignUInt16(1); - delta_minus->ShiftLeft(exponent); - } -} - - -// See comments for InitialScaledStartValues -static void InitialScaledStartValuesNegativeExponentPositivePower( - uint64_t significand, int exponent, - int estimated_power, bool need_boundary_deltas, - Bignum* numerator, Bignum* denominator, - Bignum* delta_minus, Bignum* delta_plus) { - // v = f * 2^e with e < 0, and with estimated_power >= 0. - // This means that e is close to 0 (have a look at how estimated_power is - // computed). - - // numerator = significand - // since v = significand * 2^exponent this is equivalent to - // numerator = v * / 2^-exponent - numerator->AssignUInt64(significand); - // denominator = 10^estimated_power * 2^-exponent (with exponent < 0) - denominator->AssignPowerUInt16(10, estimated_power); - denominator->ShiftLeft(-exponent); - - if (need_boundary_deltas) { - // Introduce a common denominator so that the deltas to the boundaries are - // integers. - denominator->ShiftLeft(1); - numerator->ShiftLeft(1); - // Let v = f * 2^e, then m+ - v = 1/2 * 2^e; With the common - // denominator (of 2) delta_plus equals 2^e. - // Given that the denominator already includes v's exponent the distance - // to the boundaries is simply 1. - delta_plus->AssignUInt16(1); - // Same for delta_minus. The adjustments if f == 2^p-1 are done later. - delta_minus->AssignUInt16(1); - } -} - - -// See comments for InitialScaledStartValues -static void InitialScaledStartValuesNegativeExponentNegativePower( - uint64_t significand, int exponent, - int estimated_power, bool need_boundary_deltas, - Bignum* numerator, Bignum* denominator, - Bignum* delta_minus, Bignum* delta_plus) { - // Instead of multiplying the denominator with 10^estimated_power we - // multiply all values (numerator and deltas) by 10^-estimated_power. - - // Use numerator as temporary container for power_ten. - Bignum* power_ten = numerator; - power_ten->AssignPowerUInt16(10, -estimated_power); - - if (need_boundary_deltas) { - // Since power_ten == numerator we must make a copy of 10^estimated_power - // before we complete the computation of the numerator. - // delta_plus = delta_minus = 10^estimated_power - delta_plus->AssignBignum(*power_ten); - delta_minus->AssignBignum(*power_ten); - } - - // numerator = significand * 2 * 10^-estimated_power - // since v = significand * 2^exponent this is equivalent to - // numerator = v * 10^-estimated_power * 2 * 2^-exponent. - // Remember: numerator has been abused as power_ten. So no need to assign it - // to itself. - ASSERT(numerator == power_ten); - numerator->MultiplyByUInt64(significand); - - // denominator = 2 * 2^-exponent with exponent < 0. - denominator->AssignUInt16(1); - denominator->ShiftLeft(-exponent); - - if (need_boundary_deltas) { - // Introduce a common denominator so that the deltas to the boundaries are - // integers. - numerator->ShiftLeft(1); - denominator->ShiftLeft(1); - // With this shift the boundaries have their correct value, since - // delta_plus = 10^-estimated_power, and - // delta_minus = 10^-estimated_power. - // These assignments have been done earlier. - // The adjustments if f == 2^p-1 (lower boundary is closer) are done later. - } -} - - -// Let v = significand * 2^exponent. -// Computes v / 10^estimated_power exactly, as a ratio of two bignums, numerator -// and denominator. The functions GenerateShortestDigits and -// GenerateCountedDigits will then convert this ratio to its decimal -// representation d, with the required accuracy. -// Then d * 10^estimated_power is the representation of v. -// (Note: the fraction and the estimated_power might get adjusted before -// generating the decimal representation.) -// -// The initial start values consist of: -// - a scaled numerator: s.t. numerator/denominator == v / 10^estimated_power. -// - a scaled (common) denominator. -// optionally (used by GenerateShortestDigits to decide if it has the shortest -// decimal converting back to v): -// - v - m-: the distance to the lower boundary. -// - m+ - v: the distance to the upper boundary. -// -// v, m+, m-, and therefore v - m- and m+ - v all share the same denominator. -// -// Let ep == estimated_power, then the returned values will satisfy: -// v / 10^ep = numerator / denominator. -// v's boundarys m- and m+: -// m- / 10^ep == v / 10^ep - delta_minus / denominator -// m+ / 10^ep == v / 10^ep + delta_plus / denominator -// Or in other words: -// m- == v - delta_minus * 10^ep / denominator; -// m+ == v + delta_plus * 10^ep / denominator; -// -// Since 10^(k-1) <= v < 10^k (with k == estimated_power) -// or 10^k <= v < 10^(k+1) -// we then have 0.1 <= numerator/denominator < 1 -// or 1 <= numerator/denominator < 10 -// -// It is then easy to kickstart the digit-generation routine. -// -// The boundary-deltas are only filled if the mode equals BIGNUM_DTOA_SHORTEST -// or BIGNUM_DTOA_SHORTEST_SINGLE. - -static void InitialScaledStartValues(uint64_t significand, - int exponent, - bool lower_boundary_is_closer, - int estimated_power, - bool need_boundary_deltas, - Bignum* numerator, - Bignum* denominator, - Bignum* delta_minus, - Bignum* delta_plus) { - if (exponent >= 0) { - InitialScaledStartValuesPositiveExponent( - significand, exponent, estimated_power, need_boundary_deltas, - numerator, denominator, delta_minus, delta_plus); - } else if (estimated_power >= 0) { - InitialScaledStartValuesNegativeExponentPositivePower( - significand, exponent, estimated_power, need_boundary_deltas, - numerator, denominator, delta_minus, delta_plus); - } else { - InitialScaledStartValuesNegativeExponentNegativePower( - significand, exponent, estimated_power, need_boundary_deltas, - numerator, denominator, delta_minus, delta_plus); - } - - if (need_boundary_deltas && lower_boundary_is_closer) { - // The lower boundary is closer at half the distance of "normal" numbers. - // Increase the common denominator and adapt all but the delta_minus. - denominator->ShiftLeft(1); // *2 - numerator->ShiftLeft(1); // *2 - delta_plus->ShiftLeft(1); // *2 - } -} - - -// This routine multiplies numerator/denominator so that its values lies in the -// range 1-10. That is after a call to this function we have: -// 1 <= (numerator + delta_plus) /denominator < 10. -// Let numerator the input before modification and numerator' the argument -// after modification, then the output-parameter decimal_point is such that -// numerator / denominator * 10^estimated_power == -// numerator' / denominator' * 10^(decimal_point - 1) -// In some cases estimated_power was too low, and this is already the case. We -// then simply adjust the power so that 10^(k-1) <= v < 10^k (with k == -// estimated_power) but do not touch the numerator or denominator. -// Otherwise the routine multiplies the numerator and the deltas by 10. -static void FixupMultiply10(int estimated_power, bool is_even, - int* decimal_point, - Bignum* numerator, Bignum* denominator, - Bignum* delta_minus, Bignum* delta_plus) { - bool in_range; - if (is_even) { - // For IEEE doubles half-way cases (in decimal system numbers ending with 5) - // are rounded to the closest floating-point number with even significand. - in_range = Bignum::PlusCompare(*numerator, *delta_plus, *denominator) >= 0; - } else { - in_range = Bignum::PlusCompare(*numerator, *delta_plus, *denominator) > 0; - } - if (in_range) { - // Since numerator + delta_plus >= denominator we already have - // 1 <= numerator/denominator < 10. Simply update the estimated_power. - *decimal_point = estimated_power + 1; - } else { - *decimal_point = estimated_power; - numerator->Times10(); - if (Bignum::Equal(*delta_minus, *delta_plus)) { - delta_minus->Times10(); - delta_plus->AssignBignum(*delta_minus); - } else { - delta_minus->Times10(); - delta_plus->Times10(); - } - } -} - -} // namespace double_conversion diff --git a/ios/Pods/DoubleConversion/double-conversion/bignum-dtoa.h b/ios/Pods/DoubleConversion/double-conversion/bignum-dtoa.h deleted file mode 100644 index 34b9619..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/bignum-dtoa.h +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_BIGNUM_DTOA_H_ -#define DOUBLE_CONVERSION_BIGNUM_DTOA_H_ - -#include "utils.h" - -namespace double_conversion { - -enum BignumDtoaMode { - // Return the shortest correct representation. - // For example the output of 0.299999999999999988897 is (the less accurate but - // correct) 0.3. - BIGNUM_DTOA_SHORTEST, - // Same as BIGNUM_DTOA_SHORTEST but for single-precision floats. - BIGNUM_DTOA_SHORTEST_SINGLE, - // Return a fixed number of digits after the decimal point. - // For instance fixed(0.1, 4) becomes 0.1000 - // If the input number is big, the output will be big. - BIGNUM_DTOA_FIXED, - // Return a fixed number of digits, no matter what the exponent is. - BIGNUM_DTOA_PRECISION -}; - -// Converts the given double 'v' to ascii. -// The result should be interpreted as buffer * 10^(point-length). -// The buffer will be null-terminated. -// -// The input v must be > 0 and different from NaN, and Infinity. -// -// The output depends on the given mode: -// - SHORTEST: produce the least amount of digits for which the internal -// identity requirement is still satisfied. If the digits are printed -// (together with the correct exponent) then reading this number will give -// 'v' again. The buffer will choose the representation that is closest to -// 'v'. If there are two at the same distance, than the number is round up. -// In this mode the 'requested_digits' parameter is ignored. -// - FIXED: produces digits necessary to print a given number with -// 'requested_digits' digits after the decimal point. The produced digits -// might be too short in which case the caller has to fill the gaps with '0's. -// Example: toFixed(0.001, 5) is allowed to return buffer="1", point=-2. -// Halfway cases are rounded up. The call toFixed(0.15, 2) thus returns -// buffer="2", point=0. -// Note: the length of the returned buffer has no meaning wrt the significance -// of its digits. That is, just because it contains '0's does not mean that -// any other digit would not satisfy the internal identity requirement. -// - PRECISION: produces 'requested_digits' where the first digit is not '0'. -// Even though the length of produced digits usually equals -// 'requested_digits', the function is allowed to return fewer digits, in -// which case the caller has to fill the missing digits with '0's. -// Halfway cases are again rounded up. -// 'BignumDtoa' expects the given buffer to be big enough to hold all digits -// and a terminating null-character. -void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits, - Vector buffer, int* length, int* point); - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_BIGNUM_DTOA_H_ diff --git a/ios/Pods/DoubleConversion/double-conversion/bignum.cc b/ios/Pods/DoubleConversion/double-conversion/bignum.cc deleted file mode 100644 index 2743d67..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/bignum.cc +++ /dev/null @@ -1,766 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include "bignum.h" -#include "utils.h" - -namespace double_conversion { - -Bignum::Bignum() - : bigits_(bigits_buffer_, kBigitCapacity), used_digits_(0), exponent_(0) { - for (int i = 0; i < kBigitCapacity; ++i) { - bigits_[i] = 0; - } -} - - -template -static int BitSize(S value) { - (void) value; // Mark variable as used. - return 8 * sizeof(value); -} - -// Guaranteed to lie in one Bigit. -void Bignum::AssignUInt16(uint16_t value) { - ASSERT(kBigitSize >= BitSize(value)); - Zero(); - if (value == 0) return; - - EnsureCapacity(1); - bigits_[0] = value; - used_digits_ = 1; -} - - -void Bignum::AssignUInt64(uint64_t value) { - const int kUInt64Size = 64; - - Zero(); - if (value == 0) return; - - int needed_bigits = kUInt64Size / kBigitSize + 1; - EnsureCapacity(needed_bigits); - for (int i = 0; i < needed_bigits; ++i) { - bigits_[i] = value & kBigitMask; - value = value >> kBigitSize; - } - used_digits_ = needed_bigits; - Clamp(); -} - - -void Bignum::AssignBignum(const Bignum& other) { - exponent_ = other.exponent_; - for (int i = 0; i < other.used_digits_; ++i) { - bigits_[i] = other.bigits_[i]; - } - // Clear the excess digits (if there were any). - for (int i = other.used_digits_; i < used_digits_; ++i) { - bigits_[i] = 0; - } - used_digits_ = other.used_digits_; -} - - -static uint64_t ReadUInt64(Vector buffer, - int from, - int digits_to_read) { - uint64_t result = 0; - for (int i = from; i < from + digits_to_read; ++i) { - int digit = buffer[i] - '0'; - ASSERT(0 <= digit && digit <= 9); - result = result * 10 + digit; - } - return result; -} - - -void Bignum::AssignDecimalString(Vector value) { - // 2^64 = 18446744073709551616 > 10^19 - const int kMaxUint64DecimalDigits = 19; - Zero(); - int length = value.length(); - int pos = 0; - // Let's just say that each digit needs 4 bits. - while (length >= kMaxUint64DecimalDigits) { - uint64_t digits = ReadUInt64(value, pos, kMaxUint64DecimalDigits); - pos += kMaxUint64DecimalDigits; - length -= kMaxUint64DecimalDigits; - MultiplyByPowerOfTen(kMaxUint64DecimalDigits); - AddUInt64(digits); - } - uint64_t digits = ReadUInt64(value, pos, length); - MultiplyByPowerOfTen(length); - AddUInt64(digits); - Clamp(); -} - - -static int HexCharValue(char c) { - if ('0' <= c && c <= '9') return c - '0'; - if ('a' <= c && c <= 'f') return 10 + c - 'a'; - ASSERT('A' <= c && c <= 'F'); - return 10 + c - 'A'; -} - - -void Bignum::AssignHexString(Vector value) { - Zero(); - int length = value.length(); - - int needed_bigits = length * 4 / kBigitSize + 1; - EnsureCapacity(needed_bigits); - int string_index = length - 1; - for (int i = 0; i < needed_bigits - 1; ++i) { - // These bigits are guaranteed to be "full". - Chunk current_bigit = 0; - for (int j = 0; j < kBigitSize / 4; j++) { - current_bigit += HexCharValue(value[string_index--]) << (j * 4); - } - bigits_[i] = current_bigit; - } - used_digits_ = needed_bigits - 1; - - Chunk most_significant_bigit = 0; // Could be = 0; - for (int j = 0; j <= string_index; ++j) { - most_significant_bigit <<= 4; - most_significant_bigit += HexCharValue(value[j]); - } - if (most_significant_bigit != 0) { - bigits_[used_digits_] = most_significant_bigit; - used_digits_++; - } - Clamp(); -} - - -void Bignum::AddUInt64(uint64_t operand) { - if (operand == 0) return; - Bignum other; - other.AssignUInt64(operand); - AddBignum(other); -} - - -void Bignum::AddBignum(const Bignum& other) { - ASSERT(IsClamped()); - ASSERT(other.IsClamped()); - - // If this has a greater exponent than other append zero-bigits to this. - // After this call exponent_ <= other.exponent_. - Align(other); - - // There are two possibilities: - // aaaaaaaaaaa 0000 (where the 0s represent a's exponent) - // bbbbb 00000000 - // ---------------- - // ccccccccccc 0000 - // or - // aaaaaaaaaa 0000 - // bbbbbbbbb 0000000 - // ----------------- - // cccccccccccc 0000 - // In both cases we might need a carry bigit. - - EnsureCapacity(1 + Max(BigitLength(), other.BigitLength()) - exponent_); - Chunk carry = 0; - int bigit_pos = other.exponent_ - exponent_; - ASSERT(bigit_pos >= 0); - for (int i = 0; i < other.used_digits_; ++i) { - Chunk sum = bigits_[bigit_pos] + other.bigits_[i] + carry; - bigits_[bigit_pos] = sum & kBigitMask; - carry = sum >> kBigitSize; - bigit_pos++; - } - - while (carry != 0) { - Chunk sum = bigits_[bigit_pos] + carry; - bigits_[bigit_pos] = sum & kBigitMask; - carry = sum >> kBigitSize; - bigit_pos++; - } - used_digits_ = Max(bigit_pos, used_digits_); - ASSERT(IsClamped()); -} - - -void Bignum::SubtractBignum(const Bignum& other) { - ASSERT(IsClamped()); - ASSERT(other.IsClamped()); - // We require this to be bigger than other. - ASSERT(LessEqual(other, *this)); - - Align(other); - - int offset = other.exponent_ - exponent_; - Chunk borrow = 0; - int i; - for (i = 0; i < other.used_digits_; ++i) { - ASSERT((borrow == 0) || (borrow == 1)); - Chunk difference = bigits_[i + offset] - other.bigits_[i] - borrow; - bigits_[i + offset] = difference & kBigitMask; - borrow = difference >> (kChunkSize - 1); - } - while (borrow != 0) { - Chunk difference = bigits_[i + offset] - borrow; - bigits_[i + offset] = difference & kBigitMask; - borrow = difference >> (kChunkSize - 1); - ++i; - } - Clamp(); -} - - -void Bignum::ShiftLeft(int shift_amount) { - if (used_digits_ == 0) return; - exponent_ += shift_amount / kBigitSize; - int local_shift = shift_amount % kBigitSize; - EnsureCapacity(used_digits_ + 1); - BigitsShiftLeft(local_shift); -} - - -void Bignum::MultiplyByUInt32(uint32_t factor) { - if (factor == 1) return; - if (factor == 0) { - Zero(); - return; - } - if (used_digits_ == 0) return; - - // The product of a bigit with the factor is of size kBigitSize + 32. - // Assert that this number + 1 (for the carry) fits into double chunk. - ASSERT(kDoubleChunkSize >= kBigitSize + 32 + 1); - DoubleChunk carry = 0; - for (int i = 0; i < used_digits_; ++i) { - DoubleChunk product = static_cast(factor) * bigits_[i] + carry; - bigits_[i] = static_cast(product & kBigitMask); - carry = (product >> kBigitSize); - } - while (carry != 0) { - EnsureCapacity(used_digits_ + 1); - bigits_[used_digits_] = carry & kBigitMask; - used_digits_++; - carry >>= kBigitSize; - } -} - - -void Bignum::MultiplyByUInt64(uint64_t factor) { - if (factor == 1) return; - if (factor == 0) { - Zero(); - return; - } - ASSERT(kBigitSize < 32); - uint64_t carry = 0; - uint64_t low = factor & 0xFFFFFFFF; - uint64_t high = factor >> 32; - for (int i = 0; i < used_digits_; ++i) { - uint64_t product_low = low * bigits_[i]; - uint64_t product_high = high * bigits_[i]; - uint64_t tmp = (carry & kBigitMask) + product_low; - bigits_[i] = tmp & kBigitMask; - carry = (carry >> kBigitSize) + (tmp >> kBigitSize) + - (product_high << (32 - kBigitSize)); - } - while (carry != 0) { - EnsureCapacity(used_digits_ + 1); - bigits_[used_digits_] = carry & kBigitMask; - used_digits_++; - carry >>= kBigitSize; - } -} - - -void Bignum::MultiplyByPowerOfTen(int exponent) { - const uint64_t kFive27 = UINT64_2PART_C(0x6765c793, fa10079d); - const uint16_t kFive1 = 5; - const uint16_t kFive2 = kFive1 * 5; - const uint16_t kFive3 = kFive2 * 5; - const uint16_t kFive4 = kFive3 * 5; - const uint16_t kFive5 = kFive4 * 5; - const uint16_t kFive6 = kFive5 * 5; - const uint32_t kFive7 = kFive6 * 5; - const uint32_t kFive8 = kFive7 * 5; - const uint32_t kFive9 = kFive8 * 5; - const uint32_t kFive10 = kFive9 * 5; - const uint32_t kFive11 = kFive10 * 5; - const uint32_t kFive12 = kFive11 * 5; - const uint32_t kFive13 = kFive12 * 5; - const uint32_t kFive1_to_12[] = - { kFive1, kFive2, kFive3, kFive4, kFive5, kFive6, - kFive7, kFive8, kFive9, kFive10, kFive11, kFive12 }; - - ASSERT(exponent >= 0); - if (exponent == 0) return; - if (used_digits_ == 0) return; - - // We shift by exponent at the end just before returning. - int remaining_exponent = exponent; - while (remaining_exponent >= 27) { - MultiplyByUInt64(kFive27); - remaining_exponent -= 27; - } - while (remaining_exponent >= 13) { - MultiplyByUInt32(kFive13); - remaining_exponent -= 13; - } - if (remaining_exponent > 0) { - MultiplyByUInt32(kFive1_to_12[remaining_exponent - 1]); - } - ShiftLeft(exponent); -} - - -void Bignum::Square() { - ASSERT(IsClamped()); - int product_length = 2 * used_digits_; - EnsureCapacity(product_length); - - // Comba multiplication: compute each column separately. - // Example: r = a2a1a0 * b2b1b0. - // r = 1 * a0b0 + - // 10 * (a1b0 + a0b1) + - // 100 * (a2b0 + a1b1 + a0b2) + - // 1000 * (a2b1 + a1b2) + - // 10000 * a2b2 - // - // In the worst case we have to accumulate nb-digits products of digit*digit. - // - // Assert that the additional number of bits in a DoubleChunk are enough to - // sum up used_digits of Bigit*Bigit. - if ((1 << (2 * (kChunkSize - kBigitSize))) <= used_digits_) { - UNIMPLEMENTED(); - } - DoubleChunk accumulator = 0; - // First shift the digits so we don't overwrite them. - int copy_offset = used_digits_; - for (int i = 0; i < used_digits_; ++i) { - bigits_[copy_offset + i] = bigits_[i]; - } - // We have two loops to avoid some 'if's in the loop. - for (int i = 0; i < used_digits_; ++i) { - // Process temporary digit i with power i. - // The sum of the two indices must be equal to i. - int bigit_index1 = i; - int bigit_index2 = 0; - // Sum all of the sub-products. - while (bigit_index1 >= 0) { - Chunk chunk1 = bigits_[copy_offset + bigit_index1]; - Chunk chunk2 = bigits_[copy_offset + bigit_index2]; - accumulator += static_cast(chunk1) * chunk2; - bigit_index1--; - bigit_index2++; - } - bigits_[i] = static_cast(accumulator) & kBigitMask; - accumulator >>= kBigitSize; - } - for (int i = used_digits_; i < product_length; ++i) { - int bigit_index1 = used_digits_ - 1; - int bigit_index2 = i - bigit_index1; - // Invariant: sum of both indices is again equal to i. - // Inner loop runs 0 times on last iteration, emptying accumulator. - while (bigit_index2 < used_digits_) { - Chunk chunk1 = bigits_[copy_offset + bigit_index1]; - Chunk chunk2 = bigits_[copy_offset + bigit_index2]; - accumulator += static_cast(chunk1) * chunk2; - bigit_index1--; - bigit_index2++; - } - // The overwritten bigits_[i] will never be read in further loop iterations, - // because bigit_index1 and bigit_index2 are always greater - // than i - used_digits_. - bigits_[i] = static_cast(accumulator) & kBigitMask; - accumulator >>= kBigitSize; - } - // Since the result was guaranteed to lie inside the number the - // accumulator must be 0 now. - ASSERT(accumulator == 0); - - // Don't forget to update the used_digits and the exponent. - used_digits_ = product_length; - exponent_ *= 2; - Clamp(); -} - - -void Bignum::AssignPowerUInt16(uint16_t base, int power_exponent) { - ASSERT(base != 0); - ASSERT(power_exponent >= 0); - if (power_exponent == 0) { - AssignUInt16(1); - return; - } - Zero(); - int shifts = 0; - // We expect base to be in range 2-32, and most often to be 10. - // It does not make much sense to implement different algorithms for counting - // the bits. - while ((base & 1) == 0) { - base >>= 1; - shifts++; - } - int bit_size = 0; - int tmp_base = base; - while (tmp_base != 0) { - tmp_base >>= 1; - bit_size++; - } - int final_size = bit_size * power_exponent; - // 1 extra bigit for the shifting, and one for rounded final_size. - EnsureCapacity(final_size / kBigitSize + 2); - - // Left to Right exponentiation. - int mask = 1; - while (power_exponent >= mask) mask <<= 1; - - // The mask is now pointing to the bit above the most significant 1-bit of - // power_exponent. - // Get rid of first 1-bit; - mask >>= 2; - uint64_t this_value = base; - - bool delayed_multipliciation = false; - const uint64_t max_32bits = 0xFFFFFFFF; - while (mask != 0 && this_value <= max_32bits) { - this_value = this_value * this_value; - // Verify that there is enough space in this_value to perform the - // multiplication. The first bit_size bits must be 0. - if ((power_exponent & mask) != 0) { - uint64_t base_bits_mask = - ~((static_cast(1) << (64 - bit_size)) - 1); - bool high_bits_zero = (this_value & base_bits_mask) == 0; - if (high_bits_zero) { - this_value *= base; - } else { - delayed_multipliciation = true; - } - } - mask >>= 1; - } - AssignUInt64(this_value); - if (delayed_multipliciation) { - MultiplyByUInt32(base); - } - - // Now do the same thing as a bignum. - while (mask != 0) { - Square(); - if ((power_exponent & mask) != 0) { - MultiplyByUInt32(base); - } - mask >>= 1; - } - - // And finally add the saved shifts. - ShiftLeft(shifts * power_exponent); -} - - -// Precondition: this/other < 16bit. -uint16_t Bignum::DivideModuloIntBignum(const Bignum& other) { - ASSERT(IsClamped()); - ASSERT(other.IsClamped()); - ASSERT(other.used_digits_ > 0); - - // Easy case: if we have less digits than the divisor than the result is 0. - // Note: this handles the case where this == 0, too. - if (BigitLength() < other.BigitLength()) { - return 0; - } - - Align(other); - - uint16_t result = 0; - - // Start by removing multiples of 'other' until both numbers have the same - // number of digits. - while (BigitLength() > other.BigitLength()) { - // This naive approach is extremely inefficient if `this` divided by other - // is big. This function is implemented for doubleToString where - // the result should be small (less than 10). - ASSERT(other.bigits_[other.used_digits_ - 1] >= ((1 << kBigitSize) / 16)); - ASSERT(bigits_[used_digits_ - 1] < 0x10000); - // Remove the multiples of the first digit. - // Example this = 23 and other equals 9. -> Remove 2 multiples. - result += static_cast(bigits_[used_digits_ - 1]); - SubtractTimes(other, bigits_[used_digits_ - 1]); - } - - ASSERT(BigitLength() == other.BigitLength()); - - // Both bignums are at the same length now. - // Since other has more than 0 digits we know that the access to - // bigits_[used_digits_ - 1] is safe. - Chunk this_bigit = bigits_[used_digits_ - 1]; - Chunk other_bigit = other.bigits_[other.used_digits_ - 1]; - - if (other.used_digits_ == 1) { - // Shortcut for easy (and common) case. - int quotient = this_bigit / other_bigit; - bigits_[used_digits_ - 1] = this_bigit - other_bigit * quotient; - ASSERT(quotient < 0x10000); - result += static_cast(quotient); - Clamp(); - return result; - } - - int division_estimate = this_bigit / (other_bigit + 1); - ASSERT(division_estimate < 0x10000); - result += static_cast(division_estimate); - SubtractTimes(other, division_estimate); - - if (other_bigit * (division_estimate + 1) > this_bigit) { - // No need to even try to subtract. Even if other's remaining digits were 0 - // another subtraction would be too much. - return result; - } - - while (LessEqual(other, *this)) { - SubtractBignum(other); - result++; - } - return result; -} - - -template -static int SizeInHexChars(S number) { - ASSERT(number > 0); - int result = 0; - while (number != 0) { - number >>= 4; - result++; - } - return result; -} - - -static char HexCharOfValue(int value) { - ASSERT(0 <= value && value <= 16); - if (value < 10) return static_cast(value + '0'); - return static_cast(value - 10 + 'A'); -} - - -bool Bignum::ToHexString(char* buffer, int buffer_size) const { - ASSERT(IsClamped()); - // Each bigit must be printable as separate hex-character. - ASSERT(kBigitSize % 4 == 0); - const int kHexCharsPerBigit = kBigitSize / 4; - - if (used_digits_ == 0) { - if (buffer_size < 2) return false; - buffer[0] = '0'; - buffer[1] = '\0'; - return true; - } - // We add 1 for the terminating '\0' character. - int needed_chars = (BigitLength() - 1) * kHexCharsPerBigit + - SizeInHexChars(bigits_[used_digits_ - 1]) + 1; - if (needed_chars > buffer_size) return false; - int string_index = needed_chars - 1; - buffer[string_index--] = '\0'; - for (int i = 0; i < exponent_; ++i) { - for (int j = 0; j < kHexCharsPerBigit; ++j) { - buffer[string_index--] = '0'; - } - } - for (int i = 0; i < used_digits_ - 1; ++i) { - Chunk current_bigit = bigits_[i]; - for (int j = 0; j < kHexCharsPerBigit; ++j) { - buffer[string_index--] = HexCharOfValue(current_bigit & 0xF); - current_bigit >>= 4; - } - } - // And finally the last bigit. - Chunk most_significant_bigit = bigits_[used_digits_ - 1]; - while (most_significant_bigit != 0) { - buffer[string_index--] = HexCharOfValue(most_significant_bigit & 0xF); - most_significant_bigit >>= 4; - } - return true; -} - - -Bignum::Chunk Bignum::BigitAt(int index) const { - if (index >= BigitLength()) return 0; - if (index < exponent_) return 0; - return bigits_[index - exponent_]; -} - - -int Bignum::Compare(const Bignum& a, const Bignum& b) { - ASSERT(a.IsClamped()); - ASSERT(b.IsClamped()); - int bigit_length_a = a.BigitLength(); - int bigit_length_b = b.BigitLength(); - if (bigit_length_a < bigit_length_b) return -1; - if (bigit_length_a > bigit_length_b) return +1; - for (int i = bigit_length_a - 1; i >= Min(a.exponent_, b.exponent_); --i) { - Chunk bigit_a = a.BigitAt(i); - Chunk bigit_b = b.BigitAt(i); - if (bigit_a < bigit_b) return -1; - if (bigit_a > bigit_b) return +1; - // Otherwise they are equal up to this digit. Try the next digit. - } - return 0; -} - - -int Bignum::PlusCompare(const Bignum& a, const Bignum& b, const Bignum& c) { - ASSERT(a.IsClamped()); - ASSERT(b.IsClamped()); - ASSERT(c.IsClamped()); - if (a.BigitLength() < b.BigitLength()) { - return PlusCompare(b, a, c); - } - if (a.BigitLength() + 1 < c.BigitLength()) return -1; - if (a.BigitLength() > c.BigitLength()) return +1; - // The exponent encodes 0-bigits. So if there are more 0-digits in 'a' than - // 'b' has digits, then the bigit-length of 'a'+'b' must be equal to the one - // of 'a'. - if (a.exponent_ >= b.BigitLength() && a.BigitLength() < c.BigitLength()) { - return -1; - } - - Chunk borrow = 0; - // Starting at min_exponent all digits are == 0. So no need to compare them. - int min_exponent = Min(Min(a.exponent_, b.exponent_), c.exponent_); - for (int i = c.BigitLength() - 1; i >= min_exponent; --i) { - Chunk chunk_a = a.BigitAt(i); - Chunk chunk_b = b.BigitAt(i); - Chunk chunk_c = c.BigitAt(i); - Chunk sum = chunk_a + chunk_b; - if (sum > chunk_c + borrow) { - return +1; - } else { - borrow = chunk_c + borrow - sum; - if (borrow > 1) return -1; - borrow <<= kBigitSize; - } - } - if (borrow == 0) return 0; - return -1; -} - - -void Bignum::Clamp() { - while (used_digits_ > 0 && bigits_[used_digits_ - 1] == 0) { - used_digits_--; - } - if (used_digits_ == 0) { - // Zero. - exponent_ = 0; - } -} - - -bool Bignum::IsClamped() const { - return used_digits_ == 0 || bigits_[used_digits_ - 1] != 0; -} - - -void Bignum::Zero() { - for (int i = 0; i < used_digits_; ++i) { - bigits_[i] = 0; - } - used_digits_ = 0; - exponent_ = 0; -} - - -void Bignum::Align(const Bignum& other) { - if (exponent_ > other.exponent_) { - // If "X" represents a "hidden" digit (by the exponent) then we are in the - // following case (a == this, b == other): - // a: aaaaaaXXXX or a: aaaaaXXX - // b: bbbbbbX b: bbbbbbbbXX - // We replace some of the hidden digits (X) of a with 0 digits. - // a: aaaaaa000X or a: aaaaa0XX - int zero_digits = exponent_ - other.exponent_; - EnsureCapacity(used_digits_ + zero_digits); - for (int i = used_digits_ - 1; i >= 0; --i) { - bigits_[i + zero_digits] = bigits_[i]; - } - for (int i = 0; i < zero_digits; ++i) { - bigits_[i] = 0; - } - used_digits_ += zero_digits; - exponent_ -= zero_digits; - ASSERT(used_digits_ >= 0); - ASSERT(exponent_ >= 0); - } -} - - -void Bignum::BigitsShiftLeft(int shift_amount) { - ASSERT(shift_amount < kBigitSize); - ASSERT(shift_amount >= 0); - Chunk carry = 0; - for (int i = 0; i < used_digits_; ++i) { - Chunk new_carry = bigits_[i] >> (kBigitSize - shift_amount); - bigits_[i] = ((bigits_[i] << shift_amount) + carry) & kBigitMask; - carry = new_carry; - } - if (carry != 0) { - bigits_[used_digits_] = carry; - used_digits_++; - } -} - - -void Bignum::SubtractTimes(const Bignum& other, int factor) { - ASSERT(exponent_ <= other.exponent_); - if (factor < 3) { - for (int i = 0; i < factor; ++i) { - SubtractBignum(other); - } - return; - } - Chunk borrow = 0; - int exponent_diff = other.exponent_ - exponent_; - for (int i = 0; i < other.used_digits_; ++i) { - DoubleChunk product = static_cast(factor) * other.bigits_[i]; - DoubleChunk remove = borrow + product; - Chunk difference = bigits_[i + exponent_diff] - (remove & kBigitMask); - bigits_[i + exponent_diff] = difference & kBigitMask; - borrow = static_cast((difference >> (kChunkSize - 1)) + - (remove >> kBigitSize)); - } - for (int i = other.used_digits_ + exponent_diff; i < used_digits_; ++i) { - if (borrow == 0) return; - Chunk difference = bigits_[i] - borrow; - bigits_[i] = difference & kBigitMask; - borrow = difference >> (kChunkSize - 1); - } - Clamp(); -} - - -} // namespace double_conversion diff --git a/ios/Pods/DoubleConversion/double-conversion/bignum.h b/ios/Pods/DoubleConversion/double-conversion/bignum.h deleted file mode 100644 index 5ec3544..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/bignum.h +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_BIGNUM_H_ -#define DOUBLE_CONVERSION_BIGNUM_H_ - -#include "utils.h" - -namespace double_conversion { - -class Bignum { - public: - // 3584 = 128 * 28. We can represent 2^3584 > 10^1000 accurately. - // This bignum can encode much bigger numbers, since it contains an - // exponent. - static const int kMaxSignificantBits = 3584; - - Bignum(); - void AssignUInt16(uint16_t value); - void AssignUInt64(uint64_t value); - void AssignBignum(const Bignum& other); - - void AssignDecimalString(Vector value); - void AssignHexString(Vector value); - - void AssignPowerUInt16(uint16_t base, int exponent); - - void AddUInt16(uint16_t operand); - void AddUInt64(uint64_t operand); - void AddBignum(const Bignum& other); - // Precondition: this >= other. - void SubtractBignum(const Bignum& other); - - void Square(); - void ShiftLeft(int shift_amount); - void MultiplyByUInt32(uint32_t factor); - void MultiplyByUInt64(uint64_t factor); - void MultiplyByPowerOfTen(int exponent); - void Times10() { return MultiplyByUInt32(10); } - // Pseudocode: - // int result = this / other; - // this = this % other; - // In the worst case this function is in O(this/other). - uint16_t DivideModuloIntBignum(const Bignum& other); - - bool ToHexString(char* buffer, int buffer_size) const; - - // Returns - // -1 if a < b, - // 0 if a == b, and - // +1 if a > b. - static int Compare(const Bignum& a, const Bignum& b); - static bool Equal(const Bignum& a, const Bignum& b) { - return Compare(a, b) == 0; - } - static bool LessEqual(const Bignum& a, const Bignum& b) { - return Compare(a, b) <= 0; - } - static bool Less(const Bignum& a, const Bignum& b) { - return Compare(a, b) < 0; - } - // Returns Compare(a + b, c); - static int PlusCompare(const Bignum& a, const Bignum& b, const Bignum& c); - // Returns a + b == c - static bool PlusEqual(const Bignum& a, const Bignum& b, const Bignum& c) { - return PlusCompare(a, b, c) == 0; - } - // Returns a + b <= c - static bool PlusLessEqual(const Bignum& a, const Bignum& b, const Bignum& c) { - return PlusCompare(a, b, c) <= 0; - } - // Returns a + b < c - static bool PlusLess(const Bignum& a, const Bignum& b, const Bignum& c) { - return PlusCompare(a, b, c) < 0; - } - private: - typedef uint32_t Chunk; - typedef uint64_t DoubleChunk; - - static const int kChunkSize = sizeof(Chunk) * 8; - static const int kDoubleChunkSize = sizeof(DoubleChunk) * 8; - // With bigit size of 28 we loose some bits, but a double still fits easily - // into two chunks, and more importantly we can use the Comba multiplication. - static const int kBigitSize = 28; - static const Chunk kBigitMask = (1 << kBigitSize) - 1; - // Every instance allocates kBigitLength chunks on the stack. Bignums cannot - // grow. There are no checks if the stack-allocated space is sufficient. - static const int kBigitCapacity = kMaxSignificantBits / kBigitSize; - - void EnsureCapacity(int size) { - if (size > kBigitCapacity) { - UNREACHABLE(); - } - } - void Align(const Bignum& other); - void Clamp(); - bool IsClamped() const; - void Zero(); - // Requires this to have enough capacity (no tests done). - // Updates used_digits_ if necessary. - // shift_amount must be < kBigitSize. - void BigitsShiftLeft(int shift_amount); - // BigitLength includes the "hidden" digits encoded in the exponent. - int BigitLength() const { return used_digits_ + exponent_; } - Chunk BigitAt(int index) const; - void SubtractTimes(const Bignum& other, int factor); - - Chunk bigits_buffer_[kBigitCapacity]; - // A vector backed by bigits_buffer_. This way accesses to the array are - // checked for out-of-bounds errors. - Vector bigits_; - int used_digits_; - // The Bignum's value equals value(bigits_) * 2^(exponent_ * kBigitSize). - int exponent_; - - DISALLOW_COPY_AND_ASSIGN(Bignum); -}; - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_BIGNUM_H_ diff --git a/ios/Pods/DoubleConversion/double-conversion/cached-powers.cc b/ios/Pods/DoubleConversion/double-conversion/cached-powers.cc deleted file mode 100644 index d1359ff..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/cached-powers.cc +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright 2006-2008 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include -#include -#include - -#include "utils.h" - -#include "cached-powers.h" - -namespace double_conversion { - -struct CachedPower { - uint64_t significand; - int16_t binary_exponent; - int16_t decimal_exponent; -}; - -static const CachedPower kCachedPowers[] = { - {UINT64_2PART_C(0xfa8fd5a0, 081c0288), -1220, -348}, - {UINT64_2PART_C(0xbaaee17f, a23ebf76), -1193, -340}, - {UINT64_2PART_C(0x8b16fb20, 3055ac76), -1166, -332}, - {UINT64_2PART_C(0xcf42894a, 5dce35ea), -1140, -324}, - {UINT64_2PART_C(0x9a6bb0aa, 55653b2d), -1113, -316}, - {UINT64_2PART_C(0xe61acf03, 3d1a45df), -1087, -308}, - {UINT64_2PART_C(0xab70fe17, c79ac6ca), -1060, -300}, - {UINT64_2PART_C(0xff77b1fc, bebcdc4f), -1034, -292}, - {UINT64_2PART_C(0xbe5691ef, 416bd60c), -1007, -284}, - {UINT64_2PART_C(0x8dd01fad, 907ffc3c), -980, -276}, - {UINT64_2PART_C(0xd3515c28, 31559a83), -954, -268}, - {UINT64_2PART_C(0x9d71ac8f, ada6c9b5), -927, -260}, - {UINT64_2PART_C(0xea9c2277, 23ee8bcb), -901, -252}, - {UINT64_2PART_C(0xaecc4991, 4078536d), -874, -244}, - {UINT64_2PART_C(0x823c1279, 5db6ce57), -847, -236}, - {UINT64_2PART_C(0xc2109436, 4dfb5637), -821, -228}, - {UINT64_2PART_C(0x9096ea6f, 3848984f), -794, -220}, - {UINT64_2PART_C(0xd77485cb, 25823ac7), -768, -212}, - {UINT64_2PART_C(0xa086cfcd, 97bf97f4), -741, -204}, - {UINT64_2PART_C(0xef340a98, 172aace5), -715, -196}, - {UINT64_2PART_C(0xb23867fb, 2a35b28e), -688, -188}, - {UINT64_2PART_C(0x84c8d4df, d2c63f3b), -661, -180}, - {UINT64_2PART_C(0xc5dd4427, 1ad3cdba), -635, -172}, - {UINT64_2PART_C(0x936b9fce, bb25c996), -608, -164}, - {UINT64_2PART_C(0xdbac6c24, 7d62a584), -582, -156}, - {UINT64_2PART_C(0xa3ab6658, 0d5fdaf6), -555, -148}, - {UINT64_2PART_C(0xf3e2f893, dec3f126), -529, -140}, - {UINT64_2PART_C(0xb5b5ada8, aaff80b8), -502, -132}, - {UINT64_2PART_C(0x87625f05, 6c7c4a8b), -475, -124}, - {UINT64_2PART_C(0xc9bcff60, 34c13053), -449, -116}, - {UINT64_2PART_C(0x964e858c, 91ba2655), -422, -108}, - {UINT64_2PART_C(0xdff97724, 70297ebd), -396, -100}, - {UINT64_2PART_C(0xa6dfbd9f, b8e5b88f), -369, -92}, - {UINT64_2PART_C(0xf8a95fcf, 88747d94), -343, -84}, - {UINT64_2PART_C(0xb9447093, 8fa89bcf), -316, -76}, - {UINT64_2PART_C(0x8a08f0f8, bf0f156b), -289, -68}, - {UINT64_2PART_C(0xcdb02555, 653131b6), -263, -60}, - {UINT64_2PART_C(0x993fe2c6, d07b7fac), -236, -52}, - {UINT64_2PART_C(0xe45c10c4, 2a2b3b06), -210, -44}, - {UINT64_2PART_C(0xaa242499, 697392d3), -183, -36}, - {UINT64_2PART_C(0xfd87b5f2, 8300ca0e), -157, -28}, - {UINT64_2PART_C(0xbce50864, 92111aeb), -130, -20}, - {UINT64_2PART_C(0x8cbccc09, 6f5088cc), -103, -12}, - {UINT64_2PART_C(0xd1b71758, e219652c), -77, -4}, - {UINT64_2PART_C(0x9c400000, 00000000), -50, 4}, - {UINT64_2PART_C(0xe8d4a510, 00000000), -24, 12}, - {UINT64_2PART_C(0xad78ebc5, ac620000), 3, 20}, - {UINT64_2PART_C(0x813f3978, f8940984), 30, 28}, - {UINT64_2PART_C(0xc097ce7b, c90715b3), 56, 36}, - {UINT64_2PART_C(0x8f7e32ce, 7bea5c70), 83, 44}, - {UINT64_2PART_C(0xd5d238a4, abe98068), 109, 52}, - {UINT64_2PART_C(0x9f4f2726, 179a2245), 136, 60}, - {UINT64_2PART_C(0xed63a231, d4c4fb27), 162, 68}, - {UINT64_2PART_C(0xb0de6538, 8cc8ada8), 189, 76}, - {UINT64_2PART_C(0x83c7088e, 1aab65db), 216, 84}, - {UINT64_2PART_C(0xc45d1df9, 42711d9a), 242, 92}, - {UINT64_2PART_C(0x924d692c, a61be758), 269, 100}, - {UINT64_2PART_C(0xda01ee64, 1a708dea), 295, 108}, - {UINT64_2PART_C(0xa26da399, 9aef774a), 322, 116}, - {UINT64_2PART_C(0xf209787b, b47d6b85), 348, 124}, - {UINT64_2PART_C(0xb454e4a1, 79dd1877), 375, 132}, - {UINT64_2PART_C(0x865b8692, 5b9bc5c2), 402, 140}, - {UINT64_2PART_C(0xc83553c5, c8965d3d), 428, 148}, - {UINT64_2PART_C(0x952ab45c, fa97a0b3), 455, 156}, - {UINT64_2PART_C(0xde469fbd, 99a05fe3), 481, 164}, - {UINT64_2PART_C(0xa59bc234, db398c25), 508, 172}, - {UINT64_2PART_C(0xf6c69a72, a3989f5c), 534, 180}, - {UINT64_2PART_C(0xb7dcbf53, 54e9bece), 561, 188}, - {UINT64_2PART_C(0x88fcf317, f22241e2), 588, 196}, - {UINT64_2PART_C(0xcc20ce9b, d35c78a5), 614, 204}, - {UINT64_2PART_C(0x98165af3, 7b2153df), 641, 212}, - {UINT64_2PART_C(0xe2a0b5dc, 971f303a), 667, 220}, - {UINT64_2PART_C(0xa8d9d153, 5ce3b396), 694, 228}, - {UINT64_2PART_C(0xfb9b7cd9, a4a7443c), 720, 236}, - {UINT64_2PART_C(0xbb764c4c, a7a44410), 747, 244}, - {UINT64_2PART_C(0x8bab8eef, b6409c1a), 774, 252}, - {UINT64_2PART_C(0xd01fef10, a657842c), 800, 260}, - {UINT64_2PART_C(0x9b10a4e5, e9913129), 827, 268}, - {UINT64_2PART_C(0xe7109bfb, a19c0c9d), 853, 276}, - {UINT64_2PART_C(0xac2820d9, 623bf429), 880, 284}, - {UINT64_2PART_C(0x80444b5e, 7aa7cf85), 907, 292}, - {UINT64_2PART_C(0xbf21e440, 03acdd2d), 933, 300}, - {UINT64_2PART_C(0x8e679c2f, 5e44ff8f), 960, 308}, - {UINT64_2PART_C(0xd433179d, 9c8cb841), 986, 316}, - {UINT64_2PART_C(0x9e19db92, b4e31ba9), 1013, 324}, - {UINT64_2PART_C(0xeb96bf6e, badf77d9), 1039, 332}, - {UINT64_2PART_C(0xaf87023b, 9bf0ee6b), 1066, 340}, -}; - -static const int kCachedPowersLength = ARRAY_SIZE(kCachedPowers); -static const int kCachedPowersOffset = 348; // -1 * the first decimal_exponent. -static const double kD_1_LOG2_10 = 0.30102999566398114; // 1 / lg(10) -// Difference between the decimal exponents in the table above. -const int PowersOfTenCache::kDecimalExponentDistance = 8; -const int PowersOfTenCache::kMinDecimalExponent = -348; -const int PowersOfTenCache::kMaxDecimalExponent = 340; - -void PowersOfTenCache::GetCachedPowerForBinaryExponentRange( - int min_exponent, - int max_exponent, - DiyFp* power, - int* decimal_exponent) { - int kQ = DiyFp::kSignificandSize; - double k = ceil((min_exponent + kQ - 1) * kD_1_LOG2_10); - int foo = kCachedPowersOffset; - int index = - (foo + static_cast(k) - 1) / kDecimalExponentDistance + 1; - ASSERT(0 <= index && index < kCachedPowersLength); - CachedPower cached_power = kCachedPowers[index]; - ASSERT(min_exponent <= cached_power.binary_exponent); - (void) max_exponent; // Mark variable as used. - ASSERT(cached_power.binary_exponent <= max_exponent); - *decimal_exponent = cached_power.decimal_exponent; - *power = DiyFp(cached_power.significand, cached_power.binary_exponent); -} - - -void PowersOfTenCache::GetCachedPowerForDecimalExponent(int requested_exponent, - DiyFp* power, - int* found_exponent) { - ASSERT(kMinDecimalExponent <= requested_exponent); - ASSERT(requested_exponent < kMaxDecimalExponent + kDecimalExponentDistance); - int index = - (requested_exponent + kCachedPowersOffset) / kDecimalExponentDistance; - CachedPower cached_power = kCachedPowers[index]; - *power = DiyFp(cached_power.significand, cached_power.binary_exponent); - *found_exponent = cached_power.decimal_exponent; - ASSERT(*found_exponent <= requested_exponent); - ASSERT(requested_exponent < *found_exponent + kDecimalExponentDistance); -} - -} // namespace double_conversion diff --git a/ios/Pods/DoubleConversion/double-conversion/cached-powers.h b/ios/Pods/DoubleConversion/double-conversion/cached-powers.h deleted file mode 100644 index 61a5061..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/cached-powers.h +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_CACHED_POWERS_H_ -#define DOUBLE_CONVERSION_CACHED_POWERS_H_ - -#include "diy-fp.h" - -namespace double_conversion { - -class PowersOfTenCache { - public: - - // Not all powers of ten are cached. The decimal exponent of two neighboring - // cached numbers will differ by kDecimalExponentDistance. - static const int kDecimalExponentDistance; - - static const int kMinDecimalExponent; - static const int kMaxDecimalExponent; - - // Returns a cached power-of-ten with a binary exponent in the range - // [min_exponent; max_exponent] (boundaries included). - static void GetCachedPowerForBinaryExponentRange(int min_exponent, - int max_exponent, - DiyFp* power, - int* decimal_exponent); - - // Returns a cached power of ten x ~= 10^k such that - // k <= decimal_exponent < k + kCachedPowersDecimalDistance. - // The given decimal_exponent must satisfy - // kMinDecimalExponent <= requested_exponent, and - // requested_exponent < kMaxDecimalExponent + kDecimalExponentDistance. - static void GetCachedPowerForDecimalExponent(int requested_exponent, - DiyFp* power, - int* found_exponent); -}; - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_CACHED_POWERS_H_ diff --git a/ios/Pods/DoubleConversion/double-conversion/diy-fp.cc b/ios/Pods/DoubleConversion/double-conversion/diy-fp.cc deleted file mode 100644 index ddd1891..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/diy-fp.cc +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#include "diy-fp.h" -#include "utils.h" - -namespace double_conversion { - -void DiyFp::Multiply(const DiyFp& other) { - // Simply "emulates" a 128 bit multiplication. - // However: the resulting number only contains 64 bits. The least - // significant 64 bits are only used for rounding the most significant 64 - // bits. - const uint64_t kM32 = 0xFFFFFFFFU; - uint64_t a = f_ >> 32; - uint64_t b = f_ & kM32; - uint64_t c = other.f_ >> 32; - uint64_t d = other.f_ & kM32; - uint64_t ac = a * c; - uint64_t bc = b * c; - uint64_t ad = a * d; - uint64_t bd = b * d; - uint64_t tmp = (bd >> 32) + (ad & kM32) + (bc & kM32); - // By adding 1U << 31 to tmp we round the final result. - // Halfway cases will be round up. - tmp += 1U << 31; - uint64_t result_f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32); - e_ += other.e_ + 64; - f_ = result_f; -} - -} // namespace double_conversion diff --git a/ios/Pods/DoubleConversion/double-conversion/diy-fp.h b/ios/Pods/DoubleConversion/double-conversion/diy-fp.h deleted file mode 100644 index 9dcf8fb..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/diy-fp.h +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_DIY_FP_H_ -#define DOUBLE_CONVERSION_DIY_FP_H_ - -#include "utils.h" - -namespace double_conversion { - -// This "Do It Yourself Floating Point" class implements a floating-point number -// with a uint64 significand and an int exponent. Normalized DiyFp numbers will -// have the most significant bit of the significand set. -// Multiplication and Subtraction do not normalize their results. -// DiyFp are not designed to contain special doubles (NaN and Infinity). -class DiyFp { - public: - static const int kSignificandSize = 64; - - DiyFp() : f_(0), e_(0) {} - DiyFp(uint64_t f, int e) : f_(f), e_(e) {} - - // this = this - other. - // The exponents of both numbers must be the same and the significand of this - // must be bigger than the significand of other. - // The result will not be normalized. - void Subtract(const DiyFp& other) { - ASSERT(e_ == other.e_); - ASSERT(f_ >= other.f_); - f_ -= other.f_; - } - - // Returns a - b. - // The exponents of both numbers must be the same and this must be bigger - // than other. The result will not be normalized. - static DiyFp Minus(const DiyFp& a, const DiyFp& b) { - DiyFp result = a; - result.Subtract(b); - return result; - } - - - // this = this * other. - void Multiply(const DiyFp& other); - - // returns a * b; - static DiyFp Times(const DiyFp& a, const DiyFp& b) { - DiyFp result = a; - result.Multiply(b); - return result; - } - - void Normalize() { - ASSERT(f_ != 0); - uint64_t f = f_; - int e = e_; - - // This method is mainly called for normalizing boundaries. In general - // boundaries need to be shifted by 10 bits. We thus optimize for this case. - const uint64_t k10MSBits = UINT64_2PART_C(0xFFC00000, 00000000); - while ((f & k10MSBits) == 0) { - f <<= 10; - e -= 10; - } - while ((f & kUint64MSB) == 0) { - f <<= 1; - e--; - } - f_ = f; - e_ = e; - } - - static DiyFp Normalize(const DiyFp& a) { - DiyFp result = a; - result.Normalize(); - return result; - } - - uint64_t f() const { return f_; } - int e() const { return e_; } - - void set_f(uint64_t new_value) { f_ = new_value; } - void set_e(int new_value) { e_ = new_value; } - - private: - static const uint64_t kUint64MSB = UINT64_2PART_C(0x80000000, 00000000); - - uint64_t f_; - int e_; -}; - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_DIY_FP_H_ diff --git a/ios/Pods/DoubleConversion/double-conversion/double-conversion.cc b/ios/Pods/DoubleConversion/double-conversion/double-conversion.cc deleted file mode 100644 index db3feec..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/double-conversion.cc +++ /dev/null @@ -1,910 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include -#include - -#include "double-conversion.h" - -#include "bignum-dtoa.h" -#include "fast-dtoa.h" -#include "fixed-dtoa.h" -#include "ieee.h" -#include "strtod.h" -#include "utils.h" - -namespace double_conversion { - -const DoubleToStringConverter& DoubleToStringConverter::EcmaScriptConverter() { - int flags = UNIQUE_ZERO | EMIT_POSITIVE_EXPONENT_SIGN; - static DoubleToStringConverter converter(flags, - "Infinity", - "NaN", - 'e', - -6, 21, - 6, 0); - return converter; -} - - -bool DoubleToStringConverter::HandleSpecialValues( - double value, - StringBuilder* result_builder) const { - Double double_inspect(value); - if (double_inspect.IsInfinite()) { - if (infinity_symbol_ == NULL) return false; - if (value < 0) { - result_builder->AddCharacter('-'); - } - result_builder->AddString(infinity_symbol_); - return true; - } - if (double_inspect.IsNan()) { - if (nan_symbol_ == NULL) return false; - result_builder->AddString(nan_symbol_); - return true; - } - return false; -} - - -void DoubleToStringConverter::CreateExponentialRepresentation( - const char* decimal_digits, - int length, - int exponent, - StringBuilder* result_builder) const { - ASSERT(length != 0); - result_builder->AddCharacter(decimal_digits[0]); - if (length != 1) { - result_builder->AddCharacter('.'); - result_builder->AddSubstring(&decimal_digits[1], length-1); - } - result_builder->AddCharacter(exponent_character_); - if (exponent < 0) { - result_builder->AddCharacter('-'); - exponent = -exponent; - } else { - if ((flags_ & EMIT_POSITIVE_EXPONENT_SIGN) != 0) { - result_builder->AddCharacter('+'); - } - } - if (exponent == 0) { - result_builder->AddCharacter('0'); - return; - } - ASSERT(exponent < 1e4); - const int kMaxExponentLength = 5; - char buffer[kMaxExponentLength + 1]; - buffer[kMaxExponentLength] = '\0'; - int first_char_pos = kMaxExponentLength; - while (exponent > 0) { - buffer[--first_char_pos] = '0' + (exponent % 10); - exponent /= 10; - } - result_builder->AddSubstring(&buffer[first_char_pos], - kMaxExponentLength - first_char_pos); -} - - -void DoubleToStringConverter::CreateDecimalRepresentation( - const char* decimal_digits, - int length, - int decimal_point, - int digits_after_point, - StringBuilder* result_builder) const { - // Create a representation that is padded with zeros if needed. - if (decimal_point <= 0) { - // "0.00000decimal_rep". - result_builder->AddCharacter('0'); - if (digits_after_point > 0) { - result_builder->AddCharacter('.'); - result_builder->AddPadding('0', -decimal_point); - ASSERT(length <= digits_after_point - (-decimal_point)); - result_builder->AddSubstring(decimal_digits, length); - int remaining_digits = digits_after_point - (-decimal_point) - length; - result_builder->AddPadding('0', remaining_digits); - } - } else if (decimal_point >= length) { - // "decimal_rep0000.00000" or "decimal_rep.0000" - result_builder->AddSubstring(decimal_digits, length); - result_builder->AddPadding('0', decimal_point - length); - if (digits_after_point > 0) { - result_builder->AddCharacter('.'); - result_builder->AddPadding('0', digits_after_point); - } - } else { - // "decima.l_rep000" - ASSERT(digits_after_point > 0); - result_builder->AddSubstring(decimal_digits, decimal_point); - result_builder->AddCharacter('.'); - ASSERT(length - decimal_point <= digits_after_point); - result_builder->AddSubstring(&decimal_digits[decimal_point], - length - decimal_point); - int remaining_digits = digits_after_point - (length - decimal_point); - result_builder->AddPadding('0', remaining_digits); - } - if (digits_after_point == 0) { - if ((flags_ & EMIT_TRAILING_DECIMAL_POINT) != 0) { - result_builder->AddCharacter('.'); - } - if ((flags_ & EMIT_TRAILING_ZERO_AFTER_POINT) != 0) { - result_builder->AddCharacter('0'); - } - } -} - - -bool DoubleToStringConverter::ToShortestIeeeNumber( - double value, - StringBuilder* result_builder, - DoubleToStringConverter::DtoaMode mode) const { - ASSERT(mode == SHORTEST || mode == SHORTEST_SINGLE); - if (Double(value).IsSpecial()) { - return HandleSpecialValues(value, result_builder); - } - - int decimal_point; - bool sign; - const int kDecimalRepCapacity = kBase10MaximalLength + 1; - char decimal_rep[kDecimalRepCapacity]; - int decimal_rep_length; - - DoubleToAscii(value, mode, 0, decimal_rep, kDecimalRepCapacity, - &sign, &decimal_rep_length, &decimal_point); - - bool unique_zero = (flags_ & UNIQUE_ZERO) != 0; - if (sign && (value != 0.0 || !unique_zero)) { - result_builder->AddCharacter('-'); - } - - int exponent = decimal_point - 1; - if ((decimal_in_shortest_low_ <= exponent) && - (exponent < decimal_in_shortest_high_)) { - CreateDecimalRepresentation(decimal_rep, decimal_rep_length, - decimal_point, - Max(0, decimal_rep_length - decimal_point), - result_builder); - } else { - CreateExponentialRepresentation(decimal_rep, decimal_rep_length, exponent, - result_builder); - } - return true; -} - - -bool DoubleToStringConverter::ToFixed(double value, - int requested_digits, - StringBuilder* result_builder) const { - ASSERT(kMaxFixedDigitsBeforePoint == 60); - const double kFirstNonFixed = 1e60; - - if (Double(value).IsSpecial()) { - return HandleSpecialValues(value, result_builder); - } - - if (requested_digits > kMaxFixedDigitsAfterPoint) return false; - if (value >= kFirstNonFixed || value <= -kFirstNonFixed) return false; - - // Find a sufficiently precise decimal representation of n. - int decimal_point; - bool sign; - // Add space for the '\0' byte. - const int kDecimalRepCapacity = - kMaxFixedDigitsBeforePoint + kMaxFixedDigitsAfterPoint + 1; - char decimal_rep[kDecimalRepCapacity]; - int decimal_rep_length; - DoubleToAscii(value, FIXED, requested_digits, - decimal_rep, kDecimalRepCapacity, - &sign, &decimal_rep_length, &decimal_point); - - bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0); - if (sign && (value != 0.0 || !unique_zero)) { - result_builder->AddCharacter('-'); - } - - CreateDecimalRepresentation(decimal_rep, decimal_rep_length, decimal_point, - requested_digits, result_builder); - return true; -} - - -bool DoubleToStringConverter::ToExponential( - double value, - int requested_digits, - StringBuilder* result_builder) const { - if (Double(value).IsSpecial()) { - return HandleSpecialValues(value, result_builder); - } - - if (requested_digits < -1) return false; - if (requested_digits > kMaxExponentialDigits) return false; - - int decimal_point; - bool sign; - // Add space for digit before the decimal point and the '\0' character. - const int kDecimalRepCapacity = kMaxExponentialDigits + 2; - ASSERT(kDecimalRepCapacity > kBase10MaximalLength); - char decimal_rep[kDecimalRepCapacity]; - int decimal_rep_length; - - if (requested_digits == -1) { - DoubleToAscii(value, SHORTEST, 0, - decimal_rep, kDecimalRepCapacity, - &sign, &decimal_rep_length, &decimal_point); - } else { - DoubleToAscii(value, PRECISION, requested_digits + 1, - decimal_rep, kDecimalRepCapacity, - &sign, &decimal_rep_length, &decimal_point); - ASSERT(decimal_rep_length <= requested_digits + 1); - - for (int i = decimal_rep_length; i < requested_digits + 1; ++i) { - decimal_rep[i] = '0'; - } - decimal_rep_length = requested_digits + 1; - } - - bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0); - if (sign && (value != 0.0 || !unique_zero)) { - result_builder->AddCharacter('-'); - } - - int exponent = decimal_point - 1; - CreateExponentialRepresentation(decimal_rep, - decimal_rep_length, - exponent, - result_builder); - return true; -} - - -bool DoubleToStringConverter::ToPrecision(double value, - int precision, - StringBuilder* result_builder) const { - if (Double(value).IsSpecial()) { - return HandleSpecialValues(value, result_builder); - } - - if (precision < kMinPrecisionDigits || precision > kMaxPrecisionDigits) { - return false; - } - - // Find a sufficiently precise decimal representation of n. - int decimal_point; - bool sign; - // Add one for the terminating null character. - const int kDecimalRepCapacity = kMaxPrecisionDigits + 1; - char decimal_rep[kDecimalRepCapacity]; - int decimal_rep_length; - - DoubleToAscii(value, PRECISION, precision, - decimal_rep, kDecimalRepCapacity, - &sign, &decimal_rep_length, &decimal_point); - ASSERT(decimal_rep_length <= precision); - - bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0); - if (sign && (value != 0.0 || !unique_zero)) { - result_builder->AddCharacter('-'); - } - - // The exponent if we print the number as x.xxeyyy. That is with the - // decimal point after the first digit. - int exponent = decimal_point - 1; - - int extra_zero = ((flags_ & EMIT_TRAILING_ZERO_AFTER_POINT) != 0) ? 1 : 0; - if ((-decimal_point + 1 > max_leading_padding_zeroes_in_precision_mode_) || - (decimal_point - precision + extra_zero > - max_trailing_padding_zeroes_in_precision_mode_)) { - // Fill buffer to contain 'precision' digits. - // Usually the buffer is already at the correct length, but 'DoubleToAscii' - // is allowed to return less characters. - for (int i = decimal_rep_length; i < precision; ++i) { - decimal_rep[i] = '0'; - } - - CreateExponentialRepresentation(decimal_rep, - precision, - exponent, - result_builder); - } else { - CreateDecimalRepresentation(decimal_rep, decimal_rep_length, decimal_point, - Max(0, precision - decimal_point), - result_builder); - } - return true; -} - - -static BignumDtoaMode DtoaToBignumDtoaMode( - DoubleToStringConverter::DtoaMode dtoa_mode) { - switch (dtoa_mode) { - case DoubleToStringConverter::SHORTEST: return BIGNUM_DTOA_SHORTEST; - case DoubleToStringConverter::SHORTEST_SINGLE: - return BIGNUM_DTOA_SHORTEST_SINGLE; - case DoubleToStringConverter::FIXED: return BIGNUM_DTOA_FIXED; - case DoubleToStringConverter::PRECISION: return BIGNUM_DTOA_PRECISION; - default: - UNREACHABLE(); - } -} - - -void DoubleToStringConverter::DoubleToAscii(double v, - DtoaMode mode, - int requested_digits, - char* buffer, - int buffer_length, - bool* sign, - int* length, - int* point) { - Vector vector(buffer, buffer_length); - ASSERT(!Double(v).IsSpecial()); - ASSERT(mode == SHORTEST || mode == SHORTEST_SINGLE || requested_digits >= 0); - - if (Double(v).Sign() < 0) { - *sign = true; - v = -v; - } else { - *sign = false; - } - - if (mode == PRECISION && requested_digits == 0) { - vector[0] = '\0'; - *length = 0; - return; - } - - if (v == 0) { - vector[0] = '0'; - vector[1] = '\0'; - *length = 1; - *point = 1; - return; - } - - bool fast_worked; - switch (mode) { - case SHORTEST: - fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST, 0, vector, length, point); - break; - case SHORTEST_SINGLE: - fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST_SINGLE, 0, - vector, length, point); - break; - case FIXED: - fast_worked = FastFixedDtoa(v, requested_digits, vector, length, point); - break; - case PRECISION: - fast_worked = FastDtoa(v, FAST_DTOA_PRECISION, requested_digits, - vector, length, point); - break; - default: - fast_worked = false; - UNREACHABLE(); - } - if (fast_worked) return; - - // If the fast dtoa didn't succeed use the slower bignum version. - BignumDtoaMode bignum_mode = DtoaToBignumDtoaMode(mode); - BignumDtoa(v, bignum_mode, requested_digits, vector, length, point); - vector[*length] = '\0'; -} - - -// Consumes the given substring from the iterator. -// Returns false, if the substring does not match. -static bool ConsumeSubString(const char** current, - const char* end, - const char* substring) { - ASSERT(**current == *substring); - for (substring++; *substring != '\0'; substring++) { - ++*current; - if (*current == end || **current != *substring) return false; - } - ++*current; - return true; -} - - -// Maximum number of significant digits in decimal representation. -// The longest possible double in decimal representation is -// (2^53 - 1) * 2 ^ -1074 that is (2 ^ 53 - 1) * 5 ^ 1074 / 10 ^ 1074 -// (768 digits). If we parse a number whose first digits are equal to a -// mean of 2 adjacent doubles (that could have up to 769 digits) the result -// must be rounded to the bigger one unless the tail consists of zeros, so -// we don't need to preserve all the digits. -const int kMaxSignificantDigits = 772; - - -// Returns true if a nonspace found and false if the end has reached. -static inline bool AdvanceToNonspace(const char** current, const char* end) { - while (*current != end) { - if (**current != ' ') return true; - ++*current; - } - return false; -} - - -static bool isDigit(int x, int radix) { - return (x >= '0' && x <= '9' && x < '0' + radix) - || (radix > 10 && x >= 'a' && x < 'a' + radix - 10) - || (radix > 10 && x >= 'A' && x < 'A' + radix - 10); -} - - -static double SignedZero(bool sign) { - return sign ? -0.0 : 0.0; -} - - -// Returns true if 'c' is a decimal digit that is valid for the given radix. -// -// The function is small and could be inlined, but VS2012 emitted a warning -// because it constant-propagated the radix and concluded that the last -// condition was always true. By moving it into a separate function the -// compiler wouldn't warn anymore. -static bool IsDecimalDigitForRadix(int c, int radix) { - return '0' <= c && c <= '9' && (c - '0') < radix; -} - -// Returns true if 'c' is a character digit that is valid for the given radix. -// The 'a_character' should be 'a' or 'A'. -// -// The function is small and could be inlined, but VS2012 emitted a warning -// because it constant-propagated the radix and concluded that the first -// condition was always false. By moving it into a separate function the -// compiler wouldn't warn anymore. -static bool IsCharacterDigitForRadix(int c, int radix, char a_character) { - return radix > 10 && c >= a_character && c < a_character + radix - 10; -} - - -// Parsing integers with radix 2, 4, 8, 16, 32. Assumes current != end. -template -static double RadixStringToIeee(const char* current, - const char* end, - bool sign, - bool allow_trailing_junk, - double junk_string_value, - bool read_as_double, - const char** trailing_pointer) { - ASSERT(current != end); - - const int kDoubleSize = Double::kSignificandSize; - const int kSingleSize = Single::kSignificandSize; - const int kSignificandSize = read_as_double? kDoubleSize: kSingleSize; - - // Skip leading 0s. - while (*current == '0') { - ++current; - if (current == end) { - *trailing_pointer = end; - return SignedZero(sign); - } - } - - int64_t number = 0; - int exponent = 0; - const int radix = (1 << radix_log_2); - - do { - int digit; - if (IsDecimalDigitForRadix(*current, radix)) { - digit = static_cast(*current) - '0'; - } else if (IsCharacterDigitForRadix(*current, radix, 'a')) { - digit = static_cast(*current) - 'a' + 10; - } else if (IsCharacterDigitForRadix(*current, radix, 'A')) { - digit = static_cast(*current) - 'A' + 10; - } else { - if (allow_trailing_junk || !AdvanceToNonspace(¤t, end)) { - break; - } else { - return junk_string_value; - } - } - - number = number * radix + digit; - int overflow = static_cast(number >> kSignificandSize); - if (overflow != 0) { - // Overflow occurred. Need to determine which direction to round the - // result. - int overflow_bits_count = 1; - while (overflow > 1) { - overflow_bits_count++; - overflow >>= 1; - } - - int dropped_bits_mask = ((1 << overflow_bits_count) - 1); - int dropped_bits = static_cast(number) & dropped_bits_mask; - number >>= overflow_bits_count; - exponent = overflow_bits_count; - - bool zero_tail = true; - for (;;) { - ++current; - if (current == end || !isDigit(*current, radix)) break; - zero_tail = zero_tail && *current == '0'; - exponent += radix_log_2; - } - - if (!allow_trailing_junk && AdvanceToNonspace(¤t, end)) { - return junk_string_value; - } - - int middle_value = (1 << (overflow_bits_count - 1)); - if (dropped_bits > middle_value) { - number++; // Rounding up. - } else if (dropped_bits == middle_value) { - // Rounding to even to consistency with decimals: half-way case rounds - // up if significant part is odd and down otherwise. - if ((number & 1) != 0 || !zero_tail) { - number++; // Rounding up. - } - } - - // Rounding up may cause overflow. - if ((number & ((int64_t)1 << kSignificandSize)) != 0) { - exponent++; - number >>= 1; - } - break; - } - ++current; - } while (current != end); - - ASSERT(number < ((int64_t)1 << kSignificandSize)); - ASSERT(static_cast(static_cast(number)) == number); - - *trailing_pointer = current; - - if (exponent == 0) { - if (sign) { - if (number == 0) return -0.0; - number = -number; - } - return static_cast(number); - } - - ASSERT(number != 0); - return Double(DiyFp(number, exponent)).value(); -} - - -double StringToDoubleConverter::StringToIeee( - const char* input, - int length, - int* processed_characters_count, - bool read_as_double) const { - const char* current = input; - const char* end = input + length; - - *processed_characters_count = 0; - - const bool allow_trailing_junk = (flags_ & ALLOW_TRAILING_JUNK) != 0; - const bool allow_leading_spaces = (flags_ & ALLOW_LEADING_SPACES) != 0; - const bool allow_trailing_spaces = (flags_ & ALLOW_TRAILING_SPACES) != 0; - const bool allow_spaces_after_sign = (flags_ & ALLOW_SPACES_AFTER_SIGN) != 0; - - // To make sure that iterator dereferencing is valid the following - // convention is used: - // 1. Each '++current' statement is followed by check for equality to 'end'. - // 2. If AdvanceToNonspace returned false then current == end. - // 3. If 'current' becomes equal to 'end' the function returns or goes to - // 'parsing_done'. - // 4. 'current' is not dereferenced after the 'parsing_done' label. - // 5. Code before 'parsing_done' may rely on 'current != end'. - if (current == end) return empty_string_value_; - - if (allow_leading_spaces || allow_trailing_spaces) { - if (!AdvanceToNonspace(¤t, end)) { - *processed_characters_count = static_cast(current - input); - return empty_string_value_; - } - if (!allow_leading_spaces && (input != current)) { - // No leading spaces allowed, but AdvanceToNonspace moved forward. - return junk_string_value_; - } - } - - // The longest form of simplified number is: "-.1eXXX\0". - const int kBufferSize = kMaxSignificantDigits + 10; - char buffer[kBufferSize]; // NOLINT: size is known at compile time. - int buffer_pos = 0; - - // Exponent will be adjusted if insignificant digits of the integer part - // or insignificant leading zeros of the fractional part are dropped. - int exponent = 0; - int significant_digits = 0; - int insignificant_digits = 0; - bool nonzero_digit_dropped = false; - - bool sign = false; - - if (*current == '+' || *current == '-') { - sign = (*current == '-'); - ++current; - const char* next_non_space = current; - // Skip following spaces (if allowed). - if (!AdvanceToNonspace(&next_non_space, end)) return junk_string_value_; - if (!allow_spaces_after_sign && (current != next_non_space)) { - return junk_string_value_; - } - current = next_non_space; - } - - if (infinity_symbol_ != NULL) { - if (*current == infinity_symbol_[0]) { - if (!ConsumeSubString(¤t, end, infinity_symbol_)) { - return junk_string_value_; - } - - if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) { - return junk_string_value_; - } - if (!allow_trailing_junk && AdvanceToNonspace(¤t, end)) { - return junk_string_value_; - } - - ASSERT(buffer_pos == 0); - *processed_characters_count = static_cast(current - input); - return sign ? -Double::Infinity() : Double::Infinity(); - } - } - - if (nan_symbol_ != NULL) { - if (*current == nan_symbol_[0]) { - if (!ConsumeSubString(¤t, end, nan_symbol_)) { - return junk_string_value_; - } - - if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) { - return junk_string_value_; - } - if (!allow_trailing_junk && AdvanceToNonspace(¤t, end)) { - return junk_string_value_; - } - - ASSERT(buffer_pos == 0); - *processed_characters_count = static_cast(current - input); - return sign ? -Double::NaN() : Double::NaN(); - } - } - - bool leading_zero = false; - if (*current == '0') { - ++current; - if (current == end) { - *processed_characters_count = static_cast(current - input); - return SignedZero(sign); - } - - leading_zero = true; - - // It could be hexadecimal value. - if ((flags_ & ALLOW_HEX) && (*current == 'x' || *current == 'X')) { - ++current; - if (current == end || !isDigit(*current, 16)) { - return junk_string_value_; // "0x". - } - - const char* tail_pointer = NULL; - double result = RadixStringToIeee<4>(current, - end, - sign, - allow_trailing_junk, - junk_string_value_, - read_as_double, - &tail_pointer); - if (tail_pointer != NULL) { - if (allow_trailing_spaces) AdvanceToNonspace(&tail_pointer, end); - *processed_characters_count = static_cast(tail_pointer - input); - } - return result; - } - - // Ignore leading zeros in the integer part. - while (*current == '0') { - ++current; - if (current == end) { - *processed_characters_count = static_cast(current - input); - return SignedZero(sign); - } - } - } - - bool octal = leading_zero && (flags_ & ALLOW_OCTALS) != 0; - - // Copy significant digits of the integer part (if any) to the buffer. - while (*current >= '0' && *current <= '9') { - if (significant_digits < kMaxSignificantDigits) { - ASSERT(buffer_pos < kBufferSize); - buffer[buffer_pos++] = static_cast(*current); - significant_digits++; - // Will later check if it's an octal in the buffer. - } else { - insignificant_digits++; // Move the digit into the exponential part. - nonzero_digit_dropped = nonzero_digit_dropped || *current != '0'; - } - octal = octal && *current < '8'; - ++current; - if (current == end) goto parsing_done; - } - - if (significant_digits == 0) { - octal = false; - } - - if (*current == '.') { - if (octal && !allow_trailing_junk) return junk_string_value_; - if (octal) goto parsing_done; - - ++current; - if (current == end) { - if (significant_digits == 0 && !leading_zero) { - return junk_string_value_; - } else { - goto parsing_done; - } - } - - if (significant_digits == 0) { - // octal = false; - // Integer part consists of 0 or is absent. Significant digits start after - // leading zeros (if any). - while (*current == '0') { - ++current; - if (current == end) { - *processed_characters_count = static_cast(current - input); - return SignedZero(sign); - } - exponent--; // Move this 0 into the exponent. - } - } - - // There is a fractional part. - // We don't emit a '.', but adjust the exponent instead. - while (*current >= '0' && *current <= '9') { - if (significant_digits < kMaxSignificantDigits) { - ASSERT(buffer_pos < kBufferSize); - buffer[buffer_pos++] = static_cast(*current); - significant_digits++; - exponent--; - } else { - // Ignore insignificant digits in the fractional part. - nonzero_digit_dropped = nonzero_digit_dropped || *current != '0'; - } - ++current; - if (current == end) goto parsing_done; - } - } - - if (!leading_zero && exponent == 0 && significant_digits == 0) { - // If leading_zeros is true then the string contains zeros. - // If exponent < 0 then string was [+-]\.0*... - // If significant_digits != 0 the string is not equal to 0. - // Otherwise there are no digits in the string. - return junk_string_value_; - } - - // Parse exponential part. - if (*current == 'e' || *current == 'E') { - if (octal && !allow_trailing_junk) return junk_string_value_; - if (octal) goto parsing_done; - ++current; - if (current == end) { - if (allow_trailing_junk) { - goto parsing_done; - } else { - return junk_string_value_; - } - } - char sign = '+'; - if (*current == '+' || *current == '-') { - sign = static_cast(*current); - ++current; - if (current == end) { - if (allow_trailing_junk) { - goto parsing_done; - } else { - return junk_string_value_; - } - } - } - - if (current == end || *current < '0' || *current > '9') { - if (allow_trailing_junk) { - goto parsing_done; - } else { - return junk_string_value_; - } - } - - const int max_exponent = INT_MAX / 2; - ASSERT(-max_exponent / 2 <= exponent && exponent <= max_exponent / 2); - int num = 0; - do { - // Check overflow. - int digit = *current - '0'; - if (num >= max_exponent / 10 - && !(num == max_exponent / 10 && digit <= max_exponent % 10)) { - num = max_exponent; - } else { - num = num * 10 + digit; - } - ++current; - } while (current != end && *current >= '0' && *current <= '9'); - - exponent += (sign == '-' ? -num : num); - } - - if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) { - return junk_string_value_; - } - if (!allow_trailing_junk && AdvanceToNonspace(¤t, end)) { - return junk_string_value_; - } - if (allow_trailing_spaces) { - AdvanceToNonspace(¤t, end); - } - - parsing_done: - exponent += insignificant_digits; - - if (octal) { - double result; - const char* tail_pointer = NULL; - result = RadixStringToIeee<3>(buffer, - buffer + buffer_pos, - sign, - allow_trailing_junk, - junk_string_value_, - read_as_double, - &tail_pointer); - ASSERT(tail_pointer != NULL); - *processed_characters_count = static_cast(current - input); - return result; - } - - if (nonzero_digit_dropped) { - buffer[buffer_pos++] = '1'; - exponent--; - } - - ASSERT(buffer_pos < kBufferSize); - buffer[buffer_pos] = '\0'; - - double converted; - if (read_as_double) { - converted = Strtod(Vector(buffer, buffer_pos), exponent); - } else { - converted = Strtof(Vector(buffer, buffer_pos), exponent); - } - *processed_characters_count = static_cast(current - input); - return sign? -converted: converted; -} - -} // namespace double_conversion diff --git a/ios/Pods/DoubleConversion/double-conversion/double-conversion.h b/ios/Pods/DoubleConversion/double-conversion/double-conversion.h deleted file mode 100644 index 1c3387d..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/double-conversion.h +++ /dev/null @@ -1,536 +0,0 @@ -// Copyright 2012 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_DOUBLE_CONVERSION_H_ -#define DOUBLE_CONVERSION_DOUBLE_CONVERSION_H_ - -#include "utils.h" - -namespace double_conversion { - -class DoubleToStringConverter { - public: - // When calling ToFixed with a double > 10^kMaxFixedDigitsBeforePoint - // or a requested_digits parameter > kMaxFixedDigitsAfterPoint then the - // function returns false. - static const int kMaxFixedDigitsBeforePoint = 60; - static const int kMaxFixedDigitsAfterPoint = 60; - - // When calling ToExponential with a requested_digits - // parameter > kMaxExponentialDigits then the function returns false. - static const int kMaxExponentialDigits = 120; - - // When calling ToPrecision with a requested_digits - // parameter < kMinPrecisionDigits or requested_digits > kMaxPrecisionDigits - // then the function returns false. - static const int kMinPrecisionDigits = 1; - static const int kMaxPrecisionDigits = 120; - - enum Flags { - NO_FLAGS = 0, - EMIT_POSITIVE_EXPONENT_SIGN = 1, - EMIT_TRAILING_DECIMAL_POINT = 2, - EMIT_TRAILING_ZERO_AFTER_POINT = 4, - UNIQUE_ZERO = 8 - }; - - // Flags should be a bit-or combination of the possible Flags-enum. - // - NO_FLAGS: no special flags. - // - EMIT_POSITIVE_EXPONENT_SIGN: when the number is converted into exponent - // form, emits a '+' for positive exponents. Example: 1.2e+2. - // - EMIT_TRAILING_DECIMAL_POINT: when the input number is an integer and is - // converted into decimal format then a trailing decimal point is appended. - // Example: 2345.0 is converted to "2345.". - // - EMIT_TRAILING_ZERO_AFTER_POINT: in addition to a trailing decimal point - // emits a trailing '0'-character. This flag requires the - // EXMIT_TRAILING_DECIMAL_POINT flag. - // Example: 2345.0 is converted to "2345.0". - // - UNIQUE_ZERO: "-0.0" is converted to "0.0". - // - // Infinity symbol and nan_symbol provide the string representation for these - // special values. If the string is NULL and the special value is encountered - // then the conversion functions return false. - // - // The exponent_character is used in exponential representations. It is - // usually 'e' or 'E'. - // - // When converting to the shortest representation the converter will - // represent input numbers in decimal format if they are in the interval - // [10^decimal_in_shortest_low; 10^decimal_in_shortest_high[ - // (lower boundary included, greater boundary excluded). - // Example: with decimal_in_shortest_low = -6 and - // decimal_in_shortest_high = 21: - // ToShortest(0.000001) -> "0.000001" - // ToShortest(0.0000001) -> "1e-7" - // ToShortest(111111111111111111111.0) -> "111111111111111110000" - // ToShortest(100000000000000000000.0) -> "100000000000000000000" - // ToShortest(1111111111111111111111.0) -> "1.1111111111111111e+21" - // - // When converting to precision mode the converter may add - // max_leading_padding_zeroes before returning the number in exponential - // format. - // Example with max_leading_padding_zeroes_in_precision_mode = 6. - // ToPrecision(0.0000012345, 2) -> "0.0000012" - // ToPrecision(0.00000012345, 2) -> "1.2e-7" - // Similarily the converter may add up to - // max_trailing_padding_zeroes_in_precision_mode in precision mode to avoid - // returning an exponential representation. A zero added by the - // EMIT_TRAILING_ZERO_AFTER_POINT flag is counted for this limit. - // Examples for max_trailing_padding_zeroes_in_precision_mode = 1: - // ToPrecision(230.0, 2) -> "230" - // ToPrecision(230.0, 2) -> "230." with EMIT_TRAILING_DECIMAL_POINT. - // ToPrecision(230.0, 2) -> "2.3e2" with EMIT_TRAILING_ZERO_AFTER_POINT. - DoubleToStringConverter(int flags, - const char* infinity_symbol, - const char* nan_symbol, - char exponent_character, - int decimal_in_shortest_low, - int decimal_in_shortest_high, - int max_leading_padding_zeroes_in_precision_mode, - int max_trailing_padding_zeroes_in_precision_mode) - : flags_(flags), - infinity_symbol_(infinity_symbol), - nan_symbol_(nan_symbol), - exponent_character_(exponent_character), - decimal_in_shortest_low_(decimal_in_shortest_low), - decimal_in_shortest_high_(decimal_in_shortest_high), - max_leading_padding_zeroes_in_precision_mode_( - max_leading_padding_zeroes_in_precision_mode), - max_trailing_padding_zeroes_in_precision_mode_( - max_trailing_padding_zeroes_in_precision_mode) { - // When 'trailing zero after the point' is set, then 'trailing point' - // must be set too. - ASSERT(((flags & EMIT_TRAILING_DECIMAL_POINT) != 0) || - !((flags & EMIT_TRAILING_ZERO_AFTER_POINT) != 0)); - } - - // Returns a converter following the EcmaScript specification. - static const DoubleToStringConverter& EcmaScriptConverter(); - - // Computes the shortest string of digits that correctly represent the input - // number. Depending on decimal_in_shortest_low and decimal_in_shortest_high - // (see constructor) it then either returns a decimal representation, or an - // exponential representation. - // Example with decimal_in_shortest_low = -6, - // decimal_in_shortest_high = 21, - // EMIT_POSITIVE_EXPONENT_SIGN activated, and - // EMIT_TRAILING_DECIMAL_POINT deactived: - // ToShortest(0.000001) -> "0.000001" - // ToShortest(0.0000001) -> "1e-7" - // ToShortest(111111111111111111111.0) -> "111111111111111110000" - // ToShortest(100000000000000000000.0) -> "100000000000000000000" - // ToShortest(1111111111111111111111.0) -> "1.1111111111111111e+21" - // - // Note: the conversion may round the output if the returned string - // is accurate enough to uniquely identify the input-number. - // For example the most precise representation of the double 9e59 equals - // "899999999999999918767229449717619953810131273674690656206848", but - // the converter will return the shorter (but still correct) "9e59". - // - // Returns true if the conversion succeeds. The conversion always succeeds - // except when the input value is special and no infinity_symbol or - // nan_symbol has been given to the constructor. - bool ToShortest(double value, StringBuilder* result_builder) const { - return ToShortestIeeeNumber(value, result_builder, SHORTEST); - } - - // Same as ToShortest, but for single-precision floats. - bool ToShortestSingle(float value, StringBuilder* result_builder) const { - return ToShortestIeeeNumber(value, result_builder, SHORTEST_SINGLE); - } - - - // Computes a decimal representation with a fixed number of digits after the - // decimal point. The last emitted digit is rounded. - // - // Examples: - // ToFixed(3.12, 1) -> "3.1" - // ToFixed(3.1415, 3) -> "3.142" - // ToFixed(1234.56789, 4) -> "1234.5679" - // ToFixed(1.23, 5) -> "1.23000" - // ToFixed(0.1, 4) -> "0.1000" - // ToFixed(1e30, 2) -> "1000000000000000019884624838656.00" - // ToFixed(0.1, 30) -> "0.100000000000000005551115123126" - // ToFixed(0.1, 17) -> "0.10000000000000001" - // - // If requested_digits equals 0, then the tail of the result depends on - // the EMIT_TRAILING_DECIMAL_POINT and EMIT_TRAILING_ZERO_AFTER_POINT. - // Examples, for requested_digits == 0, - // let EMIT_TRAILING_DECIMAL_POINT and EMIT_TRAILING_ZERO_AFTER_POINT be - // - false and false: then 123.45 -> 123 - // 0.678 -> 1 - // - true and false: then 123.45 -> 123. - // 0.678 -> 1. - // - true and true: then 123.45 -> 123.0 - // 0.678 -> 1.0 - // - // Returns true if the conversion succeeds. The conversion always succeeds - // except for the following cases: - // - the input value is special and no infinity_symbol or nan_symbol has - // been provided to the constructor, - // - 'value' > 10^kMaxFixedDigitsBeforePoint, or - // - 'requested_digits' > kMaxFixedDigitsAfterPoint. - // The last two conditions imply that the result will never contain more than - // 1 + kMaxFixedDigitsBeforePoint + 1 + kMaxFixedDigitsAfterPoint characters - // (one additional character for the sign, and one for the decimal point). - bool ToFixed(double value, - int requested_digits, - StringBuilder* result_builder) const; - - // Computes a representation in exponential format with requested_digits - // after the decimal point. The last emitted digit is rounded. - // If requested_digits equals -1, then the shortest exponential representation - // is computed. - // - // Examples with EMIT_POSITIVE_EXPONENT_SIGN deactivated, and - // exponent_character set to 'e'. - // ToExponential(3.12, 1) -> "3.1e0" - // ToExponential(5.0, 3) -> "5.000e0" - // ToExponential(0.001, 2) -> "1.00e-3" - // ToExponential(3.1415, -1) -> "3.1415e0" - // ToExponential(3.1415, 4) -> "3.1415e0" - // ToExponential(3.1415, 3) -> "3.142e0" - // ToExponential(123456789000000, 3) -> "1.235e14" - // ToExponential(1000000000000000019884624838656.0, -1) -> "1e30" - // ToExponential(1000000000000000019884624838656.0, 32) -> - // "1.00000000000000001988462483865600e30" - // ToExponential(1234, 0) -> "1e3" - // - // Returns true if the conversion succeeds. The conversion always succeeds - // except for the following cases: - // - the input value is special and no infinity_symbol or nan_symbol has - // been provided to the constructor, - // - 'requested_digits' > kMaxExponentialDigits. - // The last condition implies that the result will never contain more than - // kMaxExponentialDigits + 8 characters (the sign, the digit before the - // decimal point, the decimal point, the exponent character, the - // exponent's sign, and at most 3 exponent digits). - bool ToExponential(double value, - int requested_digits, - StringBuilder* result_builder) const; - - // Computes 'precision' leading digits of the given 'value' and returns them - // either in exponential or decimal format, depending on - // max_{leading|trailing}_padding_zeroes_in_precision_mode (given to the - // constructor). - // The last computed digit is rounded. - // - // Example with max_leading_padding_zeroes_in_precision_mode = 6. - // ToPrecision(0.0000012345, 2) -> "0.0000012" - // ToPrecision(0.00000012345, 2) -> "1.2e-7" - // Similarily the converter may add up to - // max_trailing_padding_zeroes_in_precision_mode in precision mode to avoid - // returning an exponential representation. A zero added by the - // EMIT_TRAILING_ZERO_AFTER_POINT flag is counted for this limit. - // Examples for max_trailing_padding_zeroes_in_precision_mode = 1: - // ToPrecision(230.0, 2) -> "230" - // ToPrecision(230.0, 2) -> "230." with EMIT_TRAILING_DECIMAL_POINT. - // ToPrecision(230.0, 2) -> "2.3e2" with EMIT_TRAILING_ZERO_AFTER_POINT. - // Examples for max_trailing_padding_zeroes_in_precision_mode = 3, and no - // EMIT_TRAILING_ZERO_AFTER_POINT: - // ToPrecision(123450.0, 6) -> "123450" - // ToPrecision(123450.0, 5) -> "123450" - // ToPrecision(123450.0, 4) -> "123500" - // ToPrecision(123450.0, 3) -> "123000" - // ToPrecision(123450.0, 2) -> "1.2e5" - // - // Returns true if the conversion succeeds. The conversion always succeeds - // except for the following cases: - // - the input value is special and no infinity_symbol or nan_symbol has - // been provided to the constructor, - // - precision < kMinPericisionDigits - // - precision > kMaxPrecisionDigits - // The last condition implies that the result will never contain more than - // kMaxPrecisionDigits + 7 characters (the sign, the decimal point, the - // exponent character, the exponent's sign, and at most 3 exponent digits). - bool ToPrecision(double value, - int precision, - StringBuilder* result_builder) const; - - enum DtoaMode { - // Produce the shortest correct representation. - // For example the output of 0.299999999999999988897 is (the less accurate - // but correct) 0.3. - SHORTEST, - // Same as SHORTEST, but for single-precision floats. - SHORTEST_SINGLE, - // Produce a fixed number of digits after the decimal point. - // For instance fixed(0.1, 4) becomes 0.1000 - // If the input number is big, the output will be big. - FIXED, - // Fixed number of digits (independent of the decimal point). - PRECISION - }; - - // The maximal number of digits that are needed to emit a double in base 10. - // A higher precision can be achieved by using more digits, but the shortest - // accurate representation of any double will never use more digits than - // kBase10MaximalLength. - // Note that DoubleToAscii null-terminates its input. So the given buffer - // should be at least kBase10MaximalLength + 1 characters long. - static const int kBase10MaximalLength = 17; - - // Converts the given double 'v' to ascii. 'v' must not be NaN, +Infinity, or - // -Infinity. In SHORTEST_SINGLE-mode this restriction also applies to 'v' - // after it has been casted to a single-precision float. That is, in this - // mode static_cast(v) must not be NaN, +Infinity or -Infinity. - // - // The result should be interpreted as buffer * 10^(point-length). - // - // The output depends on the given mode: - // - SHORTEST: produce the least amount of digits for which the internal - // identity requirement is still satisfied. If the digits are printed - // (together with the correct exponent) then reading this number will give - // 'v' again. The buffer will choose the representation that is closest to - // 'v'. If there are two at the same distance, than the one farther away - // from 0 is chosen (halfway cases - ending with 5 - are rounded up). - // In this mode the 'requested_digits' parameter is ignored. - // - SHORTEST_SINGLE: same as SHORTEST but with single-precision. - // - FIXED: produces digits necessary to print a given number with - // 'requested_digits' digits after the decimal point. The produced digits - // might be too short in which case the caller has to fill the remainder - // with '0's. - // Example: toFixed(0.001, 5) is allowed to return buffer="1", point=-2. - // Halfway cases are rounded towards +/-Infinity (away from 0). The call - // toFixed(0.15, 2) thus returns buffer="2", point=0. - // The returned buffer may contain digits that would be truncated from the - // shortest representation of the input. - // - PRECISION: produces 'requested_digits' where the first digit is not '0'. - // Even though the length of produced digits usually equals - // 'requested_digits', the function is allowed to return fewer digits, in - // which case the caller has to fill the missing digits with '0's. - // Halfway cases are again rounded away from 0. - // DoubleToAscii expects the given buffer to be big enough to hold all - // digits and a terminating null-character. In SHORTEST-mode it expects a - // buffer of at least kBase10MaximalLength + 1. In all other modes the - // requested_digits parameter and the padding-zeroes limit the size of the - // output. Don't forget the decimal point, the exponent character and the - // terminating null-character when computing the maximal output size. - // The given length is only used in debug mode to ensure the buffer is big - // enough. - static void DoubleToAscii(double v, - DtoaMode mode, - int requested_digits, - char* buffer, - int buffer_length, - bool* sign, - int* length, - int* point); - - private: - // Implementation for ToShortest and ToShortestSingle. - bool ToShortestIeeeNumber(double value, - StringBuilder* result_builder, - DtoaMode mode) const; - - // If the value is a special value (NaN or Infinity) constructs the - // corresponding string using the configured infinity/nan-symbol. - // If either of them is NULL or the value is not special then the - // function returns false. - bool HandleSpecialValues(double value, StringBuilder* result_builder) const; - // Constructs an exponential representation (i.e. 1.234e56). - // The given exponent assumes a decimal point after the first decimal digit. - void CreateExponentialRepresentation(const char* decimal_digits, - int length, - int exponent, - StringBuilder* result_builder) const; - // Creates a decimal representation (i.e 1234.5678). - void CreateDecimalRepresentation(const char* decimal_digits, - int length, - int decimal_point, - int digits_after_point, - StringBuilder* result_builder) const; - - const int flags_; - const char* const infinity_symbol_; - const char* const nan_symbol_; - const char exponent_character_; - const int decimal_in_shortest_low_; - const int decimal_in_shortest_high_; - const int max_leading_padding_zeroes_in_precision_mode_; - const int max_trailing_padding_zeroes_in_precision_mode_; - - DISALLOW_IMPLICIT_CONSTRUCTORS(DoubleToStringConverter); -}; - - -class StringToDoubleConverter { - public: - // Enumeration for allowing octals and ignoring junk when converting - // strings to numbers. - enum Flags { - NO_FLAGS = 0, - ALLOW_HEX = 1, - ALLOW_OCTALS = 2, - ALLOW_TRAILING_JUNK = 4, - ALLOW_LEADING_SPACES = 8, - ALLOW_TRAILING_SPACES = 16, - ALLOW_SPACES_AFTER_SIGN = 32 - }; - - // Flags should be a bit-or combination of the possible Flags-enum. - // - NO_FLAGS: no special flags. - // - ALLOW_HEX: recognizes the prefix "0x". Hex numbers may only be integers. - // Ex: StringToDouble("0x1234") -> 4660.0 - // In StringToDouble("0x1234.56") the characters ".56" are trailing - // junk. The result of the call is hence dependent on - // the ALLOW_TRAILING_JUNK flag and/or the junk value. - // With this flag "0x" is a junk-string. Even with ALLOW_TRAILING_JUNK, - // the string will not be parsed as "0" followed by junk. - // - // - ALLOW_OCTALS: recognizes the prefix "0" for octals: - // If a sequence of octal digits starts with '0', then the number is - // read as octal integer. Octal numbers may only be integers. - // Ex: StringToDouble("01234") -> 668.0 - // StringToDouble("012349") -> 12349.0 // Not a sequence of octal - // // digits. - // In StringToDouble("01234.56") the characters ".56" are trailing - // junk. The result of the call is hence dependent on - // the ALLOW_TRAILING_JUNK flag and/or the junk value. - // In StringToDouble("01234e56") the characters "e56" are trailing - // junk, too. - // - ALLOW_TRAILING_JUNK: ignore trailing characters that are not part of - // a double literal. - // - ALLOW_LEADING_SPACES: skip over leading spaces. - // - ALLOW_TRAILING_SPACES: ignore trailing spaces. - // - ALLOW_SPACES_AFTER_SIGN: ignore spaces after the sign. - // Ex: StringToDouble("- 123.2") -> -123.2. - // StringToDouble("+ 123.2") -> 123.2 - // - // empty_string_value is returned when an empty string is given as input. - // If ALLOW_LEADING_SPACES or ALLOW_TRAILING_SPACES are set, then a string - // containing only spaces is converted to the 'empty_string_value', too. - // - // junk_string_value is returned when - // a) ALLOW_TRAILING_JUNK is not set, and a junk character (a character not - // part of a double-literal) is found. - // b) ALLOW_TRAILING_JUNK is set, but the string does not start with a - // double literal. - // - // infinity_symbol and nan_symbol are strings that are used to detect - // inputs that represent infinity and NaN. They can be null, in which case - // they are ignored. - // The conversion routine first reads any possible signs. Then it compares the - // following character of the input-string with the first character of - // the infinity, and nan-symbol. If either matches, the function assumes, that - // a match has been found, and expects the following input characters to match - // the remaining characters of the special-value symbol. - // This means that the following restrictions apply to special-value symbols: - // - they must not start with signs ('+', or '-'), - // - they must not have the same first character. - // - they must not start with digits. - // - // Examples: - // flags = ALLOW_HEX | ALLOW_TRAILING_JUNK, - // empty_string_value = 0.0, - // junk_string_value = NaN, - // infinity_symbol = "infinity", - // nan_symbol = "nan": - // StringToDouble("0x1234") -> 4660.0. - // StringToDouble("0x1234K") -> 4660.0. - // StringToDouble("") -> 0.0 // empty_string_value. - // StringToDouble(" ") -> NaN // junk_string_value. - // StringToDouble(" 1") -> NaN // junk_string_value. - // StringToDouble("0x") -> NaN // junk_string_value. - // StringToDouble("-123.45") -> -123.45. - // StringToDouble("--123.45") -> NaN // junk_string_value. - // StringToDouble("123e45") -> 123e45. - // StringToDouble("123E45") -> 123e45. - // StringToDouble("123e+45") -> 123e45. - // StringToDouble("123E-45") -> 123e-45. - // StringToDouble("123e") -> 123.0 // trailing junk ignored. - // StringToDouble("123e-") -> 123.0 // trailing junk ignored. - // StringToDouble("+NaN") -> NaN // NaN string literal. - // StringToDouble("-infinity") -> -inf. // infinity literal. - // StringToDouble("Infinity") -> NaN // junk_string_value. - // - // flags = ALLOW_OCTAL | ALLOW_LEADING_SPACES, - // empty_string_value = 0.0, - // junk_string_value = NaN, - // infinity_symbol = NULL, - // nan_symbol = NULL: - // StringToDouble("0x1234") -> NaN // junk_string_value. - // StringToDouble("01234") -> 668.0. - // StringToDouble("") -> 0.0 // empty_string_value. - // StringToDouble(" ") -> 0.0 // empty_string_value. - // StringToDouble(" 1") -> 1.0 - // StringToDouble("0x") -> NaN // junk_string_value. - // StringToDouble("0123e45") -> NaN // junk_string_value. - // StringToDouble("01239E45") -> 1239e45. - // StringToDouble("-infinity") -> NaN // junk_string_value. - // StringToDouble("NaN") -> NaN // junk_string_value. - StringToDoubleConverter(int flags, - double empty_string_value, - double junk_string_value, - const char* infinity_symbol, - const char* nan_symbol) - : flags_(flags), - empty_string_value_(empty_string_value), - junk_string_value_(junk_string_value), - infinity_symbol_(infinity_symbol), - nan_symbol_(nan_symbol) { - } - - // Performs the conversion. - // The output parameter 'processed_characters_count' is set to the number - // of characters that have been processed to read the number. - // Spaces than are processed with ALLOW_{LEADING|TRAILING}_SPACES are included - // in the 'processed_characters_count'. Trailing junk is never included. - double StringToDouble(const char* buffer, - int length, - int* processed_characters_count) const { - return StringToIeee(buffer, length, processed_characters_count, true); - } - - // Same as StringToDouble but reads a float. - // Note that this is not equivalent to static_cast(StringToDouble(...)) - // due to potential double-rounding. - float StringToFloat(const char* buffer, - int length, - int* processed_characters_count) const { - return static_cast(StringToIeee(buffer, length, - processed_characters_count, false)); - } - - private: - const int flags_; - const double empty_string_value_; - const double junk_string_value_; - const char* const infinity_symbol_; - const char* const nan_symbol_; - - double StringToIeee(const char* buffer, - int length, - int* processed_characters_count, - bool read_as_double) const; - - DISALLOW_IMPLICIT_CONSTRUCTORS(StringToDoubleConverter); -}; - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_DOUBLE_CONVERSION_H_ diff --git a/ios/Pods/DoubleConversion/double-conversion/fast-dtoa.cc b/ios/Pods/DoubleConversion/double-conversion/fast-dtoa.cc deleted file mode 100644 index 6135038..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/fast-dtoa.cc +++ /dev/null @@ -1,665 +0,0 @@ -// Copyright 2012 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include "fast-dtoa.h" - -#include "cached-powers.h" -#include "diy-fp.h" -#include "ieee.h" - -namespace double_conversion { - -// The minimal and maximal target exponent define the range of w's binary -// exponent, where 'w' is the result of multiplying the input by a cached power -// of ten. -// -// A different range might be chosen on a different platform, to optimize digit -// generation, but a smaller range requires more powers of ten to be cached. -static const int kMinimalTargetExponent = -60; -static const int kMaximalTargetExponent = -32; - - -// Adjusts the last digit of the generated number, and screens out generated -// solutions that may be inaccurate. A solution may be inaccurate if it is -// outside the safe interval, or if we cannot prove that it is closer to the -// input than a neighboring representation of the same length. -// -// Input: * buffer containing the digits of too_high / 10^kappa -// * the buffer's length -// * distance_too_high_w == (too_high - w).f() * unit -// * unsafe_interval == (too_high - too_low).f() * unit -// * rest = (too_high - buffer * 10^kappa).f() * unit -// * ten_kappa = 10^kappa * unit -// * unit = the common multiplier -// Output: returns true if the buffer is guaranteed to contain the closest -// representable number to the input. -// Modifies the generated digits in the buffer to approach (round towards) w. -static bool RoundWeed(Vector buffer, - int length, - uint64_t distance_too_high_w, - uint64_t unsafe_interval, - uint64_t rest, - uint64_t ten_kappa, - uint64_t unit) { - uint64_t small_distance = distance_too_high_w - unit; - uint64_t big_distance = distance_too_high_w + unit; - // Let w_low = too_high - big_distance, and - // w_high = too_high - small_distance. - // Note: w_low < w < w_high - // - // The real w (* unit) must lie somewhere inside the interval - // ]w_low; w_high[ (often written as "(w_low; w_high)") - - // Basically the buffer currently contains a number in the unsafe interval - // ]too_low; too_high[ with too_low < w < too_high - // - // too_high - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // ^v 1 unit ^ ^ ^ ^ - // boundary_high --------------------- . . . . - // ^v 1 unit . . . . - // - - - - - - - - - - - - - - - - - - - + - - + - - - - - - . . - // . . ^ . . - // . big_distance . . . - // . . . . rest - // small_distance . . . . - // v . . . . - // w_high - - - - - - - - - - - - - - - - - - . . . . - // ^v 1 unit . . . . - // w ---------------------------------------- . . . . - // ^v 1 unit v . . . - // w_low - - - - - - - - - - - - - - - - - - - - - . . . - // . . v - // buffer --------------------------------------------------+-------+-------- - // . . - // safe_interval . - // v . - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . - // ^v 1 unit . - // boundary_low ------------------------- unsafe_interval - // ^v 1 unit v - // too_low - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - // - // Note that the value of buffer could lie anywhere inside the range too_low - // to too_high. - // - // boundary_low, boundary_high and w are approximations of the real boundaries - // and v (the input number). They are guaranteed to be precise up to one unit. - // In fact the error is guaranteed to be strictly less than one unit. - // - // Anything that lies outside the unsafe interval is guaranteed not to round - // to v when read again. - // Anything that lies inside the safe interval is guaranteed to round to v - // when read again. - // If the number inside the buffer lies inside the unsafe interval but not - // inside the safe interval then we simply do not know and bail out (returning - // false). - // - // Similarly we have to take into account the imprecision of 'w' when finding - // the closest representation of 'w'. If we have two potential - // representations, and one is closer to both w_low and w_high, then we know - // it is closer to the actual value v. - // - // By generating the digits of too_high we got the largest (closest to - // too_high) buffer that is still in the unsafe interval. In the case where - // w_high < buffer < too_high we try to decrement the buffer. - // This way the buffer approaches (rounds towards) w. - // There are 3 conditions that stop the decrementation process: - // 1) the buffer is already below w_high - // 2) decrementing the buffer would make it leave the unsafe interval - // 3) decrementing the buffer would yield a number below w_high and farther - // away than the current number. In other words: - // (buffer{-1} < w_high) && w_high - buffer{-1} > buffer - w_high - // Instead of using the buffer directly we use its distance to too_high. - // Conceptually rest ~= too_high - buffer - // We need to do the following tests in this order to avoid over- and - // underflows. - ASSERT(rest <= unsafe_interval); - while (rest < small_distance && // Negated condition 1 - unsafe_interval - rest >= ten_kappa && // Negated condition 2 - (rest + ten_kappa < small_distance || // buffer{-1} > w_high - small_distance - rest >= rest + ten_kappa - small_distance)) { - buffer[length - 1]--; - rest += ten_kappa; - } - - // We have approached w+ as much as possible. We now test if approaching w- - // would require changing the buffer. If yes, then we have two possible - // representations close to w, but we cannot decide which one is closer. - if (rest < big_distance && - unsafe_interval - rest >= ten_kappa && - (rest + ten_kappa < big_distance || - big_distance - rest > rest + ten_kappa - big_distance)) { - return false; - } - - // Weeding test. - // The safe interval is [too_low + 2 ulp; too_high - 2 ulp] - // Since too_low = too_high - unsafe_interval this is equivalent to - // [too_high - unsafe_interval + 4 ulp; too_high - 2 ulp] - // Conceptually we have: rest ~= too_high - buffer - return (2 * unit <= rest) && (rest <= unsafe_interval - 4 * unit); -} - - -// Rounds the buffer upwards if the result is closer to v by possibly adding -// 1 to the buffer. If the precision of the calculation is not sufficient to -// round correctly, return false. -// The rounding might shift the whole buffer in which case the kappa is -// adjusted. For example "99", kappa = 3 might become "10", kappa = 4. -// -// If 2*rest > ten_kappa then the buffer needs to be round up. -// rest can have an error of +/- 1 unit. This function accounts for the -// imprecision and returns false, if the rounding direction cannot be -// unambiguously determined. -// -// Precondition: rest < ten_kappa. -static bool RoundWeedCounted(Vector buffer, - int length, - uint64_t rest, - uint64_t ten_kappa, - uint64_t unit, - int* kappa) { - ASSERT(rest < ten_kappa); - // The following tests are done in a specific order to avoid overflows. They - // will work correctly with any uint64 values of rest < ten_kappa and unit. - // - // If the unit is too big, then we don't know which way to round. For example - // a unit of 50 means that the real number lies within rest +/- 50. If - // 10^kappa == 40 then there is no way to tell which way to round. - if (unit >= ten_kappa) return false; - // Even if unit is just half the size of 10^kappa we are already completely - // lost. (And after the previous test we know that the expression will not - // over/underflow.) - if (ten_kappa - unit <= unit) return false; - // If 2 * (rest + unit) <= 10^kappa we can safely round down. - if ((ten_kappa - rest > rest) && (ten_kappa - 2 * rest >= 2 * unit)) { - return true; - } - // If 2 * (rest - unit) >= 10^kappa, then we can safely round up. - if ((rest > unit) && (ten_kappa - (rest - unit) <= (rest - unit))) { - // Increment the last digit recursively until we find a non '9' digit. - buffer[length - 1]++; - for (int i = length - 1; i > 0; --i) { - if (buffer[i] != '0' + 10) break; - buffer[i] = '0'; - buffer[i - 1]++; - } - // If the first digit is now '0'+ 10 we had a buffer with all '9's. With the - // exception of the first digit all digits are now '0'. Simply switch the - // first digit to '1' and adjust the kappa. Example: "99" becomes "10" and - // the power (the kappa) is increased. - if (buffer[0] == '0' + 10) { - buffer[0] = '1'; - (*kappa) += 1; - } - return true; - } - return false; -} - -// Returns the biggest power of ten that is less than or equal to the given -// number. We furthermore receive the maximum number of bits 'number' has. -// -// Returns power == 10^(exponent_plus_one-1) such that -// power <= number < power * 10. -// If number_bits == 0 then 0^(0-1) is returned. -// The number of bits must be <= 32. -// Precondition: number < (1 << (number_bits + 1)). - -// Inspired by the method for finding an integer log base 10 from here: -// http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10 -static unsigned int const kSmallPowersOfTen[] = - {0, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, - 1000000000}; - -static void BiggestPowerTen(uint32_t number, - int number_bits, - uint32_t* power, - int* exponent_plus_one) { - ASSERT(number < (1u << (number_bits + 1))); - // 1233/4096 is approximately 1/lg(10). - int exponent_plus_one_guess = ((number_bits + 1) * 1233 >> 12); - // We increment to skip over the first entry in the kPowersOf10 table. - // Note: kPowersOf10[i] == 10^(i-1). - exponent_plus_one_guess++; - // We don't have any guarantees that 2^number_bits <= number. - if (number < kSmallPowersOfTen[exponent_plus_one_guess]) { - exponent_plus_one_guess--; - } - *power = kSmallPowersOfTen[exponent_plus_one_guess]; - *exponent_plus_one = exponent_plus_one_guess; -} - -// Generates the digits of input number w. -// w is a floating-point number (DiyFp), consisting of a significand and an -// exponent. Its exponent is bounded by kMinimalTargetExponent and -// kMaximalTargetExponent. -// Hence -60 <= w.e() <= -32. -// -// Returns false if it fails, in which case the generated digits in the buffer -// should not be used. -// Preconditions: -// * low, w and high are correct up to 1 ulp (unit in the last place). That -// is, their error must be less than a unit of their last digits. -// * low.e() == w.e() == high.e() -// * low < w < high, and taking into account their error: low~ <= high~ -// * kMinimalTargetExponent <= w.e() <= kMaximalTargetExponent -// Postconditions: returns false if procedure fails. -// otherwise: -// * buffer is not null-terminated, but len contains the number of digits. -// * buffer contains the shortest possible decimal digit-sequence -// such that LOW < buffer * 10^kappa < HIGH, where LOW and HIGH are the -// correct values of low and high (without their error). -// * if more than one decimal representation gives the minimal number of -// decimal digits then the one closest to W (where W is the correct value -// of w) is chosen. -// Remark: this procedure takes into account the imprecision of its input -// numbers. If the precision is not enough to guarantee all the postconditions -// then false is returned. This usually happens rarely (~0.5%). -// -// Say, for the sake of example, that -// w.e() == -48, and w.f() == 0x1234567890abcdef -// w's value can be computed by w.f() * 2^w.e() -// We can obtain w's integral digits by simply shifting w.f() by -w.e(). -// -> w's integral part is 0x1234 -// w's fractional part is therefore 0x567890abcdef. -// Printing w's integral part is easy (simply print 0x1234 in decimal). -// In order to print its fraction we repeatedly multiply the fraction by 10 and -// get each digit. Example the first digit after the point would be computed by -// (0x567890abcdef * 10) >> 48. -> 3 -// The whole thing becomes slightly more complicated because we want to stop -// once we have enough digits. That is, once the digits inside the buffer -// represent 'w' we can stop. Everything inside the interval low - high -// represents w. However we have to pay attention to low, high and w's -// imprecision. -static bool DigitGen(DiyFp low, - DiyFp w, - DiyFp high, - Vector buffer, - int* length, - int* kappa) { - ASSERT(low.e() == w.e() && w.e() == high.e()); - ASSERT(low.f() + 1 <= high.f() - 1); - ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent); - // low, w and high are imprecise, but by less than one ulp (unit in the last - // place). - // If we remove (resp. add) 1 ulp from low (resp. high) we are certain that - // the new numbers are outside of the interval we want the final - // representation to lie in. - // Inversely adding (resp. removing) 1 ulp from low (resp. high) would yield - // numbers that are certain to lie in the interval. We will use this fact - // later on. - // We will now start by generating the digits within the uncertain - // interval. Later we will weed out representations that lie outside the safe - // interval and thus _might_ lie outside the correct interval. - uint64_t unit = 1; - DiyFp too_low = DiyFp(low.f() - unit, low.e()); - DiyFp too_high = DiyFp(high.f() + unit, high.e()); - // too_low and too_high are guaranteed to lie outside the interval we want the - // generated number in. - DiyFp unsafe_interval = DiyFp::Minus(too_high, too_low); - // We now cut the input number into two parts: the integral digits and the - // fractionals. We will not write any decimal separator though, but adapt - // kappa instead. - // Reminder: we are currently computing the digits (stored inside the buffer) - // such that: too_low < buffer * 10^kappa < too_high - // We use too_high for the digit_generation and stop as soon as possible. - // If we stop early we effectively round down. - DiyFp one = DiyFp(static_cast(1) << -w.e(), w.e()); - // Division by one is a shift. - uint32_t integrals = static_cast(too_high.f() >> -one.e()); - // Modulo by one is an and. - uint64_t fractionals = too_high.f() & (one.f() - 1); - uint32_t divisor; - int divisor_exponent_plus_one; - BiggestPowerTen(integrals, DiyFp::kSignificandSize - (-one.e()), - &divisor, &divisor_exponent_plus_one); - *kappa = divisor_exponent_plus_one; - *length = 0; - // Loop invariant: buffer = too_high / 10^kappa (integer division) - // The invariant holds for the first iteration: kappa has been initialized - // with the divisor exponent + 1. And the divisor is the biggest power of ten - // that is smaller than integrals. - while (*kappa > 0) { - int digit = integrals / divisor; - ASSERT(digit <= 9); - buffer[*length] = static_cast('0' + digit); - (*length)++; - integrals %= divisor; - (*kappa)--; - // Note that kappa now equals the exponent of the divisor and that the - // invariant thus holds again. - uint64_t rest = - (static_cast(integrals) << -one.e()) + fractionals; - // Invariant: too_high = buffer * 10^kappa + DiyFp(rest, one.e()) - // Reminder: unsafe_interval.e() == one.e() - if (rest < unsafe_interval.f()) { - // Rounding down (by not emitting the remaining digits) yields a number - // that lies within the unsafe interval. - return RoundWeed(buffer, *length, DiyFp::Minus(too_high, w).f(), - unsafe_interval.f(), rest, - static_cast(divisor) << -one.e(), unit); - } - divisor /= 10; - } - - // The integrals have been generated. We are at the point of the decimal - // separator. In the following loop we simply multiply the remaining digits by - // 10 and divide by one. We just need to pay attention to multiply associated - // data (like the interval or 'unit'), too. - // Note that the multiplication by 10 does not overflow, because w.e >= -60 - // and thus one.e >= -60. - ASSERT(one.e() >= -60); - ASSERT(fractionals < one.f()); - ASSERT(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f()); - for (;;) { - fractionals *= 10; - unit *= 10; - unsafe_interval.set_f(unsafe_interval.f() * 10); - // Integer division by one. - int digit = static_cast(fractionals >> -one.e()); - ASSERT(digit <= 9); - buffer[*length] = static_cast('0' + digit); - (*length)++; - fractionals &= one.f() - 1; // Modulo by one. - (*kappa)--; - if (fractionals < unsafe_interval.f()) { - return RoundWeed(buffer, *length, DiyFp::Minus(too_high, w).f() * unit, - unsafe_interval.f(), fractionals, one.f(), unit); - } - } -} - - - -// Generates (at most) requested_digits digits of input number w. -// w is a floating-point number (DiyFp), consisting of a significand and an -// exponent. Its exponent is bounded by kMinimalTargetExponent and -// kMaximalTargetExponent. -// Hence -60 <= w.e() <= -32. -// -// Returns false if it fails, in which case the generated digits in the buffer -// should not be used. -// Preconditions: -// * w is correct up to 1 ulp (unit in the last place). That -// is, its error must be strictly less than a unit of its last digit. -// * kMinimalTargetExponent <= w.e() <= kMaximalTargetExponent -// -// Postconditions: returns false if procedure fails. -// otherwise: -// * buffer is not null-terminated, but length contains the number of -// digits. -// * the representation in buffer is the most precise representation of -// requested_digits digits. -// * buffer contains at most requested_digits digits of w. If there are less -// than requested_digits digits then some trailing '0's have been removed. -// * kappa is such that -// w = buffer * 10^kappa + eps with |eps| < 10^kappa / 2. -// -// Remark: This procedure takes into account the imprecision of its input -// numbers. If the precision is not enough to guarantee all the postconditions -// then false is returned. This usually happens rarely, but the failure-rate -// increases with higher requested_digits. -static bool DigitGenCounted(DiyFp w, - int requested_digits, - Vector buffer, - int* length, - int* kappa) { - ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent); - ASSERT(kMinimalTargetExponent >= -60); - ASSERT(kMaximalTargetExponent <= -32); - // w is assumed to have an error less than 1 unit. Whenever w is scaled we - // also scale its error. - uint64_t w_error = 1; - // We cut the input number into two parts: the integral digits and the - // fractional digits. We don't emit any decimal separator, but adapt kappa - // instead. Example: instead of writing "1.2" we put "12" into the buffer and - // increase kappa by 1. - DiyFp one = DiyFp(static_cast(1) << -w.e(), w.e()); - // Division by one is a shift. - uint32_t integrals = static_cast(w.f() >> -one.e()); - // Modulo by one is an and. - uint64_t fractionals = w.f() & (one.f() - 1); - uint32_t divisor; - int divisor_exponent_plus_one; - BiggestPowerTen(integrals, DiyFp::kSignificandSize - (-one.e()), - &divisor, &divisor_exponent_plus_one); - *kappa = divisor_exponent_plus_one; - *length = 0; - - // Loop invariant: buffer = w / 10^kappa (integer division) - // The invariant holds for the first iteration: kappa has been initialized - // with the divisor exponent + 1. And the divisor is the biggest power of ten - // that is smaller than 'integrals'. - while (*kappa > 0) { - int digit = integrals / divisor; - ASSERT(digit <= 9); - buffer[*length] = static_cast('0' + digit); - (*length)++; - requested_digits--; - integrals %= divisor; - (*kappa)--; - // Note that kappa now equals the exponent of the divisor and that the - // invariant thus holds again. - if (requested_digits == 0) break; - divisor /= 10; - } - - if (requested_digits == 0) { - uint64_t rest = - (static_cast(integrals) << -one.e()) + fractionals; - return RoundWeedCounted(buffer, *length, rest, - static_cast(divisor) << -one.e(), w_error, - kappa); - } - - // The integrals have been generated. We are at the point of the decimal - // separator. In the following loop we simply multiply the remaining digits by - // 10 and divide by one. We just need to pay attention to multiply associated - // data (the 'unit'), too. - // Note that the multiplication by 10 does not overflow, because w.e >= -60 - // and thus one.e >= -60. - ASSERT(one.e() >= -60); - ASSERT(fractionals < one.f()); - ASSERT(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f()); - while (requested_digits > 0 && fractionals > w_error) { - fractionals *= 10; - w_error *= 10; - // Integer division by one. - int digit = static_cast(fractionals >> -one.e()); - ASSERT(digit <= 9); - buffer[*length] = static_cast('0' + digit); - (*length)++; - requested_digits--; - fractionals &= one.f() - 1; // Modulo by one. - (*kappa)--; - } - if (requested_digits != 0) return false; - return RoundWeedCounted(buffer, *length, fractionals, one.f(), w_error, - kappa); -} - - -// Provides a decimal representation of v. -// Returns true if it succeeds, otherwise the result cannot be trusted. -// There will be *length digits inside the buffer (not null-terminated). -// If the function returns true then -// v == (double) (buffer * 10^decimal_exponent). -// The digits in the buffer are the shortest representation possible: no -// 0.09999999999999999 instead of 0.1. The shorter representation will even be -// chosen even if the longer one would be closer to v. -// The last digit will be closest to the actual v. That is, even if several -// digits might correctly yield 'v' when read again, the closest will be -// computed. -static bool Grisu3(double v, - FastDtoaMode mode, - Vector buffer, - int* length, - int* decimal_exponent) { - DiyFp w = Double(v).AsNormalizedDiyFp(); - // boundary_minus and boundary_plus are the boundaries between v and its - // closest floating-point neighbors. Any number strictly between - // boundary_minus and boundary_plus will round to v when convert to a double. - // Grisu3 will never output representations that lie exactly on a boundary. - DiyFp boundary_minus, boundary_plus; - if (mode == FAST_DTOA_SHORTEST) { - Double(v).NormalizedBoundaries(&boundary_minus, &boundary_plus); - } else { - ASSERT(mode == FAST_DTOA_SHORTEST_SINGLE); - float single_v = static_cast(v); - Single(single_v).NormalizedBoundaries(&boundary_minus, &boundary_plus); - } - ASSERT(boundary_plus.e() == w.e()); - DiyFp ten_mk; // Cached power of ten: 10^-k - int mk; // -k - int ten_mk_minimal_binary_exponent = - kMinimalTargetExponent - (w.e() + DiyFp::kSignificandSize); - int ten_mk_maximal_binary_exponent = - kMaximalTargetExponent - (w.e() + DiyFp::kSignificandSize); - PowersOfTenCache::GetCachedPowerForBinaryExponentRange( - ten_mk_minimal_binary_exponent, - ten_mk_maximal_binary_exponent, - &ten_mk, &mk); - ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() + - DiyFp::kSignificandSize) && - (kMaximalTargetExponent >= w.e() + ten_mk.e() + - DiyFp::kSignificandSize)); - // Note that ten_mk is only an approximation of 10^-k. A DiyFp only contains a - // 64 bit significand and ten_mk is thus only precise up to 64 bits. - - // The DiyFp::Times procedure rounds its result, and ten_mk is approximated - // too. The variable scaled_w (as well as scaled_boundary_minus/plus) are now - // off by a small amount. - // In fact: scaled_w - w*10^k < 1ulp (unit in the last place) of scaled_w. - // In other words: let f = scaled_w.f() and e = scaled_w.e(), then - // (f-1) * 2^e < w*10^k < (f+1) * 2^e - DiyFp scaled_w = DiyFp::Times(w, ten_mk); - ASSERT(scaled_w.e() == - boundary_plus.e() + ten_mk.e() + DiyFp::kSignificandSize); - // In theory it would be possible to avoid some recomputations by computing - // the difference between w and boundary_minus/plus (a power of 2) and to - // compute scaled_boundary_minus/plus by subtracting/adding from - // scaled_w. However the code becomes much less readable and the speed - // enhancements are not terriffic. - DiyFp scaled_boundary_minus = DiyFp::Times(boundary_minus, ten_mk); - DiyFp scaled_boundary_plus = DiyFp::Times(boundary_plus, ten_mk); - - // DigitGen will generate the digits of scaled_w. Therefore we have - // v == (double) (scaled_w * 10^-mk). - // Set decimal_exponent == -mk and pass it to DigitGen. If scaled_w is not an - // integer than it will be updated. For instance if scaled_w == 1.23 then - // the buffer will be filled with "123" und the decimal_exponent will be - // decreased by 2. - int kappa; - bool result = DigitGen(scaled_boundary_minus, scaled_w, scaled_boundary_plus, - buffer, length, &kappa); - *decimal_exponent = -mk + kappa; - return result; -} - - -// The "counted" version of grisu3 (see above) only generates requested_digits -// number of digits. This version does not generate the shortest representation, -// and with enough requested digits 0.1 will at some point print as 0.9999999... -// Grisu3 is too imprecise for real halfway cases (1.5 will not work) and -// therefore the rounding strategy for halfway cases is irrelevant. -static bool Grisu3Counted(double v, - int requested_digits, - Vector buffer, - int* length, - int* decimal_exponent) { - DiyFp w = Double(v).AsNormalizedDiyFp(); - DiyFp ten_mk; // Cached power of ten: 10^-k - int mk; // -k - int ten_mk_minimal_binary_exponent = - kMinimalTargetExponent - (w.e() + DiyFp::kSignificandSize); - int ten_mk_maximal_binary_exponent = - kMaximalTargetExponent - (w.e() + DiyFp::kSignificandSize); - PowersOfTenCache::GetCachedPowerForBinaryExponentRange( - ten_mk_minimal_binary_exponent, - ten_mk_maximal_binary_exponent, - &ten_mk, &mk); - ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() + - DiyFp::kSignificandSize) && - (kMaximalTargetExponent >= w.e() + ten_mk.e() + - DiyFp::kSignificandSize)); - // Note that ten_mk is only an approximation of 10^-k. A DiyFp only contains a - // 64 bit significand and ten_mk is thus only precise up to 64 bits. - - // The DiyFp::Times procedure rounds its result, and ten_mk is approximated - // too. The variable scaled_w (as well as scaled_boundary_minus/plus) are now - // off by a small amount. - // In fact: scaled_w - w*10^k < 1ulp (unit in the last place) of scaled_w. - // In other words: let f = scaled_w.f() and e = scaled_w.e(), then - // (f-1) * 2^e < w*10^k < (f+1) * 2^e - DiyFp scaled_w = DiyFp::Times(w, ten_mk); - - // We now have (double) (scaled_w * 10^-mk). - // DigitGen will generate the first requested_digits digits of scaled_w and - // return together with a kappa such that scaled_w ~= buffer * 10^kappa. (It - // will not always be exactly the same since DigitGenCounted only produces a - // limited number of digits.) - int kappa; - bool result = DigitGenCounted(scaled_w, requested_digits, - buffer, length, &kappa); - *decimal_exponent = -mk + kappa; - return result; -} - - -bool FastDtoa(double v, - FastDtoaMode mode, - int requested_digits, - Vector buffer, - int* length, - int* decimal_point) { - ASSERT(v > 0); - ASSERT(!Double(v).IsSpecial()); - - bool result = false; - int decimal_exponent = 0; - switch (mode) { - case FAST_DTOA_SHORTEST: - case FAST_DTOA_SHORTEST_SINGLE: - result = Grisu3(v, mode, buffer, length, &decimal_exponent); - break; - case FAST_DTOA_PRECISION: - result = Grisu3Counted(v, requested_digits, - buffer, length, &decimal_exponent); - break; - default: - UNREACHABLE(); - } - if (result) { - *decimal_point = *length + decimal_exponent; - buffer[*length] = '\0'; - } - return result; -} - -} // namespace double_conversion diff --git a/ios/Pods/DoubleConversion/double-conversion/fast-dtoa.h b/ios/Pods/DoubleConversion/double-conversion/fast-dtoa.h deleted file mode 100644 index 5f1e8ee..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/fast-dtoa.h +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_FAST_DTOA_H_ -#define DOUBLE_CONVERSION_FAST_DTOA_H_ - -#include "utils.h" - -namespace double_conversion { - -enum FastDtoaMode { - // Computes the shortest representation of the given input. The returned - // result will be the most accurate number of this length. Longer - // representations might be more accurate. - FAST_DTOA_SHORTEST, - // Same as FAST_DTOA_SHORTEST but for single-precision floats. - FAST_DTOA_SHORTEST_SINGLE, - // Computes a representation where the precision (number of digits) is - // given as input. The precision is independent of the decimal point. - FAST_DTOA_PRECISION -}; - -// FastDtoa will produce at most kFastDtoaMaximalLength digits. This does not -// include the terminating '\0' character. -static const int kFastDtoaMaximalLength = 17; -// Same for single-precision numbers. -static const int kFastDtoaMaximalSingleLength = 9; - -// Provides a decimal representation of v. -// The result should be interpreted as buffer * 10^(point - length). -// -// Precondition: -// * v must be a strictly positive finite double. -// -// Returns true if it succeeds, otherwise the result can not be trusted. -// There will be *length digits inside the buffer followed by a null terminator. -// If the function returns true and mode equals -// - FAST_DTOA_SHORTEST, then -// the parameter requested_digits is ignored. -// The result satisfies -// v == (double) (buffer * 10^(point - length)). -// The digits in the buffer are the shortest representation possible. E.g. -// if 0.099999999999 and 0.1 represent the same double then "1" is returned -// with point = 0. -// The last digit will be closest to the actual v. That is, even if several -// digits might correctly yield 'v' when read again, the buffer will contain -// the one closest to v. -// - FAST_DTOA_PRECISION, then -// the buffer contains requested_digits digits. -// the difference v - (buffer * 10^(point-length)) is closest to zero for -// all possible representations of requested_digits digits. -// If there are two values that are equally close, then FastDtoa returns -// false. -// For both modes the buffer must be large enough to hold the result. -bool FastDtoa(double d, - FastDtoaMode mode, - int requested_digits, - Vector buffer, - int* length, - int* decimal_point); - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_FAST_DTOA_H_ diff --git a/ios/Pods/DoubleConversion/double-conversion/fixed-dtoa.cc b/ios/Pods/DoubleConversion/double-conversion/fixed-dtoa.cc deleted file mode 100644 index aef65fd..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/fixed-dtoa.cc +++ /dev/null @@ -1,404 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include - -#include "fixed-dtoa.h" -#include "ieee.h" - -namespace double_conversion { - -// Represents a 128bit type. This class should be replaced by a native type on -// platforms that support 128bit integers. -class UInt128 { - public: - UInt128() : high_bits_(0), low_bits_(0) { } - UInt128(uint64_t high, uint64_t low) : high_bits_(high), low_bits_(low) { } - - void Multiply(uint32_t multiplicand) { - uint64_t accumulator; - - accumulator = (low_bits_ & kMask32) * multiplicand; - uint32_t part = static_cast(accumulator & kMask32); - accumulator >>= 32; - accumulator = accumulator + (low_bits_ >> 32) * multiplicand; - low_bits_ = (accumulator << 32) + part; - accumulator >>= 32; - accumulator = accumulator + (high_bits_ & kMask32) * multiplicand; - part = static_cast(accumulator & kMask32); - accumulator >>= 32; - accumulator = accumulator + (high_bits_ >> 32) * multiplicand; - high_bits_ = (accumulator << 32) + part; - ASSERT((accumulator >> 32) == 0); - } - - void Shift(int shift_amount) { - ASSERT(-64 <= shift_amount && shift_amount <= 64); - if (shift_amount == 0) { - return; - } else if (shift_amount == -64) { - high_bits_ = low_bits_; - low_bits_ = 0; - } else if (shift_amount == 64) { - low_bits_ = high_bits_; - high_bits_ = 0; - } else if (shift_amount <= 0) { - high_bits_ <<= -shift_amount; - high_bits_ += low_bits_ >> (64 + shift_amount); - low_bits_ <<= -shift_amount; - } else { - low_bits_ >>= shift_amount; - low_bits_ += high_bits_ << (64 - shift_amount); - high_bits_ >>= shift_amount; - } - } - - // Modifies *this to *this MOD (2^power). - // Returns *this DIV (2^power). - int DivModPowerOf2(int power) { - if (power >= 64) { - int result = static_cast(high_bits_ >> (power - 64)); - high_bits_ -= static_cast(result) << (power - 64); - return result; - } else { - uint64_t part_low = low_bits_ >> power; - uint64_t part_high = high_bits_ << (64 - power); - int result = static_cast(part_low + part_high); - high_bits_ = 0; - low_bits_ -= part_low << power; - return result; - } - } - - bool IsZero() const { - return high_bits_ == 0 && low_bits_ == 0; - } - - int BitAt(int position) { - if (position >= 64) { - return static_cast(high_bits_ >> (position - 64)) & 1; - } else { - return static_cast(low_bits_ >> position) & 1; - } - } - - private: - static const uint64_t kMask32 = 0xFFFFFFFF; - // Value == (high_bits_ << 64) + low_bits_ - uint64_t high_bits_; - uint64_t low_bits_; -}; - - -static const int kDoubleSignificandSize = 53; // Includes the hidden bit. - - -static void FillDigits32FixedLength(uint32_t number, int requested_length, - Vector buffer, int* length) { - for (int i = requested_length - 1; i >= 0; --i) { - buffer[(*length) + i] = '0' + number % 10; - number /= 10; - } - *length += requested_length; -} - - -static void FillDigits32(uint32_t number, Vector buffer, int* length) { - int number_length = 0; - // We fill the digits in reverse order and exchange them afterwards. - while (number != 0) { - int digit = number % 10; - number /= 10; - buffer[(*length) + number_length] = static_cast('0' + digit); - number_length++; - } - // Exchange the digits. - int i = *length; - int j = *length + number_length - 1; - while (i < j) { - char tmp = buffer[i]; - buffer[i] = buffer[j]; - buffer[j] = tmp; - i++; - j--; - } - *length += number_length; -} - - -static void FillDigits64FixedLength(uint64_t number, - Vector buffer, int* length) { - const uint32_t kTen7 = 10000000; - // For efficiency cut the number into 3 uint32_t parts, and print those. - uint32_t part2 = static_cast(number % kTen7); - number /= kTen7; - uint32_t part1 = static_cast(number % kTen7); - uint32_t part0 = static_cast(number / kTen7); - - FillDigits32FixedLength(part0, 3, buffer, length); - FillDigits32FixedLength(part1, 7, buffer, length); - FillDigits32FixedLength(part2, 7, buffer, length); -} - - -static void FillDigits64(uint64_t number, Vector buffer, int* length) { - const uint32_t kTen7 = 10000000; - // For efficiency cut the number into 3 uint32_t parts, and print those. - uint32_t part2 = static_cast(number % kTen7); - number /= kTen7; - uint32_t part1 = static_cast(number % kTen7); - uint32_t part0 = static_cast(number / kTen7); - - if (part0 != 0) { - FillDigits32(part0, buffer, length); - FillDigits32FixedLength(part1, 7, buffer, length); - FillDigits32FixedLength(part2, 7, buffer, length); - } else if (part1 != 0) { - FillDigits32(part1, buffer, length); - FillDigits32FixedLength(part2, 7, buffer, length); - } else { - FillDigits32(part2, buffer, length); - } -} - - -static void RoundUp(Vector buffer, int* length, int* decimal_point) { - // An empty buffer represents 0. - if (*length == 0) { - buffer[0] = '1'; - *decimal_point = 1; - *length = 1; - return; - } - // Round the last digit until we either have a digit that was not '9' or until - // we reached the first digit. - buffer[(*length) - 1]++; - for (int i = (*length) - 1; i > 0; --i) { - if (buffer[i] != '0' + 10) { - return; - } - buffer[i] = '0'; - buffer[i - 1]++; - } - // If the first digit is now '0' + 10, we would need to set it to '0' and add - // a '1' in front. However we reach the first digit only if all following - // digits had been '9' before rounding up. Now all trailing digits are '0' and - // we simply switch the first digit to '1' and update the decimal-point - // (indicating that the point is now one digit to the right). - if (buffer[0] == '0' + 10) { - buffer[0] = '1'; - (*decimal_point)++; - } -} - - -// The given fractionals number represents a fixed-point number with binary -// point at bit (-exponent). -// Preconditions: -// -128 <= exponent <= 0. -// 0 <= fractionals * 2^exponent < 1 -// The buffer holds the result. -// The function will round its result. During the rounding-process digits not -// generated by this function might be updated, and the decimal-point variable -// might be updated. If this function generates the digits 99 and the buffer -// already contained "199" (thus yielding a buffer of "19999") then a -// rounding-up will change the contents of the buffer to "20000". -static void FillFractionals(uint64_t fractionals, int exponent, - int fractional_count, Vector buffer, - int* length, int* decimal_point) { - ASSERT(-128 <= exponent && exponent <= 0); - // 'fractionals' is a fixed-point number, with binary point at bit - // (-exponent). Inside the function the non-converted remainder of fractionals - // is a fixed-point number, with binary point at bit 'point'. - if (-exponent <= 64) { - // One 64 bit number is sufficient. - ASSERT(fractionals >> 56 == 0); - int point = -exponent; - for (int i = 0; i < fractional_count; ++i) { - if (fractionals == 0) break; - // Instead of multiplying by 10 we multiply by 5 and adjust the point - // location. This way the fractionals variable will not overflow. - // Invariant at the beginning of the loop: fractionals < 2^point. - // Initially we have: point <= 64 and fractionals < 2^56 - // After each iteration the point is decremented by one. - // Note that 5^3 = 125 < 128 = 2^7. - // Therefore three iterations of this loop will not overflow fractionals - // (even without the subtraction at the end of the loop body). At this - // time point will satisfy point <= 61 and therefore fractionals < 2^point - // and any further multiplication of fractionals by 5 will not overflow. - fractionals *= 5; - point--; - int digit = static_cast(fractionals >> point); - ASSERT(digit <= 9); - buffer[*length] = static_cast('0' + digit); - (*length)++; - fractionals -= static_cast(digit) << point; - } - // If the first bit after the point is set we have to round up. - if (((fractionals >> (point - 1)) & 1) == 1) { - RoundUp(buffer, length, decimal_point); - } - } else { // We need 128 bits. - ASSERT(64 < -exponent && -exponent <= 128); - UInt128 fractionals128 = UInt128(fractionals, 0); - fractionals128.Shift(-exponent - 64); - int point = 128; - for (int i = 0; i < fractional_count; ++i) { - if (fractionals128.IsZero()) break; - // As before: instead of multiplying by 10 we multiply by 5 and adjust the - // point location. - // This multiplication will not overflow for the same reasons as before. - fractionals128.Multiply(5); - point--; - int digit = fractionals128.DivModPowerOf2(point); - ASSERT(digit <= 9); - buffer[*length] = static_cast('0' + digit); - (*length)++; - } - if (fractionals128.BitAt(point - 1) == 1) { - RoundUp(buffer, length, decimal_point); - } - } -} - - -// Removes leading and trailing zeros. -// If leading zeros are removed then the decimal point position is adjusted. -static void TrimZeros(Vector buffer, int* length, int* decimal_point) { - while (*length > 0 && buffer[(*length) - 1] == '0') { - (*length)--; - } - int first_non_zero = 0; - while (first_non_zero < *length && buffer[first_non_zero] == '0') { - first_non_zero++; - } - if (first_non_zero != 0) { - for (int i = first_non_zero; i < *length; ++i) { - buffer[i - first_non_zero] = buffer[i]; - } - *length -= first_non_zero; - *decimal_point -= first_non_zero; - } -} - - -bool FastFixedDtoa(double v, - int fractional_count, - Vector buffer, - int* length, - int* decimal_point) { - const uint32_t kMaxUInt32 = 0xFFFFFFFF; - uint64_t significand = Double(v).Significand(); - int exponent = Double(v).Exponent(); - // v = significand * 2^exponent (with significand a 53bit integer). - // If the exponent is larger than 20 (i.e. we may have a 73bit number) then we - // don't know how to compute the representation. 2^73 ~= 9.5*10^21. - // If necessary this limit could probably be increased, but we don't need - // more. - if (exponent > 20) return false; - if (fractional_count > 20) return false; - *length = 0; - // At most kDoubleSignificandSize bits of the significand are non-zero. - // Given a 64 bit integer we have 11 0s followed by 53 potentially non-zero - // bits: 0..11*..0xxx..53*..xx - if (exponent + kDoubleSignificandSize > 64) { - // The exponent must be > 11. - // - // We know that v = significand * 2^exponent. - // And the exponent > 11. - // We simplify the task by dividing v by 10^17. - // The quotient delivers the first digits, and the remainder fits into a 64 - // bit number. - // Dividing by 10^17 is equivalent to dividing by 5^17*2^17. - const uint64_t kFive17 = UINT64_2PART_C(0xB1, A2BC2EC5); // 5^17 - uint64_t divisor = kFive17; - int divisor_power = 17; - uint64_t dividend = significand; - uint32_t quotient; - uint64_t remainder; - // Let v = f * 2^e with f == significand and e == exponent. - // Then need q (quotient) and r (remainder) as follows: - // v = q * 10^17 + r - // f * 2^e = q * 10^17 + r - // f * 2^e = q * 5^17 * 2^17 + r - // If e > 17 then - // f * 2^(e-17) = q * 5^17 + r/2^17 - // else - // f = q * 5^17 * 2^(17-e) + r/2^e - if (exponent > divisor_power) { - // We only allow exponents of up to 20 and therefore (17 - e) <= 3 - dividend <<= exponent - divisor_power; - quotient = static_cast(dividend / divisor); - remainder = (dividend % divisor) << divisor_power; - } else { - divisor <<= divisor_power - exponent; - quotient = static_cast(dividend / divisor); - remainder = (dividend % divisor) << exponent; - } - FillDigits32(quotient, buffer, length); - FillDigits64FixedLength(remainder, buffer, length); - *decimal_point = *length; - } else if (exponent >= 0) { - // 0 <= exponent <= 11 - significand <<= exponent; - FillDigits64(significand, buffer, length); - *decimal_point = *length; - } else if (exponent > -kDoubleSignificandSize) { - // We have to cut the number. - uint64_t integrals = significand >> -exponent; - uint64_t fractionals = significand - (integrals << -exponent); - if (integrals > kMaxUInt32) { - FillDigits64(integrals, buffer, length); - } else { - FillDigits32(static_cast(integrals), buffer, length); - } - *decimal_point = *length; - FillFractionals(fractionals, exponent, fractional_count, - buffer, length, decimal_point); - } else if (exponent < -128) { - // This configuration (with at most 20 digits) means that all digits must be - // 0. - ASSERT(fractional_count <= 20); - buffer[0] = '\0'; - *length = 0; - *decimal_point = -fractional_count; - } else { - *decimal_point = 0; - FillFractionals(significand, exponent, fractional_count, - buffer, length, decimal_point); - } - TrimZeros(buffer, length, decimal_point); - buffer[*length] = '\0'; - if ((*length) == 0) { - // The string is empty and the decimal_point thus has no importance. Mimick - // Gay's dtoa and and set it to -fractional_count. - *decimal_point = -fractional_count; - } - return true; -} - -} // namespace double_conversion diff --git a/ios/Pods/DoubleConversion/double-conversion/fixed-dtoa.h b/ios/Pods/DoubleConversion/double-conversion/fixed-dtoa.h deleted file mode 100644 index 3bdd08e..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/fixed-dtoa.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_FIXED_DTOA_H_ -#define DOUBLE_CONVERSION_FIXED_DTOA_H_ - -#include "utils.h" - -namespace double_conversion { - -// Produces digits necessary to print a given number with -// 'fractional_count' digits after the decimal point. -// The buffer must be big enough to hold the result plus one terminating null -// character. -// -// The produced digits might be too short in which case the caller has to fill -// the gaps with '0's. -// Example: FastFixedDtoa(0.001, 5, ...) is allowed to return buffer = "1", and -// decimal_point = -2. -// Halfway cases are rounded towards +/-Infinity (away from 0). The call -// FastFixedDtoa(0.15, 2, ...) thus returns buffer = "2", decimal_point = 0. -// The returned buffer may contain digits that would be truncated from the -// shortest representation of the input. -// -// This method only works for some parameters. If it can't handle the input it -// returns false. The output is null-terminated when the function succeeds. -bool FastFixedDtoa(double v, int fractional_count, - Vector buffer, int* length, int* decimal_point); - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_FIXED_DTOA_H_ diff --git a/ios/Pods/DoubleConversion/double-conversion/ieee.h b/ios/Pods/DoubleConversion/double-conversion/ieee.h deleted file mode 100644 index 661141d..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/ieee.h +++ /dev/null @@ -1,402 +0,0 @@ -// Copyright 2012 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_DOUBLE_H_ -#define DOUBLE_CONVERSION_DOUBLE_H_ - -#include "diy-fp.h" - -namespace double_conversion { - -// We assume that doubles and uint64_t have the same endianness. -static uint64_t double_to_uint64(double d) { return BitCast(d); } -static double uint64_to_double(uint64_t d64) { return BitCast(d64); } -static uint32_t float_to_uint32(float f) { return BitCast(f); } -static float uint32_to_float(uint32_t d32) { return BitCast(d32); } - -// Helper functions for doubles. -class Double { - public: - static const uint64_t kSignMask = UINT64_2PART_C(0x80000000, 00000000); - static const uint64_t kExponentMask = UINT64_2PART_C(0x7FF00000, 00000000); - static const uint64_t kSignificandMask = UINT64_2PART_C(0x000FFFFF, FFFFFFFF); - static const uint64_t kHiddenBit = UINT64_2PART_C(0x00100000, 00000000); - static const int kPhysicalSignificandSize = 52; // Excludes the hidden bit. - static const int kSignificandSize = 53; - - Double() : d64_(0) {} - explicit Double(double d) : d64_(double_to_uint64(d)) {} - explicit Double(uint64_t d64) : d64_(d64) {} - explicit Double(DiyFp diy_fp) - : d64_(DiyFpToUint64(diy_fp)) {} - - // The value encoded by this Double must be greater or equal to +0.0. - // It must not be special (infinity, or NaN). - DiyFp AsDiyFp() const { - ASSERT(Sign() > 0); - ASSERT(!IsSpecial()); - return DiyFp(Significand(), Exponent()); - } - - // The value encoded by this Double must be strictly greater than 0. - DiyFp AsNormalizedDiyFp() const { - ASSERT(value() > 0.0); - uint64_t f = Significand(); - int e = Exponent(); - - // The current double could be a denormal. - while ((f & kHiddenBit) == 0) { - f <<= 1; - e--; - } - // Do the final shifts in one go. - f <<= DiyFp::kSignificandSize - kSignificandSize; - e -= DiyFp::kSignificandSize - kSignificandSize; - return DiyFp(f, e); - } - - // Returns the double's bit as uint64. - uint64_t AsUint64() const { - return d64_; - } - - // Returns the next greater double. Returns +infinity on input +infinity. - double NextDouble() const { - if (d64_ == kInfinity) return Double(kInfinity).value(); - if (Sign() < 0 && Significand() == 0) { - // -0.0 - return 0.0; - } - if (Sign() < 0) { - return Double(d64_ - 1).value(); - } else { - return Double(d64_ + 1).value(); - } - } - - double PreviousDouble() const { - if (d64_ == (kInfinity | kSignMask)) return -Double::Infinity(); - if (Sign() < 0) { - return Double(d64_ + 1).value(); - } else { - if (Significand() == 0) return -0.0; - return Double(d64_ - 1).value(); - } - } - - int Exponent() const { - if (IsDenormal()) return kDenormalExponent; - - uint64_t d64 = AsUint64(); - int biased_e = - static_cast((d64 & kExponentMask) >> kPhysicalSignificandSize); - return biased_e - kExponentBias; - } - - uint64_t Significand() const { - uint64_t d64 = AsUint64(); - uint64_t significand = d64 & kSignificandMask; - if (!IsDenormal()) { - return significand + kHiddenBit; - } else { - return significand; - } - } - - // Returns true if the double is a denormal. - bool IsDenormal() const { - uint64_t d64 = AsUint64(); - return (d64 & kExponentMask) == 0; - } - - // We consider denormals not to be special. - // Hence only Infinity and NaN are special. - bool IsSpecial() const { - uint64_t d64 = AsUint64(); - return (d64 & kExponentMask) == kExponentMask; - } - - bool IsNan() const { - uint64_t d64 = AsUint64(); - return ((d64 & kExponentMask) == kExponentMask) && - ((d64 & kSignificandMask) != 0); - } - - bool IsInfinite() const { - uint64_t d64 = AsUint64(); - return ((d64 & kExponentMask) == kExponentMask) && - ((d64 & kSignificandMask) == 0); - } - - int Sign() const { - uint64_t d64 = AsUint64(); - return (d64 & kSignMask) == 0? 1: -1; - } - - // Precondition: the value encoded by this Double must be greater or equal - // than +0.0. - DiyFp UpperBoundary() const { - ASSERT(Sign() > 0); - return DiyFp(Significand() * 2 + 1, Exponent() - 1); - } - - // Computes the two boundaries of this. - // The bigger boundary (m_plus) is normalized. The lower boundary has the same - // exponent as m_plus. - // Precondition: the value encoded by this Double must be greater than 0. - void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const { - ASSERT(value() > 0.0); - DiyFp v = this->AsDiyFp(); - DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1)); - DiyFp m_minus; - if (LowerBoundaryIsCloser()) { - m_minus = DiyFp((v.f() << 2) - 1, v.e() - 2); - } else { - m_minus = DiyFp((v.f() << 1) - 1, v.e() - 1); - } - m_minus.set_f(m_minus.f() << (m_minus.e() - m_plus.e())); - m_minus.set_e(m_plus.e()); - *out_m_plus = m_plus; - *out_m_minus = m_minus; - } - - bool LowerBoundaryIsCloser() const { - // The boundary is closer if the significand is of the form f == 2^p-1 then - // the lower boundary is closer. - // Think of v = 1000e10 and v- = 9999e9. - // Then the boundary (== (v - v-)/2) is not just at a distance of 1e9 but - // at a distance of 1e8. - // The only exception is for the smallest normal: the largest denormal is - // at the same distance as its successor. - // Note: denormals have the same exponent as the smallest normals. - bool physical_significand_is_zero = ((AsUint64() & kSignificandMask) == 0); - return physical_significand_is_zero && (Exponent() != kDenormalExponent); - } - - double value() const { return uint64_to_double(d64_); } - - // Returns the significand size for a given order of magnitude. - // If v = f*2^e with 2^p-1 <= f <= 2^p then p+e is v's order of magnitude. - // This function returns the number of significant binary digits v will have - // once it's encoded into a double. In almost all cases this is equal to - // kSignificandSize. The only exceptions are denormals. They start with - // leading zeroes and their effective significand-size is hence smaller. - static int SignificandSizeForOrderOfMagnitude(int order) { - if (order >= (kDenormalExponent + kSignificandSize)) { - return kSignificandSize; - } - if (order <= kDenormalExponent) return 0; - return order - kDenormalExponent; - } - - static double Infinity() { - return Double(kInfinity).value(); - } - - static double NaN() { - return Double(kNaN).value(); - } - - private: - static const int kExponentBias = 0x3FF + kPhysicalSignificandSize; - static const int kDenormalExponent = -kExponentBias + 1; - static const int kMaxExponent = 0x7FF - kExponentBias; - static const uint64_t kInfinity = UINT64_2PART_C(0x7FF00000, 00000000); - static const uint64_t kNaN = UINT64_2PART_C(0x7FF80000, 00000000); - - const uint64_t d64_; - - static uint64_t DiyFpToUint64(DiyFp diy_fp) { - uint64_t significand = diy_fp.f(); - int exponent = diy_fp.e(); - while (significand > kHiddenBit + kSignificandMask) { - significand >>= 1; - exponent++; - } - if (exponent >= kMaxExponent) { - return kInfinity; - } - if (exponent < kDenormalExponent) { - return 0; - } - while (exponent > kDenormalExponent && (significand & kHiddenBit) == 0) { - significand <<= 1; - exponent--; - } - uint64_t biased_exponent; - if (exponent == kDenormalExponent && (significand & kHiddenBit) == 0) { - biased_exponent = 0; - } else { - biased_exponent = static_cast(exponent + kExponentBias); - } - return (significand & kSignificandMask) | - (biased_exponent << kPhysicalSignificandSize); - } - - DISALLOW_COPY_AND_ASSIGN(Double); -}; - -class Single { - public: - static const uint32_t kSignMask = 0x80000000; - static const uint32_t kExponentMask = 0x7F800000; - static const uint32_t kSignificandMask = 0x007FFFFF; - static const uint32_t kHiddenBit = 0x00800000; - static const int kPhysicalSignificandSize = 23; // Excludes the hidden bit. - static const int kSignificandSize = 24; - - Single() : d32_(0) {} - explicit Single(float f) : d32_(float_to_uint32(f)) {} - explicit Single(uint32_t d32) : d32_(d32) {} - - // The value encoded by this Single must be greater or equal to +0.0. - // It must not be special (infinity, or NaN). - DiyFp AsDiyFp() const { - ASSERT(Sign() > 0); - ASSERT(!IsSpecial()); - return DiyFp(Significand(), Exponent()); - } - - // Returns the single's bit as uint64. - uint32_t AsUint32() const { - return d32_; - } - - int Exponent() const { - if (IsDenormal()) return kDenormalExponent; - - uint32_t d32 = AsUint32(); - int biased_e = - static_cast((d32 & kExponentMask) >> kPhysicalSignificandSize); - return biased_e - kExponentBias; - } - - uint32_t Significand() const { - uint32_t d32 = AsUint32(); - uint32_t significand = d32 & kSignificandMask; - if (!IsDenormal()) { - return significand + kHiddenBit; - } else { - return significand; - } - } - - // Returns true if the single is a denormal. - bool IsDenormal() const { - uint32_t d32 = AsUint32(); - return (d32 & kExponentMask) == 0; - } - - // We consider denormals not to be special. - // Hence only Infinity and NaN are special. - bool IsSpecial() const { - uint32_t d32 = AsUint32(); - return (d32 & kExponentMask) == kExponentMask; - } - - bool IsNan() const { - uint32_t d32 = AsUint32(); - return ((d32 & kExponentMask) == kExponentMask) && - ((d32 & kSignificandMask) != 0); - } - - bool IsInfinite() const { - uint32_t d32 = AsUint32(); - return ((d32 & kExponentMask) == kExponentMask) && - ((d32 & kSignificandMask) == 0); - } - - int Sign() const { - uint32_t d32 = AsUint32(); - return (d32 & kSignMask) == 0? 1: -1; - } - - // Computes the two boundaries of this. - // The bigger boundary (m_plus) is normalized. The lower boundary has the same - // exponent as m_plus. - // Precondition: the value encoded by this Single must be greater than 0. - void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const { - ASSERT(value() > 0.0); - DiyFp v = this->AsDiyFp(); - DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1)); - DiyFp m_minus; - if (LowerBoundaryIsCloser()) { - m_minus = DiyFp((v.f() << 2) - 1, v.e() - 2); - } else { - m_minus = DiyFp((v.f() << 1) - 1, v.e() - 1); - } - m_minus.set_f(m_minus.f() << (m_minus.e() - m_plus.e())); - m_minus.set_e(m_plus.e()); - *out_m_plus = m_plus; - *out_m_minus = m_minus; - } - - // Precondition: the value encoded by this Single must be greater or equal - // than +0.0. - DiyFp UpperBoundary() const { - ASSERT(Sign() > 0); - return DiyFp(Significand() * 2 + 1, Exponent() - 1); - } - - bool LowerBoundaryIsCloser() const { - // The boundary is closer if the significand is of the form f == 2^p-1 then - // the lower boundary is closer. - // Think of v = 1000e10 and v- = 9999e9. - // Then the boundary (== (v - v-)/2) is not just at a distance of 1e9 but - // at a distance of 1e8. - // The only exception is for the smallest normal: the largest denormal is - // at the same distance as its successor. - // Note: denormals have the same exponent as the smallest normals. - bool physical_significand_is_zero = ((AsUint32() & kSignificandMask) == 0); - return physical_significand_is_zero && (Exponent() != kDenormalExponent); - } - - float value() const { return uint32_to_float(d32_); } - - static float Infinity() { - return Single(kInfinity).value(); - } - - static float NaN() { - return Single(kNaN).value(); - } - - private: - static const int kExponentBias = 0x7F + kPhysicalSignificandSize; - static const int kDenormalExponent = -kExponentBias + 1; - static const int kMaxExponent = 0xFF - kExponentBias; - static const uint32_t kInfinity = 0x7F800000; - static const uint32_t kNaN = 0x7FC00000; - - const uint32_t d32_; - - DISALLOW_COPY_AND_ASSIGN(Single); -}; - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_DOUBLE_H_ diff --git a/ios/Pods/DoubleConversion/double-conversion/strtod.cc b/ios/Pods/DoubleConversion/double-conversion/strtod.cc deleted file mode 100644 index 17abcbb..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/strtod.cc +++ /dev/null @@ -1,555 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include -#include - -#include "strtod.h" -#include "bignum.h" -#include "cached-powers.h" -#include "ieee.h" - -namespace double_conversion { - -// 2^53 = 9007199254740992. -// Any integer with at most 15 decimal digits will hence fit into a double -// (which has a 53bit significand) without loss of precision. -static const int kMaxExactDoubleIntegerDecimalDigits = 15; -// 2^64 = 18446744073709551616 > 10^19 -static const int kMaxUint64DecimalDigits = 19; - -// Max double: 1.7976931348623157 x 10^308 -// Min non-zero double: 4.9406564584124654 x 10^-324 -// Any x >= 10^309 is interpreted as +infinity. -// Any x <= 10^-324 is interpreted as 0. -// Note that 2.5e-324 (despite being smaller than the min double) will be read -// as non-zero (equal to the min non-zero double). -static const int kMaxDecimalPower = 309; -static const int kMinDecimalPower = -324; - -// 2^64 = 18446744073709551616 -static const uint64_t kMaxUint64 = UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF); - - -static const double exact_powers_of_ten[] = { - 1.0, // 10^0 - 10.0, - 100.0, - 1000.0, - 10000.0, - 100000.0, - 1000000.0, - 10000000.0, - 100000000.0, - 1000000000.0, - 10000000000.0, // 10^10 - 100000000000.0, - 1000000000000.0, - 10000000000000.0, - 100000000000000.0, - 1000000000000000.0, - 10000000000000000.0, - 100000000000000000.0, - 1000000000000000000.0, - 10000000000000000000.0, - 100000000000000000000.0, // 10^20 - 1000000000000000000000.0, - // 10^22 = 0x21e19e0c9bab2400000 = 0x878678326eac9 * 2^22 - 10000000000000000000000.0 -}; -static const int kExactPowersOfTenSize = ARRAY_SIZE(exact_powers_of_ten); - -// Maximum number of significant digits in the decimal representation. -// In fact the value is 772 (see conversions.cc), but to give us some margin -// we round up to 780. -static const int kMaxSignificantDecimalDigits = 780; - -static Vector TrimLeadingZeros(Vector buffer) { - for (int i = 0; i < buffer.length(); i++) { - if (buffer[i] != '0') { - return buffer.SubVector(i, buffer.length()); - } - } - return Vector(buffer.start(), 0); -} - - -static Vector TrimTrailingZeros(Vector buffer) { - for (int i = buffer.length() - 1; i >= 0; --i) { - if (buffer[i] != '0') { - return buffer.SubVector(0, i + 1); - } - } - return Vector(buffer.start(), 0); -} - - -static void CutToMaxSignificantDigits(Vector buffer, - int exponent, - char* significant_buffer, - int* significant_exponent) { - for (int i = 0; i < kMaxSignificantDecimalDigits - 1; ++i) { - significant_buffer[i] = buffer[i]; - } - // The input buffer has been trimmed. Therefore the last digit must be - // different from '0'. - ASSERT(buffer[buffer.length() - 1] != '0'); - // Set the last digit to be non-zero. This is sufficient to guarantee - // correct rounding. - significant_buffer[kMaxSignificantDecimalDigits - 1] = '1'; - *significant_exponent = - exponent + (buffer.length() - kMaxSignificantDecimalDigits); -} - - -// Trims the buffer and cuts it to at most kMaxSignificantDecimalDigits. -// If possible the input-buffer is reused, but if the buffer needs to be -// modified (due to cutting), then the input needs to be copied into the -// buffer_copy_space. -static void TrimAndCut(Vector buffer, int exponent, - char* buffer_copy_space, int space_size, - Vector* trimmed, int* updated_exponent) { - Vector left_trimmed = TrimLeadingZeros(buffer); - Vector right_trimmed = TrimTrailingZeros(left_trimmed); - exponent += left_trimmed.length() - right_trimmed.length(); - if (right_trimmed.length() > kMaxSignificantDecimalDigits) { - (void) space_size; // Mark variable as used. - ASSERT(space_size >= kMaxSignificantDecimalDigits); - CutToMaxSignificantDigits(right_trimmed, exponent, - buffer_copy_space, updated_exponent); - *trimmed = Vector(buffer_copy_space, - kMaxSignificantDecimalDigits); - } else { - *trimmed = right_trimmed; - *updated_exponent = exponent; - } -} - - -// Reads digits from the buffer and converts them to a uint64. -// Reads in as many digits as fit into a uint64. -// When the string starts with "1844674407370955161" no further digit is read. -// Since 2^64 = 18446744073709551616 it would still be possible read another -// digit if it was less or equal than 6, but this would complicate the code. -static uint64_t ReadUint64(Vector buffer, - int* number_of_read_digits) { - uint64_t result = 0; - int i = 0; - while (i < buffer.length() && result <= (kMaxUint64 / 10 - 1)) { - int digit = buffer[i++] - '0'; - ASSERT(0 <= digit && digit <= 9); - result = 10 * result + digit; - } - *number_of_read_digits = i; - return result; -} - - -// Reads a DiyFp from the buffer. -// The returned DiyFp is not necessarily normalized. -// If remaining_decimals is zero then the returned DiyFp is accurate. -// Otherwise it has been rounded and has error of at most 1/2 ulp. -static void ReadDiyFp(Vector buffer, - DiyFp* result, - int* remaining_decimals) { - int read_digits; - uint64_t significand = ReadUint64(buffer, &read_digits); - if (buffer.length() == read_digits) { - *result = DiyFp(significand, 0); - *remaining_decimals = 0; - } else { - // Round the significand. - if (buffer[read_digits] >= '5') { - significand++; - } - // Compute the binary exponent. - int exponent = 0; - *result = DiyFp(significand, exponent); - *remaining_decimals = buffer.length() - read_digits; - } -} - - -static bool DoubleStrtod(Vector trimmed, - int exponent, - double* result) { -#if !defined(DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS) - // On x86 the floating-point stack can be 64 or 80 bits wide. If it is - // 80 bits wide (as is the case on Linux) then double-rounding occurs and the - // result is not accurate. - // We know that Windows32 uses 64 bits and is therefore accurate. - // Note that the ARM simulator is compiled for 32bits. It therefore exhibits - // the same problem. - return false; -#endif - if (trimmed.length() <= kMaxExactDoubleIntegerDecimalDigits) { - int read_digits; - // The trimmed input fits into a double. - // If the 10^exponent (resp. 10^-exponent) fits into a double too then we - // can compute the result-double simply by multiplying (resp. dividing) the - // two numbers. - // This is possible because IEEE guarantees that floating-point operations - // return the best possible approximation. - if (exponent < 0 && -exponent < kExactPowersOfTenSize) { - // 10^-exponent fits into a double. - *result = static_cast(ReadUint64(trimmed, &read_digits)); - ASSERT(read_digits == trimmed.length()); - *result /= exact_powers_of_ten[-exponent]; - return true; - } - if (0 <= exponent && exponent < kExactPowersOfTenSize) { - // 10^exponent fits into a double. - *result = static_cast(ReadUint64(trimmed, &read_digits)); - ASSERT(read_digits == trimmed.length()); - *result *= exact_powers_of_ten[exponent]; - return true; - } - int remaining_digits = - kMaxExactDoubleIntegerDecimalDigits - trimmed.length(); - if ((0 <= exponent) && - (exponent - remaining_digits < kExactPowersOfTenSize)) { - // The trimmed string was short and we can multiply it with - // 10^remaining_digits. As a result the remaining exponent now fits - // into a double too. - *result = static_cast(ReadUint64(trimmed, &read_digits)); - ASSERT(read_digits == trimmed.length()); - *result *= exact_powers_of_ten[remaining_digits]; - *result *= exact_powers_of_ten[exponent - remaining_digits]; - return true; - } - } - return false; -} - - -// Returns 10^exponent as an exact DiyFp. -// The given exponent must be in the range [1; kDecimalExponentDistance[. -static DiyFp AdjustmentPowerOfTen(int exponent) { - ASSERT(0 < exponent); - ASSERT(exponent < PowersOfTenCache::kDecimalExponentDistance); - // Simply hardcode the remaining powers for the given decimal exponent - // distance. - ASSERT(PowersOfTenCache::kDecimalExponentDistance == 8); - switch (exponent) { - case 1: return DiyFp(UINT64_2PART_C(0xa0000000, 00000000), -60); - case 2: return DiyFp(UINT64_2PART_C(0xc8000000, 00000000), -57); - case 3: return DiyFp(UINT64_2PART_C(0xfa000000, 00000000), -54); - case 4: return DiyFp(UINT64_2PART_C(0x9c400000, 00000000), -50); - case 5: return DiyFp(UINT64_2PART_C(0xc3500000, 00000000), -47); - case 6: return DiyFp(UINT64_2PART_C(0xf4240000, 00000000), -44); - case 7: return DiyFp(UINT64_2PART_C(0x98968000, 00000000), -40); - default: - UNREACHABLE(); - } -} - - -// If the function returns true then the result is the correct double. -// Otherwise it is either the correct double or the double that is just below -// the correct double. -static bool DiyFpStrtod(Vector buffer, - int exponent, - double* result) { - DiyFp input; - int remaining_decimals; - ReadDiyFp(buffer, &input, &remaining_decimals); - // Since we may have dropped some digits the input is not accurate. - // If remaining_decimals is different than 0 than the error is at most - // .5 ulp (unit in the last place). - // We don't want to deal with fractions and therefore keep a common - // denominator. - const int kDenominatorLog = 3; - const int kDenominator = 1 << kDenominatorLog; - // Move the remaining decimals into the exponent. - exponent += remaining_decimals; - uint64_t error = (remaining_decimals == 0 ? 0 : kDenominator / 2); - - int old_e = input.e(); - input.Normalize(); - error <<= old_e - input.e(); - - ASSERT(exponent <= PowersOfTenCache::kMaxDecimalExponent); - if (exponent < PowersOfTenCache::kMinDecimalExponent) { - *result = 0.0; - return true; - } - DiyFp cached_power; - int cached_decimal_exponent; - PowersOfTenCache::GetCachedPowerForDecimalExponent(exponent, - &cached_power, - &cached_decimal_exponent); - - if (cached_decimal_exponent != exponent) { - int adjustment_exponent = exponent - cached_decimal_exponent; - DiyFp adjustment_power = AdjustmentPowerOfTen(adjustment_exponent); - input.Multiply(adjustment_power); - if (kMaxUint64DecimalDigits - buffer.length() >= adjustment_exponent) { - // The product of input with the adjustment power fits into a 64 bit - // integer. - ASSERT(DiyFp::kSignificandSize == 64); - } else { - // The adjustment power is exact. There is hence only an error of 0.5. - error += kDenominator / 2; - } - } - - input.Multiply(cached_power); - // The error introduced by a multiplication of a*b equals - // error_a + error_b + error_a*error_b/2^64 + 0.5 - // Substituting a with 'input' and b with 'cached_power' we have - // error_b = 0.5 (all cached powers have an error of less than 0.5 ulp), - // error_ab = 0 or 1 / kDenominator > error_a*error_b/ 2^64 - int error_b = kDenominator / 2; - int error_ab = (error == 0 ? 0 : 1); // We round up to 1. - int fixed_error = kDenominator / 2; - error += error_b + error_ab + fixed_error; - - old_e = input.e(); - input.Normalize(); - error <<= old_e - input.e(); - - // See if the double's significand changes if we add/subtract the error. - int order_of_magnitude = DiyFp::kSignificandSize + input.e(); - int effective_significand_size = - Double::SignificandSizeForOrderOfMagnitude(order_of_magnitude); - int precision_digits_count = - DiyFp::kSignificandSize - effective_significand_size; - if (precision_digits_count + kDenominatorLog >= DiyFp::kSignificandSize) { - // This can only happen for very small denormals. In this case the - // half-way multiplied by the denominator exceeds the range of an uint64. - // Simply shift everything to the right. - int shift_amount = (precision_digits_count + kDenominatorLog) - - DiyFp::kSignificandSize + 1; - input.set_f(input.f() >> shift_amount); - input.set_e(input.e() + shift_amount); - // We add 1 for the lost precision of error, and kDenominator for - // the lost precision of input.f(). - error = (error >> shift_amount) + 1 + kDenominator; - precision_digits_count -= shift_amount; - } - // We use uint64_ts now. This only works if the DiyFp uses uint64_ts too. - ASSERT(DiyFp::kSignificandSize == 64); - ASSERT(precision_digits_count < 64); - uint64_t one64 = 1; - uint64_t precision_bits_mask = (one64 << precision_digits_count) - 1; - uint64_t precision_bits = input.f() & precision_bits_mask; - uint64_t half_way = one64 << (precision_digits_count - 1); - precision_bits *= kDenominator; - half_way *= kDenominator; - DiyFp rounded_input(input.f() >> precision_digits_count, - input.e() + precision_digits_count); - if (precision_bits >= half_way + error) { - rounded_input.set_f(rounded_input.f() + 1); - } - // If the last_bits are too close to the half-way case than we are too - // inaccurate and round down. In this case we return false so that we can - // fall back to a more precise algorithm. - - *result = Double(rounded_input).value(); - if (half_way - error < precision_bits && precision_bits < half_way + error) { - // Too imprecise. The caller will have to fall back to a slower version. - // However the returned number is guaranteed to be either the correct - // double, or the next-lower double. - return false; - } else { - return true; - } -} - - -// Returns -// - -1 if buffer*10^exponent < diy_fp. -// - 0 if buffer*10^exponent == diy_fp. -// - +1 if buffer*10^exponent > diy_fp. -// Preconditions: -// buffer.length() + exponent <= kMaxDecimalPower + 1 -// buffer.length() + exponent > kMinDecimalPower -// buffer.length() <= kMaxDecimalSignificantDigits -static int CompareBufferWithDiyFp(Vector buffer, - int exponent, - DiyFp diy_fp) { - ASSERT(buffer.length() + exponent <= kMaxDecimalPower + 1); - ASSERT(buffer.length() + exponent > kMinDecimalPower); - ASSERT(buffer.length() <= kMaxSignificantDecimalDigits); - // Make sure that the Bignum will be able to hold all our numbers. - // Our Bignum implementation has a separate field for exponents. Shifts will - // consume at most one bigit (< 64 bits). - // ln(10) == 3.3219... - ASSERT(((kMaxDecimalPower + 1) * 333 / 100) < Bignum::kMaxSignificantBits); - Bignum buffer_bignum; - Bignum diy_fp_bignum; - buffer_bignum.AssignDecimalString(buffer); - diy_fp_bignum.AssignUInt64(diy_fp.f()); - if (exponent >= 0) { - buffer_bignum.MultiplyByPowerOfTen(exponent); - } else { - diy_fp_bignum.MultiplyByPowerOfTen(-exponent); - } - if (diy_fp.e() > 0) { - diy_fp_bignum.ShiftLeft(diy_fp.e()); - } else { - buffer_bignum.ShiftLeft(-diy_fp.e()); - } - return Bignum::Compare(buffer_bignum, diy_fp_bignum); -} - - -// Returns true if the guess is the correct double. -// Returns false, when guess is either correct or the next-lower double. -static bool ComputeGuess(Vector trimmed, int exponent, - double* guess) { - if (trimmed.length() == 0) { - *guess = 0.0; - return true; - } - if (exponent + trimmed.length() - 1 >= kMaxDecimalPower) { - *guess = Double::Infinity(); - return true; - } - if (exponent + trimmed.length() <= kMinDecimalPower) { - *guess = 0.0; - return true; - } - - if (DoubleStrtod(trimmed, exponent, guess) || - DiyFpStrtod(trimmed, exponent, guess)) { - return true; - } - if (*guess == Double::Infinity()) { - return true; - } - return false; -} - -double Strtod(Vector buffer, int exponent) { - char copy_buffer[kMaxSignificantDecimalDigits]; - Vector trimmed; - int updated_exponent; - TrimAndCut(buffer, exponent, copy_buffer, kMaxSignificantDecimalDigits, - &trimmed, &updated_exponent); - exponent = updated_exponent; - - double guess; - bool is_correct = ComputeGuess(trimmed, exponent, &guess); - if (is_correct) return guess; - - DiyFp upper_boundary = Double(guess).UpperBoundary(); - int comparison = CompareBufferWithDiyFp(trimmed, exponent, upper_boundary); - if (comparison < 0) { - return guess; - } else if (comparison > 0) { - return Double(guess).NextDouble(); - } else if ((Double(guess).Significand() & 1) == 0) { - // Round towards even. - return guess; - } else { - return Double(guess).NextDouble(); - } -} - -float Strtof(Vector buffer, int exponent) { - char copy_buffer[kMaxSignificantDecimalDigits]; - Vector trimmed; - int updated_exponent; - TrimAndCut(buffer, exponent, copy_buffer, kMaxSignificantDecimalDigits, - &trimmed, &updated_exponent); - exponent = updated_exponent; - - double double_guess; - bool is_correct = ComputeGuess(trimmed, exponent, &double_guess); - - float float_guess = static_cast(double_guess); - if (float_guess == double_guess) { - // This shortcut triggers for integer values. - return float_guess; - } - - // We must catch double-rounding. Say the double has been rounded up, and is - // now a boundary of a float, and rounds up again. This is why we have to - // look at previous too. - // Example (in decimal numbers): - // input: 12349 - // high-precision (4 digits): 1235 - // low-precision (3 digits): - // when read from input: 123 - // when rounded from high precision: 124. - // To do this we simply look at the neigbors of the correct result and see - // if they would round to the same float. If the guess is not correct we have - // to look at four values (since two different doubles could be the correct - // double). - - double double_next = Double(double_guess).NextDouble(); - double double_previous = Double(double_guess).PreviousDouble(); - - float f1 = static_cast(double_previous); - float f2 = float_guess; - float f3 = static_cast(double_next); - float f4; - if (is_correct) { - f4 = f3; - } else { - double double_next2 = Double(double_next).NextDouble(); - f4 = static_cast(double_next2); - } - (void) f2; // Mark variable as used. - ASSERT(f1 <= f2 && f2 <= f3 && f3 <= f4); - - // If the guess doesn't lie near a single-precision boundary we can simply - // return its float-value. - if (f1 == f4) { - return float_guess; - } - - ASSERT((f1 != f2 && f2 == f3 && f3 == f4) || - (f1 == f2 && f2 != f3 && f3 == f4) || - (f1 == f2 && f2 == f3 && f3 != f4)); - - // guess and next are the two possible canditates (in the same way that - // double_guess was the lower candidate for a double-precision guess). - float guess = f1; - float next = f4; - DiyFp upper_boundary; - if (guess == 0.0f) { - float min_float = 1e-45f; - upper_boundary = Double(static_cast(min_float) / 2).AsDiyFp(); - } else { - upper_boundary = Single(guess).UpperBoundary(); - } - int comparison = CompareBufferWithDiyFp(trimmed, exponent, upper_boundary); - if (comparison < 0) { - return guess; - } else if (comparison > 0) { - return next; - } else if ((Single(guess).Significand() & 1) == 0) { - // Round towards even. - return guess; - } else { - return next; - } -} - -} // namespace double_conversion diff --git a/ios/Pods/DoubleConversion/double-conversion/strtod.h b/ios/Pods/DoubleConversion/double-conversion/strtod.h deleted file mode 100644 index ed0293b..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/strtod.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_STRTOD_H_ -#define DOUBLE_CONVERSION_STRTOD_H_ - -#include "utils.h" - -namespace double_conversion { - -// The buffer must only contain digits in the range [0-9]. It must not -// contain a dot or a sign. It must not start with '0', and must not be empty. -double Strtod(Vector buffer, int exponent); - -// The buffer must only contain digits in the range [0-9]. It must not -// contain a dot or a sign. It must not start with '0', and must not be empty. -float Strtof(Vector buffer, int exponent); - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_STRTOD_H_ diff --git a/ios/Pods/DoubleConversion/double-conversion/utils.h b/ios/Pods/DoubleConversion/double-conversion/utils.h deleted file mode 100644 index a7c9b42..0000000 --- a/ios/Pods/DoubleConversion/double-conversion/utils.h +++ /dev/null @@ -1,324 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_UTILS_H_ -#define DOUBLE_CONVERSION_UTILS_H_ - -#include -#include - -#include -#ifndef ASSERT -#define ASSERT(condition) \ - assert(condition); -#endif -#ifndef UNIMPLEMENTED -#define UNIMPLEMENTED() (abort()) -#endif -#ifndef UNREACHABLE -#define UNREACHABLE() (abort()) -#endif - -// Double operations detection based on target architecture. -// Linux uses a 80bit wide floating point stack on x86. This induces double -// rounding, which in turn leads to wrong results. -// An easy way to test if the floating-point operations are correct is to -// evaluate: 89255.0/1e22. If the floating-point stack is 64 bits wide then -// the result is equal to 89255e-22. -// The best way to test this, is to create a division-function and to compare -// the output of the division with the expected result. (Inlining must be -// disabled.) -// On Linux,x86 89255e-22 != Div_double(89255.0/1e22) -#if defined(_M_X64) || defined(__x86_64__) || \ - defined(__ARMEL__) || defined(__avr32__) || \ - defined(__hppa__) || defined(__ia64__) || \ - defined(__mips__) || \ - defined(__powerpc__) || defined(__ppc__) || defined(__ppc64__) || \ - defined(__sparc__) || defined(__sparc) || defined(__s390__) || \ - defined(__SH4__) || defined(__alpha__) || \ - defined(_MIPS_ARCH_MIPS32R2) || \ - defined(__AARCH64EL__) -#define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1 -#elif defined(__mc68000__) -#undef DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS -#elif defined(_M_IX86) || defined(__i386__) || defined(__i386) -#if defined(_WIN32) -// Windows uses a 64bit wide floating point stack. -#define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1 -#else -#undef DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS -#endif // _WIN32 -#else -#error Target architecture was not detected as supported by Double-Conversion. -#endif - -#if defined(__GNUC__) -#define DOUBLE_CONVERSION_UNUSED __attribute__((unused)) -#else -#define DOUBLE_CONVERSION_UNUSED -#endif - -#if defined(_WIN32) && !defined(__MINGW32__) - -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef short int16_t; // NOLINT -typedef unsigned short uint16_t; // NOLINT -typedef int int32_t; -typedef unsigned int uint32_t; -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -// intptr_t and friends are defined in crtdefs.h through stdio.h. - -#else - -#include - -#endif - -// The following macro works on both 32 and 64-bit platforms. -// Usage: instead of writing 0x1234567890123456 -// write UINT64_2PART_C(0x12345678,90123456); -#define UINT64_2PART_C(a, b) (((static_cast(a) << 32) + 0x##b##u)) - - -// The expression ARRAY_SIZE(a) is a compile-time constant of type -// size_t which represents the number of elements of the given -// array. You should only use ARRAY_SIZE on statically allocated -// arrays. -#ifndef ARRAY_SIZE -#define ARRAY_SIZE(a) \ - ((sizeof(a) / sizeof(*(a))) / \ - static_cast(!(sizeof(a) % sizeof(*(a))))) -#endif - -// A macro to disallow the evil copy constructor and operator= functions -// This should be used in the private: declarations for a class -#ifndef DISALLOW_COPY_AND_ASSIGN -#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&); \ - void operator=(const TypeName&) -#endif - -// A macro to disallow all the implicit constructors, namely the -// default constructor, copy constructor and operator= functions. -// -// This should be used in the private: declarations for a class -// that wants to prevent anyone from instantiating it. This is -// especially useful for classes containing only static methods. -#ifndef DISALLOW_IMPLICIT_CONSTRUCTORS -#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ - TypeName(); \ - DISALLOW_COPY_AND_ASSIGN(TypeName) -#endif - -namespace double_conversion { - -static const int kCharSize = sizeof(char); - -// Returns the maximum of the two parameters. -template -static T Max(T a, T b) { - return a < b ? b : a; -} - - -// Returns the minimum of the two parameters. -template -static T Min(T a, T b) { - return a < b ? a : b; -} - - -inline int StrLength(const char* string) { - size_t length = strlen(string); - ASSERT(length == static_cast(static_cast(length))); - return static_cast(length); -} - -// This is a simplified version of V8's Vector class. -template -class Vector { - public: - Vector() : start_(NULL), length_(0) {} - Vector(T* data, int length) : start_(data), length_(length) { - ASSERT(length == 0 || (length > 0 && data != NULL)); - } - - // Returns a vector using the same backing storage as this one, - // spanning from and including 'from', to but not including 'to'. - Vector SubVector(int from, int to) { - ASSERT(to <= length_); - ASSERT(from < to); - ASSERT(0 <= from); - return Vector(start() + from, to - from); - } - - // Returns the length of the vector. - int length() const { return length_; } - - // Returns whether or not the vector is empty. - bool is_empty() const { return length_ == 0; } - - // Returns the pointer to the start of the data in the vector. - T* start() const { return start_; } - - // Access individual vector elements - checks bounds in debug mode. - T& operator[](int index) const { - ASSERT(0 <= index && index < length_); - return start_[index]; - } - - T& first() { return start_[0]; } - - T& last() { return start_[length_ - 1]; } - - private: - T* start_; - int length_; -}; - - -// Helper class for building result strings in a character buffer. The -// purpose of the class is to use safe operations that checks the -// buffer bounds on all operations in debug mode. -class StringBuilder { - public: - StringBuilder(char* buffer, int size) - : buffer_(buffer, size), position_(0) { } - - ~StringBuilder() { if (!is_finalized()) Finalize(); } - - int size() const { return buffer_.length(); } - - // Get the current position in the builder. - int position() const { - ASSERT(!is_finalized()); - return position_; - } - - // Reset the position. - void Reset() { position_ = 0; } - - // Add a single character to the builder. It is not allowed to add - // 0-characters; use the Finalize() method to terminate the string - // instead. - void AddCharacter(char c) { - ASSERT(c != '\0'); - ASSERT(!is_finalized() && position_ < buffer_.length()); - buffer_[position_++] = c; - } - - // Add an entire string to the builder. Uses strlen() internally to - // compute the length of the input string. - void AddString(const char* s) { - AddSubstring(s, StrLength(s)); - } - - // Add the first 'n' characters of the given string 's' to the - // builder. The input string must have enough characters. - void AddSubstring(const char* s, int n) { - ASSERT(!is_finalized() && position_ + n < buffer_.length()); - ASSERT(static_cast(n) <= strlen(s)); - memmove(&buffer_[position_], s, n * kCharSize); - position_ += n; - } - - - // Add character padding to the builder. If count is non-positive, - // nothing is added to the builder. - void AddPadding(char c, int count) { - for (int i = 0; i < count; i++) { - AddCharacter(c); - } - } - - // Finalize the string by 0-terminating it and returning the buffer. - char* Finalize() { - ASSERT(!is_finalized() && position_ < buffer_.length()); - buffer_[position_] = '\0'; - // Make sure nobody managed to add a 0-character to the - // buffer while building the string. - ASSERT(strlen(buffer_.start()) == static_cast(position_)); - position_ = -1; - ASSERT(is_finalized()); - return buffer_.start(); - } - - private: - Vector buffer_; - int position_; - - bool is_finalized() const { return position_ < 0; } - - DISALLOW_IMPLICIT_CONSTRUCTORS(StringBuilder); -}; - -// The type-based aliasing rule allows the compiler to assume that pointers of -// different types (for some definition of different) never alias each other. -// Thus the following code does not work: -// -// float f = foo(); -// int fbits = *(int*)(&f); -// -// The compiler 'knows' that the int pointer can't refer to f since the types -// don't match, so the compiler may cache f in a register, leaving random data -// in fbits. Using C++ style casts makes no difference, however a pointer to -// char data is assumed to alias any other pointer. This is the 'memcpy -// exception'. -// -// Bit_cast uses the memcpy exception to move the bits from a variable of one -// type of a variable of another type. Of course the end result is likely to -// be implementation dependent. Most compilers (gcc-4.2 and MSVC 2005) -// will completely optimize BitCast away. -// -// There is an additional use for BitCast. -// Recent gccs will warn when they see casts that may result in breakage due to -// the type-based aliasing rule. If you have checked that there is no breakage -// you can use BitCast to cast one pointer type to another. This confuses gcc -// enough that it can no longer see that you have cast one pointer type to -// another thus avoiding the warning. -template -inline Dest BitCast(const Source& source) { - // Compile time assertion: sizeof(Dest) == sizeof(Source) - // A compile error here means your Dest and Source have different sizes. - DOUBLE_CONVERSION_UNUSED - typedef char VerifySizesAreEqual[sizeof(Dest) == sizeof(Source) ? 1 : -1]; - - Dest dest; - memmove(&dest, &source, sizeof(dest)); - return dest; -} - -template -inline Dest BitCast(Source* source) { - return BitCast(reinterpret_cast(source)); -} - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_UTILS_H_ diff --git a/ios/Pods/Flipper-DoubleConversion/LICENSE b/ios/Pods/Flipper-DoubleConversion/LICENSE deleted file mode 100644 index 933718a..0000000 --- a/ios/Pods/Flipper-DoubleConversion/LICENSE +++ /dev/null @@ -1,26 +0,0 @@ -Copyright 2006-2011, the V8 project authors. All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - disclaimer in the documentation and/or other materials provided - with the distribution. - * Neither the name of Google Inc. nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/ios/Pods/Flipper-DoubleConversion/README b/ios/Pods/Flipper-DoubleConversion/README deleted file mode 100644 index 167f9c5..0000000 --- a/ios/Pods/Flipper-DoubleConversion/README +++ /dev/null @@ -1,54 +0,0 @@ -http://code.google.com/p/double-conversion - -This project (double-conversion) provides binary-decimal and decimal-binary -routines for IEEE doubles. - -The library consists of efficient conversion routines that have been extracted -from the V8 JavaScript engine. The code has been refactored and improved so that -it can be used more easily in other projects. - -There is extensive documentation in src/double-conversion.h. Other examples can -be found in test/cctest/test-conversions.cc. - - -Building -======== - -This library can be built with scons [0] or cmake [1]. -The checked-in Makefile simply forwards to scons, and provides a -shortcut to run all tests: - - make - make test - -Scons ------ - -The easiest way to install this library is to use `scons`. It builds -the static and shared library, and is set up to install those at the -correct locations: - - scons install - -Use the `DESTDIR` option to change the target directory: - - scons DESTDIR=alternative_directory install - -Cmake ------ - -To use cmake run `cmake .` in the root directory. This overwrites the -existing Makefile. - -Use `-DBUILD_SHARED_LIBS=ON` to enable the compilation of shared libraries. -Note that this disables static libraries. There is currently no way to -build both libraries at the same time with cmake. - -Use `-DBUILD_TESTING=ON` to build the test executable. - - cmake . -DBUILD_TESTING=ON - make - test/cctest/cctest --list | tr -d '<' | xargs test/cctest/cctest - -[0]: http://www.scons.org -[1]: http://www.cmake.org diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/bignum-dtoa.cc b/ios/Pods/Flipper-DoubleConversion/double-conversion/bignum-dtoa.cc deleted file mode 100644 index f1ad7a5..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/bignum-dtoa.cc +++ /dev/null @@ -1,641 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include - -#include "bignum-dtoa.h" - -#include "bignum.h" -#include "ieee.h" - -namespace double_conversion { - -static int NormalizedExponent(uint64_t significand, int exponent) { - ASSERT(significand != 0); - while ((significand & Double::kHiddenBit) == 0) { - significand = significand << 1; - exponent = exponent - 1; - } - return exponent; -} - - -// Forward declarations: -// Returns an estimation of k such that 10^(k-1) <= v < 10^k. -static int EstimatePower(int exponent); -// Computes v / 10^estimated_power exactly, as a ratio of two bignums, numerator -// and denominator. -static void InitialScaledStartValues(uint64_t significand, - int exponent, - bool lower_boundary_is_closer, - int estimated_power, - bool need_boundary_deltas, - Bignum* numerator, - Bignum* denominator, - Bignum* delta_minus, - Bignum* delta_plus); -// Multiplies numerator/denominator so that its values lies in the range 1-10. -// Returns decimal_point s.t. -// v = numerator'/denominator' * 10^(decimal_point-1) -// where numerator' and denominator' are the values of numerator and -// denominator after the call to this function. -static void FixupMultiply10(int estimated_power, bool is_even, - int* decimal_point, - Bignum* numerator, Bignum* denominator, - Bignum* delta_minus, Bignum* delta_plus); -// Generates digits from the left to the right and stops when the generated -// digits yield the shortest decimal representation of v. -static void GenerateShortestDigits(Bignum* numerator, Bignum* denominator, - Bignum* delta_minus, Bignum* delta_plus, - bool is_even, - Vector buffer, int* length); -// Generates 'requested_digits' after the decimal point. -static void BignumToFixed(int requested_digits, int* decimal_point, - Bignum* numerator, Bignum* denominator, - Vector(buffer), int* length); -// Generates 'count' digits of numerator/denominator. -// Once 'count' digits have been produced rounds the result depending on the -// remainder (remainders of exactly .5 round upwards). Might update the -// decimal_point when rounding up (for example for 0.9999). -static void GenerateCountedDigits(int count, int* decimal_point, - Bignum* numerator, Bignum* denominator, - Vector(buffer), int* length); - - -void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits, - Vector buffer, int* length, int* decimal_point) { - ASSERT(v > 0); - ASSERT(!Double(v).IsSpecial()); - uint64_t significand; - int exponent; - bool lower_boundary_is_closer; - if (mode == BIGNUM_DTOA_SHORTEST_SINGLE) { - float f = static_cast(v); - ASSERT(f == v); - significand = Single(f).Significand(); - exponent = Single(f).Exponent(); - lower_boundary_is_closer = Single(f).LowerBoundaryIsCloser(); - } else { - significand = Double(v).Significand(); - exponent = Double(v).Exponent(); - lower_boundary_is_closer = Double(v).LowerBoundaryIsCloser(); - } - bool need_boundary_deltas = - (mode == BIGNUM_DTOA_SHORTEST || mode == BIGNUM_DTOA_SHORTEST_SINGLE); - - bool is_even = (significand & 1) == 0; - int normalized_exponent = NormalizedExponent(significand, exponent); - // estimated_power might be too low by 1. - int estimated_power = EstimatePower(normalized_exponent); - - // Shortcut for Fixed. - // The requested digits correspond to the digits after the point. If the - // number is much too small, then there is no need in trying to get any - // digits. - if (mode == BIGNUM_DTOA_FIXED && -estimated_power - 1 > requested_digits) { - buffer[0] = '\0'; - *length = 0; - // Set decimal-point to -requested_digits. This is what Gay does. - // Note that it should not have any effect anyways since the string is - // empty. - *decimal_point = -requested_digits; - return; - } - - Bignum numerator; - Bignum denominator; - Bignum delta_minus; - Bignum delta_plus; - // Make sure the bignum can grow large enough. The smallest double equals - // 4e-324. In this case the denominator needs fewer than 324*4 binary digits. - // The maximum double is 1.7976931348623157e308 which needs fewer than - // 308*4 binary digits. - ASSERT(Bignum::kMaxSignificantBits >= 324*4); - InitialScaledStartValues(significand, exponent, lower_boundary_is_closer, - estimated_power, need_boundary_deltas, - &numerator, &denominator, - &delta_minus, &delta_plus); - // We now have v = (numerator / denominator) * 10^estimated_power. - FixupMultiply10(estimated_power, is_even, decimal_point, - &numerator, &denominator, - &delta_minus, &delta_plus); - // We now have v = (numerator / denominator) * 10^(decimal_point-1), and - // 1 <= (numerator + delta_plus) / denominator < 10 - switch (mode) { - case BIGNUM_DTOA_SHORTEST: - case BIGNUM_DTOA_SHORTEST_SINGLE: - GenerateShortestDigits(&numerator, &denominator, - &delta_minus, &delta_plus, - is_even, buffer, length); - break; - case BIGNUM_DTOA_FIXED: - BignumToFixed(requested_digits, decimal_point, - &numerator, &denominator, - buffer, length); - break; - case BIGNUM_DTOA_PRECISION: - GenerateCountedDigits(requested_digits, decimal_point, - &numerator, &denominator, - buffer, length); - break; - default: - UNREACHABLE(); - } - buffer[*length] = '\0'; -} - - -// The procedure starts generating digits from the left to the right and stops -// when the generated digits yield the shortest decimal representation of v. A -// decimal representation of v is a number lying closer to v than to any other -// double, so it converts to v when read. -// -// This is true if d, the decimal representation, is between m- and m+, the -// upper and lower boundaries. d must be strictly between them if !is_even. -// m- := (numerator - delta_minus) / denominator -// m+ := (numerator + delta_plus) / denominator -// -// Precondition: 0 <= (numerator+delta_plus) / denominator < 10. -// If 1 <= (numerator+delta_plus) / denominator < 10 then no leading 0 digit -// will be produced. This should be the standard precondition. -static void GenerateShortestDigits(Bignum* numerator, Bignum* denominator, - Bignum* delta_minus, Bignum* delta_plus, - bool is_even, - Vector buffer, int* length) { - // Small optimization: if delta_minus and delta_plus are the same just reuse - // one of the two bignums. - if (Bignum::Equal(*delta_minus, *delta_plus)) { - delta_plus = delta_minus; - } - *length = 0; - for (;;) { - uint16_t digit; - digit = numerator->DivideModuloIntBignum(*denominator); - ASSERT(digit <= 9); // digit is a uint16_t and therefore always positive. - // digit = numerator / denominator (integer division). - // numerator = numerator % denominator. - buffer[(*length)++] = static_cast(digit + '0'); - - // Can we stop already? - // If the remainder of the division is less than the distance to the lower - // boundary we can stop. In this case we simply round down (discarding the - // remainder). - // Similarly we test if we can round up (using the upper boundary). - bool in_delta_room_minus; - bool in_delta_room_plus; - if (is_even) { - in_delta_room_minus = Bignum::LessEqual(*numerator, *delta_minus); - } else { - in_delta_room_minus = Bignum::Less(*numerator, *delta_minus); - } - if (is_even) { - in_delta_room_plus = - Bignum::PlusCompare(*numerator, *delta_plus, *denominator) >= 0; - } else { - in_delta_room_plus = - Bignum::PlusCompare(*numerator, *delta_plus, *denominator) > 0; - } - if (!in_delta_room_minus && !in_delta_room_plus) { - // Prepare for next iteration. - numerator->Times10(); - delta_minus->Times10(); - // We optimized delta_plus to be equal to delta_minus (if they share the - // same value). So don't multiply delta_plus if they point to the same - // object. - if (delta_minus != delta_plus) { - delta_plus->Times10(); - } - } else if (in_delta_room_minus && in_delta_room_plus) { - // Let's see if 2*numerator < denominator. - // If yes, then the next digit would be < 5 and we can round down. - int compare = Bignum::PlusCompare(*numerator, *numerator, *denominator); - if (compare < 0) { - // Remaining digits are less than .5. -> Round down (== do nothing). - } else if (compare > 0) { - // Remaining digits are more than .5 of denominator. -> Round up. - // Note that the last digit could not be a '9' as otherwise the whole - // loop would have stopped earlier. - // We still have an assert here in case the preconditions were not - // satisfied. - ASSERT(buffer[(*length) - 1] != '9'); - buffer[(*length) - 1]++; - } else { - // Halfway case. - // TODO(floitsch): need a way to solve half-way cases. - // For now let's round towards even (since this is what Gay seems to - // do). - - if ((buffer[(*length) - 1] - '0') % 2 == 0) { - // Round down => Do nothing. - } else { - ASSERT(buffer[(*length) - 1] != '9'); - buffer[(*length) - 1]++; - } - } - return; - } else if (in_delta_room_minus) { - // Round down (== do nothing). - return; - } else { // in_delta_room_plus - // Round up. - // Note again that the last digit could not be '9' since this would have - // stopped the loop earlier. - // We still have an ASSERT here, in case the preconditions were not - // satisfied. - ASSERT(buffer[(*length) -1] != '9'); - buffer[(*length) - 1]++; - return; - } - } -} - - -// Let v = numerator / denominator < 10. -// Then we generate 'count' digits of d = x.xxxxx... (without the decimal point) -// from left to right. Once 'count' digits have been produced we decide wether -// to round up or down. Remainders of exactly .5 round upwards. Numbers such -// as 9.999999 propagate a carry all the way, and change the -// exponent (decimal_point), when rounding upwards. -static void GenerateCountedDigits(int count, int* decimal_point, - Bignum* numerator, Bignum* denominator, - Vector buffer, int* length) { - ASSERT(count >= 0); - for (int i = 0; i < count - 1; ++i) { - uint16_t digit; - digit = numerator->DivideModuloIntBignum(*denominator); - ASSERT(digit <= 9); // digit is a uint16_t and therefore always positive. - // digit = numerator / denominator (integer division). - // numerator = numerator % denominator. - buffer[i] = static_cast(digit + '0'); - // Prepare for next iteration. - numerator->Times10(); - } - // Generate the last digit. - uint16_t digit; - digit = numerator->DivideModuloIntBignum(*denominator); - if (Bignum::PlusCompare(*numerator, *numerator, *denominator) >= 0) { - digit++; - } - ASSERT(digit <= 10); - buffer[count - 1] = static_cast(digit + '0'); - // Correct bad digits (in case we had a sequence of '9's). Propagate the - // carry until we hat a non-'9' or til we reach the first digit. - for (int i = count - 1; i > 0; --i) { - if (buffer[i] != '0' + 10) break; - buffer[i] = '0'; - buffer[i - 1]++; - } - if (buffer[0] == '0' + 10) { - // Propagate a carry past the top place. - buffer[0] = '1'; - (*decimal_point)++; - } - *length = count; -} - - -// Generates 'requested_digits' after the decimal point. It might omit -// trailing '0's. If the input number is too small then no digits at all are -// generated (ex.: 2 fixed digits for 0.00001). -// -// Input verifies: 1 <= (numerator + delta) / denominator < 10. -static void BignumToFixed(int requested_digits, int* decimal_point, - Bignum* numerator, Bignum* denominator, - Vector(buffer), int* length) { - // Note that we have to look at more than just the requested_digits, since - // a number could be rounded up. Example: v=0.5 with requested_digits=0. - // Even though the power of v equals 0 we can't just stop here. - if (-(*decimal_point) > requested_digits) { - // The number is definitively too small. - // Ex: 0.001 with requested_digits == 1. - // Set decimal-point to -requested_digits. This is what Gay does. - // Note that it should not have any effect anyways since the string is - // empty. - *decimal_point = -requested_digits; - *length = 0; - return; - } else if (-(*decimal_point) == requested_digits) { - // We only need to verify if the number rounds down or up. - // Ex: 0.04 and 0.06 with requested_digits == 1. - ASSERT(*decimal_point == -requested_digits); - // Initially the fraction lies in range (1, 10]. Multiply the denominator - // by 10 so that we can compare more easily. - denominator->Times10(); - if (Bignum::PlusCompare(*numerator, *numerator, *denominator) >= 0) { - // If the fraction is >= 0.5 then we have to include the rounded - // digit. - buffer[0] = '1'; - *length = 1; - (*decimal_point)++; - } else { - // Note that we caught most of similar cases earlier. - *length = 0; - } - return; - } else { - // The requested digits correspond to the digits after the point. - // The variable 'needed_digits' includes the digits before the point. - int needed_digits = (*decimal_point) + requested_digits; - GenerateCountedDigits(needed_digits, decimal_point, - numerator, denominator, - buffer, length); - } -} - - -// Returns an estimation of k such that 10^(k-1) <= v < 10^k where -// v = f * 2^exponent and 2^52 <= f < 2^53. -// v is hence a normalized double with the given exponent. The output is an -// approximation for the exponent of the decimal approimation .digits * 10^k. -// -// The result might undershoot by 1 in which case 10^k <= v < 10^k+1. -// Note: this property holds for v's upper boundary m+ too. -// 10^k <= m+ < 10^k+1. -// (see explanation below). -// -// Examples: -// EstimatePower(0) => 16 -// EstimatePower(-52) => 0 -// -// Note: e >= 0 => EstimatedPower(e) > 0. No similar claim can be made for e<0. -static int EstimatePower(int exponent) { - // This function estimates log10 of v where v = f*2^e (with e == exponent). - // Note that 10^floor(log10(v)) <= v, but v <= 10^ceil(log10(v)). - // Note that f is bounded by its container size. Let p = 53 (the double's - // significand size). Then 2^(p-1) <= f < 2^p. - // - // Given that log10(v) == log2(v)/log2(10) and e+(len(f)-1) is quite close - // to log2(v) the function is simplified to (e+(len(f)-1)/log2(10)). - // The computed number undershoots by less than 0.631 (when we compute log3 - // and not log10). - // - // Optimization: since we only need an approximated result this computation - // can be performed on 64 bit integers. On x86/x64 architecture the speedup is - // not really measurable, though. - // - // Since we want to avoid overshooting we decrement by 1e10 so that - // floating-point imprecisions don't affect us. - // - // Explanation for v's boundary m+: the computation takes advantage of - // the fact that 2^(p-1) <= f < 2^p. Boundaries still satisfy this requirement - // (even for denormals where the delta can be much more important). - - const double k1Log10 = 0.30102999566398114; // 1/lg(10) - - // For doubles len(f) == 53 (don't forget the hidden bit). - const int kSignificandSize = Double::kSignificandSize; - double estimate = ceil((exponent + kSignificandSize - 1) * k1Log10 - 1e-10); - return static_cast(estimate); -} - - -// See comments for InitialScaledStartValues. -static void InitialScaledStartValuesPositiveExponent( - uint64_t significand, int exponent, - int estimated_power, bool need_boundary_deltas, - Bignum* numerator, Bignum* denominator, - Bignum* delta_minus, Bignum* delta_plus) { - // A positive exponent implies a positive power. - ASSERT(estimated_power >= 0); - // Since the estimated_power is positive we simply multiply the denominator - // by 10^estimated_power. - - // numerator = v. - numerator->AssignUInt64(significand); - numerator->ShiftLeft(exponent); - // denominator = 10^estimated_power. - denominator->AssignPowerUInt16(10, estimated_power); - - if (need_boundary_deltas) { - // Introduce a common denominator so that the deltas to the boundaries are - // integers. - denominator->ShiftLeft(1); - numerator->ShiftLeft(1); - // Let v = f * 2^e, then m+ - v = 1/2 * 2^e; With the common - // denominator (of 2) delta_plus equals 2^e. - delta_plus->AssignUInt16(1); - delta_plus->ShiftLeft(exponent); - // Same for delta_minus. The adjustments if f == 2^p-1 are done later. - delta_minus->AssignUInt16(1); - delta_minus->ShiftLeft(exponent); - } -} - - -// See comments for InitialScaledStartValues -static void InitialScaledStartValuesNegativeExponentPositivePower( - uint64_t significand, int exponent, - int estimated_power, bool need_boundary_deltas, - Bignum* numerator, Bignum* denominator, - Bignum* delta_minus, Bignum* delta_plus) { - // v = f * 2^e with e < 0, and with estimated_power >= 0. - // This means that e is close to 0 (have a look at how estimated_power is - // computed). - - // numerator = significand - // since v = significand * 2^exponent this is equivalent to - // numerator = v * / 2^-exponent - numerator->AssignUInt64(significand); - // denominator = 10^estimated_power * 2^-exponent (with exponent < 0) - denominator->AssignPowerUInt16(10, estimated_power); - denominator->ShiftLeft(-exponent); - - if (need_boundary_deltas) { - // Introduce a common denominator so that the deltas to the boundaries are - // integers. - denominator->ShiftLeft(1); - numerator->ShiftLeft(1); - // Let v = f * 2^e, then m+ - v = 1/2 * 2^e; With the common - // denominator (of 2) delta_plus equals 2^e. - // Given that the denominator already includes v's exponent the distance - // to the boundaries is simply 1. - delta_plus->AssignUInt16(1); - // Same for delta_minus. The adjustments if f == 2^p-1 are done later. - delta_minus->AssignUInt16(1); - } -} - - -// See comments for InitialScaledStartValues -static void InitialScaledStartValuesNegativeExponentNegativePower( - uint64_t significand, int exponent, - int estimated_power, bool need_boundary_deltas, - Bignum* numerator, Bignum* denominator, - Bignum* delta_minus, Bignum* delta_plus) { - // Instead of multiplying the denominator with 10^estimated_power we - // multiply all values (numerator and deltas) by 10^-estimated_power. - - // Use numerator as temporary container for power_ten. - Bignum* power_ten = numerator; - power_ten->AssignPowerUInt16(10, -estimated_power); - - if (need_boundary_deltas) { - // Since power_ten == numerator we must make a copy of 10^estimated_power - // before we complete the computation of the numerator. - // delta_plus = delta_minus = 10^estimated_power - delta_plus->AssignBignum(*power_ten); - delta_minus->AssignBignum(*power_ten); - } - - // numerator = significand * 2 * 10^-estimated_power - // since v = significand * 2^exponent this is equivalent to - // numerator = v * 10^-estimated_power * 2 * 2^-exponent. - // Remember: numerator has been abused as power_ten. So no need to assign it - // to itself. - ASSERT(numerator == power_ten); - numerator->MultiplyByUInt64(significand); - - // denominator = 2 * 2^-exponent with exponent < 0. - denominator->AssignUInt16(1); - denominator->ShiftLeft(-exponent); - - if (need_boundary_deltas) { - // Introduce a common denominator so that the deltas to the boundaries are - // integers. - numerator->ShiftLeft(1); - denominator->ShiftLeft(1); - // With this shift the boundaries have their correct value, since - // delta_plus = 10^-estimated_power, and - // delta_minus = 10^-estimated_power. - // These assignments have been done earlier. - // The adjustments if f == 2^p-1 (lower boundary is closer) are done later. - } -} - - -// Let v = significand * 2^exponent. -// Computes v / 10^estimated_power exactly, as a ratio of two bignums, numerator -// and denominator. The functions GenerateShortestDigits and -// GenerateCountedDigits will then convert this ratio to its decimal -// representation d, with the required accuracy. -// Then d * 10^estimated_power is the representation of v. -// (Note: the fraction and the estimated_power might get adjusted before -// generating the decimal representation.) -// -// The initial start values consist of: -// - a scaled numerator: s.t. numerator/denominator == v / 10^estimated_power. -// - a scaled (common) denominator. -// optionally (used by GenerateShortestDigits to decide if it has the shortest -// decimal converting back to v): -// - v - m-: the distance to the lower boundary. -// - m+ - v: the distance to the upper boundary. -// -// v, m+, m-, and therefore v - m- and m+ - v all share the same denominator. -// -// Let ep == estimated_power, then the returned values will satisfy: -// v / 10^ep = numerator / denominator. -// v's boundarys m- and m+: -// m- / 10^ep == v / 10^ep - delta_minus / denominator -// m+ / 10^ep == v / 10^ep + delta_plus / denominator -// Or in other words: -// m- == v - delta_minus * 10^ep / denominator; -// m+ == v + delta_plus * 10^ep / denominator; -// -// Since 10^(k-1) <= v < 10^k (with k == estimated_power) -// or 10^k <= v < 10^(k+1) -// we then have 0.1 <= numerator/denominator < 1 -// or 1 <= numerator/denominator < 10 -// -// It is then easy to kickstart the digit-generation routine. -// -// The boundary-deltas are only filled if the mode equals BIGNUM_DTOA_SHORTEST -// or BIGNUM_DTOA_SHORTEST_SINGLE. - -static void InitialScaledStartValues(uint64_t significand, - int exponent, - bool lower_boundary_is_closer, - int estimated_power, - bool need_boundary_deltas, - Bignum* numerator, - Bignum* denominator, - Bignum* delta_minus, - Bignum* delta_plus) { - if (exponent >= 0) { - InitialScaledStartValuesPositiveExponent( - significand, exponent, estimated_power, need_boundary_deltas, - numerator, denominator, delta_minus, delta_plus); - } else if (estimated_power >= 0) { - InitialScaledStartValuesNegativeExponentPositivePower( - significand, exponent, estimated_power, need_boundary_deltas, - numerator, denominator, delta_minus, delta_plus); - } else { - InitialScaledStartValuesNegativeExponentNegativePower( - significand, exponent, estimated_power, need_boundary_deltas, - numerator, denominator, delta_minus, delta_plus); - } - - if (need_boundary_deltas && lower_boundary_is_closer) { - // The lower boundary is closer at half the distance of "normal" numbers. - // Increase the common denominator and adapt all but the delta_minus. - denominator->ShiftLeft(1); // *2 - numerator->ShiftLeft(1); // *2 - delta_plus->ShiftLeft(1); // *2 - } -} - - -// This routine multiplies numerator/denominator so that its values lies in the -// range 1-10. That is after a call to this function we have: -// 1 <= (numerator + delta_plus) /denominator < 10. -// Let numerator the input before modification and numerator' the argument -// after modification, then the output-parameter decimal_point is such that -// numerator / denominator * 10^estimated_power == -// numerator' / denominator' * 10^(decimal_point - 1) -// In some cases estimated_power was too low, and this is already the case. We -// then simply adjust the power so that 10^(k-1) <= v < 10^k (with k == -// estimated_power) but do not touch the numerator or denominator. -// Otherwise the routine multiplies the numerator and the deltas by 10. -static void FixupMultiply10(int estimated_power, bool is_even, - int* decimal_point, - Bignum* numerator, Bignum* denominator, - Bignum* delta_minus, Bignum* delta_plus) { - bool in_range; - if (is_even) { - // For IEEE doubles half-way cases (in decimal system numbers ending with 5) - // are rounded to the closest floating-point number with even significand. - in_range = Bignum::PlusCompare(*numerator, *delta_plus, *denominator) >= 0; - } else { - in_range = Bignum::PlusCompare(*numerator, *delta_plus, *denominator) > 0; - } - if (in_range) { - // Since numerator + delta_plus >= denominator we already have - // 1 <= numerator/denominator < 10. Simply update the estimated_power. - *decimal_point = estimated_power + 1; - } else { - *decimal_point = estimated_power; - numerator->Times10(); - if (Bignum::Equal(*delta_minus, *delta_plus)) { - delta_minus->Times10(); - delta_plus->AssignBignum(*delta_minus); - } else { - delta_minus->Times10(); - delta_plus->Times10(); - } - } -} - -} // namespace double_conversion diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/bignum-dtoa.h b/ios/Pods/Flipper-DoubleConversion/double-conversion/bignum-dtoa.h deleted file mode 100644 index 34b9619..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/bignum-dtoa.h +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_BIGNUM_DTOA_H_ -#define DOUBLE_CONVERSION_BIGNUM_DTOA_H_ - -#include "utils.h" - -namespace double_conversion { - -enum BignumDtoaMode { - // Return the shortest correct representation. - // For example the output of 0.299999999999999988897 is (the less accurate but - // correct) 0.3. - BIGNUM_DTOA_SHORTEST, - // Same as BIGNUM_DTOA_SHORTEST but for single-precision floats. - BIGNUM_DTOA_SHORTEST_SINGLE, - // Return a fixed number of digits after the decimal point. - // For instance fixed(0.1, 4) becomes 0.1000 - // If the input number is big, the output will be big. - BIGNUM_DTOA_FIXED, - // Return a fixed number of digits, no matter what the exponent is. - BIGNUM_DTOA_PRECISION -}; - -// Converts the given double 'v' to ascii. -// The result should be interpreted as buffer * 10^(point-length). -// The buffer will be null-terminated. -// -// The input v must be > 0 and different from NaN, and Infinity. -// -// The output depends on the given mode: -// - SHORTEST: produce the least amount of digits for which the internal -// identity requirement is still satisfied. If the digits are printed -// (together with the correct exponent) then reading this number will give -// 'v' again. The buffer will choose the representation that is closest to -// 'v'. If there are two at the same distance, than the number is round up. -// In this mode the 'requested_digits' parameter is ignored. -// - FIXED: produces digits necessary to print a given number with -// 'requested_digits' digits after the decimal point. The produced digits -// might be too short in which case the caller has to fill the gaps with '0's. -// Example: toFixed(0.001, 5) is allowed to return buffer="1", point=-2. -// Halfway cases are rounded up. The call toFixed(0.15, 2) thus returns -// buffer="2", point=0. -// Note: the length of the returned buffer has no meaning wrt the significance -// of its digits. That is, just because it contains '0's does not mean that -// any other digit would not satisfy the internal identity requirement. -// - PRECISION: produces 'requested_digits' where the first digit is not '0'. -// Even though the length of produced digits usually equals -// 'requested_digits', the function is allowed to return fewer digits, in -// which case the caller has to fill the missing digits with '0's. -// Halfway cases are again rounded up. -// 'BignumDtoa' expects the given buffer to be big enough to hold all digits -// and a terminating null-character. -void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits, - Vector buffer, int* length, int* point); - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_BIGNUM_DTOA_H_ diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/bignum.cc b/ios/Pods/Flipper-DoubleConversion/double-conversion/bignum.cc deleted file mode 100644 index 2743d67..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/bignum.cc +++ /dev/null @@ -1,766 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include "bignum.h" -#include "utils.h" - -namespace double_conversion { - -Bignum::Bignum() - : bigits_(bigits_buffer_, kBigitCapacity), used_digits_(0), exponent_(0) { - for (int i = 0; i < kBigitCapacity; ++i) { - bigits_[i] = 0; - } -} - - -template -static int BitSize(S value) { - (void) value; // Mark variable as used. - return 8 * sizeof(value); -} - -// Guaranteed to lie in one Bigit. -void Bignum::AssignUInt16(uint16_t value) { - ASSERT(kBigitSize >= BitSize(value)); - Zero(); - if (value == 0) return; - - EnsureCapacity(1); - bigits_[0] = value; - used_digits_ = 1; -} - - -void Bignum::AssignUInt64(uint64_t value) { - const int kUInt64Size = 64; - - Zero(); - if (value == 0) return; - - int needed_bigits = kUInt64Size / kBigitSize + 1; - EnsureCapacity(needed_bigits); - for (int i = 0; i < needed_bigits; ++i) { - bigits_[i] = value & kBigitMask; - value = value >> kBigitSize; - } - used_digits_ = needed_bigits; - Clamp(); -} - - -void Bignum::AssignBignum(const Bignum& other) { - exponent_ = other.exponent_; - for (int i = 0; i < other.used_digits_; ++i) { - bigits_[i] = other.bigits_[i]; - } - // Clear the excess digits (if there were any). - for (int i = other.used_digits_; i < used_digits_; ++i) { - bigits_[i] = 0; - } - used_digits_ = other.used_digits_; -} - - -static uint64_t ReadUInt64(Vector buffer, - int from, - int digits_to_read) { - uint64_t result = 0; - for (int i = from; i < from + digits_to_read; ++i) { - int digit = buffer[i] - '0'; - ASSERT(0 <= digit && digit <= 9); - result = result * 10 + digit; - } - return result; -} - - -void Bignum::AssignDecimalString(Vector value) { - // 2^64 = 18446744073709551616 > 10^19 - const int kMaxUint64DecimalDigits = 19; - Zero(); - int length = value.length(); - int pos = 0; - // Let's just say that each digit needs 4 bits. - while (length >= kMaxUint64DecimalDigits) { - uint64_t digits = ReadUInt64(value, pos, kMaxUint64DecimalDigits); - pos += kMaxUint64DecimalDigits; - length -= kMaxUint64DecimalDigits; - MultiplyByPowerOfTen(kMaxUint64DecimalDigits); - AddUInt64(digits); - } - uint64_t digits = ReadUInt64(value, pos, length); - MultiplyByPowerOfTen(length); - AddUInt64(digits); - Clamp(); -} - - -static int HexCharValue(char c) { - if ('0' <= c && c <= '9') return c - '0'; - if ('a' <= c && c <= 'f') return 10 + c - 'a'; - ASSERT('A' <= c && c <= 'F'); - return 10 + c - 'A'; -} - - -void Bignum::AssignHexString(Vector value) { - Zero(); - int length = value.length(); - - int needed_bigits = length * 4 / kBigitSize + 1; - EnsureCapacity(needed_bigits); - int string_index = length - 1; - for (int i = 0; i < needed_bigits - 1; ++i) { - // These bigits are guaranteed to be "full". - Chunk current_bigit = 0; - for (int j = 0; j < kBigitSize / 4; j++) { - current_bigit += HexCharValue(value[string_index--]) << (j * 4); - } - bigits_[i] = current_bigit; - } - used_digits_ = needed_bigits - 1; - - Chunk most_significant_bigit = 0; // Could be = 0; - for (int j = 0; j <= string_index; ++j) { - most_significant_bigit <<= 4; - most_significant_bigit += HexCharValue(value[j]); - } - if (most_significant_bigit != 0) { - bigits_[used_digits_] = most_significant_bigit; - used_digits_++; - } - Clamp(); -} - - -void Bignum::AddUInt64(uint64_t operand) { - if (operand == 0) return; - Bignum other; - other.AssignUInt64(operand); - AddBignum(other); -} - - -void Bignum::AddBignum(const Bignum& other) { - ASSERT(IsClamped()); - ASSERT(other.IsClamped()); - - // If this has a greater exponent than other append zero-bigits to this. - // After this call exponent_ <= other.exponent_. - Align(other); - - // There are two possibilities: - // aaaaaaaaaaa 0000 (where the 0s represent a's exponent) - // bbbbb 00000000 - // ---------------- - // ccccccccccc 0000 - // or - // aaaaaaaaaa 0000 - // bbbbbbbbb 0000000 - // ----------------- - // cccccccccccc 0000 - // In both cases we might need a carry bigit. - - EnsureCapacity(1 + Max(BigitLength(), other.BigitLength()) - exponent_); - Chunk carry = 0; - int bigit_pos = other.exponent_ - exponent_; - ASSERT(bigit_pos >= 0); - for (int i = 0; i < other.used_digits_; ++i) { - Chunk sum = bigits_[bigit_pos] + other.bigits_[i] + carry; - bigits_[bigit_pos] = sum & kBigitMask; - carry = sum >> kBigitSize; - bigit_pos++; - } - - while (carry != 0) { - Chunk sum = bigits_[bigit_pos] + carry; - bigits_[bigit_pos] = sum & kBigitMask; - carry = sum >> kBigitSize; - bigit_pos++; - } - used_digits_ = Max(bigit_pos, used_digits_); - ASSERT(IsClamped()); -} - - -void Bignum::SubtractBignum(const Bignum& other) { - ASSERT(IsClamped()); - ASSERT(other.IsClamped()); - // We require this to be bigger than other. - ASSERT(LessEqual(other, *this)); - - Align(other); - - int offset = other.exponent_ - exponent_; - Chunk borrow = 0; - int i; - for (i = 0; i < other.used_digits_; ++i) { - ASSERT((borrow == 0) || (borrow == 1)); - Chunk difference = bigits_[i + offset] - other.bigits_[i] - borrow; - bigits_[i + offset] = difference & kBigitMask; - borrow = difference >> (kChunkSize - 1); - } - while (borrow != 0) { - Chunk difference = bigits_[i + offset] - borrow; - bigits_[i + offset] = difference & kBigitMask; - borrow = difference >> (kChunkSize - 1); - ++i; - } - Clamp(); -} - - -void Bignum::ShiftLeft(int shift_amount) { - if (used_digits_ == 0) return; - exponent_ += shift_amount / kBigitSize; - int local_shift = shift_amount % kBigitSize; - EnsureCapacity(used_digits_ + 1); - BigitsShiftLeft(local_shift); -} - - -void Bignum::MultiplyByUInt32(uint32_t factor) { - if (factor == 1) return; - if (factor == 0) { - Zero(); - return; - } - if (used_digits_ == 0) return; - - // The product of a bigit with the factor is of size kBigitSize + 32. - // Assert that this number + 1 (for the carry) fits into double chunk. - ASSERT(kDoubleChunkSize >= kBigitSize + 32 + 1); - DoubleChunk carry = 0; - for (int i = 0; i < used_digits_; ++i) { - DoubleChunk product = static_cast(factor) * bigits_[i] + carry; - bigits_[i] = static_cast(product & kBigitMask); - carry = (product >> kBigitSize); - } - while (carry != 0) { - EnsureCapacity(used_digits_ + 1); - bigits_[used_digits_] = carry & kBigitMask; - used_digits_++; - carry >>= kBigitSize; - } -} - - -void Bignum::MultiplyByUInt64(uint64_t factor) { - if (factor == 1) return; - if (factor == 0) { - Zero(); - return; - } - ASSERT(kBigitSize < 32); - uint64_t carry = 0; - uint64_t low = factor & 0xFFFFFFFF; - uint64_t high = factor >> 32; - for (int i = 0; i < used_digits_; ++i) { - uint64_t product_low = low * bigits_[i]; - uint64_t product_high = high * bigits_[i]; - uint64_t tmp = (carry & kBigitMask) + product_low; - bigits_[i] = tmp & kBigitMask; - carry = (carry >> kBigitSize) + (tmp >> kBigitSize) + - (product_high << (32 - kBigitSize)); - } - while (carry != 0) { - EnsureCapacity(used_digits_ + 1); - bigits_[used_digits_] = carry & kBigitMask; - used_digits_++; - carry >>= kBigitSize; - } -} - - -void Bignum::MultiplyByPowerOfTen(int exponent) { - const uint64_t kFive27 = UINT64_2PART_C(0x6765c793, fa10079d); - const uint16_t kFive1 = 5; - const uint16_t kFive2 = kFive1 * 5; - const uint16_t kFive3 = kFive2 * 5; - const uint16_t kFive4 = kFive3 * 5; - const uint16_t kFive5 = kFive4 * 5; - const uint16_t kFive6 = kFive5 * 5; - const uint32_t kFive7 = kFive6 * 5; - const uint32_t kFive8 = kFive7 * 5; - const uint32_t kFive9 = kFive8 * 5; - const uint32_t kFive10 = kFive9 * 5; - const uint32_t kFive11 = kFive10 * 5; - const uint32_t kFive12 = kFive11 * 5; - const uint32_t kFive13 = kFive12 * 5; - const uint32_t kFive1_to_12[] = - { kFive1, kFive2, kFive3, kFive4, kFive5, kFive6, - kFive7, kFive8, kFive9, kFive10, kFive11, kFive12 }; - - ASSERT(exponent >= 0); - if (exponent == 0) return; - if (used_digits_ == 0) return; - - // We shift by exponent at the end just before returning. - int remaining_exponent = exponent; - while (remaining_exponent >= 27) { - MultiplyByUInt64(kFive27); - remaining_exponent -= 27; - } - while (remaining_exponent >= 13) { - MultiplyByUInt32(kFive13); - remaining_exponent -= 13; - } - if (remaining_exponent > 0) { - MultiplyByUInt32(kFive1_to_12[remaining_exponent - 1]); - } - ShiftLeft(exponent); -} - - -void Bignum::Square() { - ASSERT(IsClamped()); - int product_length = 2 * used_digits_; - EnsureCapacity(product_length); - - // Comba multiplication: compute each column separately. - // Example: r = a2a1a0 * b2b1b0. - // r = 1 * a0b0 + - // 10 * (a1b0 + a0b1) + - // 100 * (a2b0 + a1b1 + a0b2) + - // 1000 * (a2b1 + a1b2) + - // 10000 * a2b2 - // - // In the worst case we have to accumulate nb-digits products of digit*digit. - // - // Assert that the additional number of bits in a DoubleChunk are enough to - // sum up used_digits of Bigit*Bigit. - if ((1 << (2 * (kChunkSize - kBigitSize))) <= used_digits_) { - UNIMPLEMENTED(); - } - DoubleChunk accumulator = 0; - // First shift the digits so we don't overwrite them. - int copy_offset = used_digits_; - for (int i = 0; i < used_digits_; ++i) { - bigits_[copy_offset + i] = bigits_[i]; - } - // We have two loops to avoid some 'if's in the loop. - for (int i = 0; i < used_digits_; ++i) { - // Process temporary digit i with power i. - // The sum of the two indices must be equal to i. - int bigit_index1 = i; - int bigit_index2 = 0; - // Sum all of the sub-products. - while (bigit_index1 >= 0) { - Chunk chunk1 = bigits_[copy_offset + bigit_index1]; - Chunk chunk2 = bigits_[copy_offset + bigit_index2]; - accumulator += static_cast(chunk1) * chunk2; - bigit_index1--; - bigit_index2++; - } - bigits_[i] = static_cast(accumulator) & kBigitMask; - accumulator >>= kBigitSize; - } - for (int i = used_digits_; i < product_length; ++i) { - int bigit_index1 = used_digits_ - 1; - int bigit_index2 = i - bigit_index1; - // Invariant: sum of both indices is again equal to i. - // Inner loop runs 0 times on last iteration, emptying accumulator. - while (bigit_index2 < used_digits_) { - Chunk chunk1 = bigits_[copy_offset + bigit_index1]; - Chunk chunk2 = bigits_[copy_offset + bigit_index2]; - accumulator += static_cast(chunk1) * chunk2; - bigit_index1--; - bigit_index2++; - } - // The overwritten bigits_[i] will never be read in further loop iterations, - // because bigit_index1 and bigit_index2 are always greater - // than i - used_digits_. - bigits_[i] = static_cast(accumulator) & kBigitMask; - accumulator >>= kBigitSize; - } - // Since the result was guaranteed to lie inside the number the - // accumulator must be 0 now. - ASSERT(accumulator == 0); - - // Don't forget to update the used_digits and the exponent. - used_digits_ = product_length; - exponent_ *= 2; - Clamp(); -} - - -void Bignum::AssignPowerUInt16(uint16_t base, int power_exponent) { - ASSERT(base != 0); - ASSERT(power_exponent >= 0); - if (power_exponent == 0) { - AssignUInt16(1); - return; - } - Zero(); - int shifts = 0; - // We expect base to be in range 2-32, and most often to be 10. - // It does not make much sense to implement different algorithms for counting - // the bits. - while ((base & 1) == 0) { - base >>= 1; - shifts++; - } - int bit_size = 0; - int tmp_base = base; - while (tmp_base != 0) { - tmp_base >>= 1; - bit_size++; - } - int final_size = bit_size * power_exponent; - // 1 extra bigit for the shifting, and one for rounded final_size. - EnsureCapacity(final_size / kBigitSize + 2); - - // Left to Right exponentiation. - int mask = 1; - while (power_exponent >= mask) mask <<= 1; - - // The mask is now pointing to the bit above the most significant 1-bit of - // power_exponent. - // Get rid of first 1-bit; - mask >>= 2; - uint64_t this_value = base; - - bool delayed_multipliciation = false; - const uint64_t max_32bits = 0xFFFFFFFF; - while (mask != 0 && this_value <= max_32bits) { - this_value = this_value * this_value; - // Verify that there is enough space in this_value to perform the - // multiplication. The first bit_size bits must be 0. - if ((power_exponent & mask) != 0) { - uint64_t base_bits_mask = - ~((static_cast(1) << (64 - bit_size)) - 1); - bool high_bits_zero = (this_value & base_bits_mask) == 0; - if (high_bits_zero) { - this_value *= base; - } else { - delayed_multipliciation = true; - } - } - mask >>= 1; - } - AssignUInt64(this_value); - if (delayed_multipliciation) { - MultiplyByUInt32(base); - } - - // Now do the same thing as a bignum. - while (mask != 0) { - Square(); - if ((power_exponent & mask) != 0) { - MultiplyByUInt32(base); - } - mask >>= 1; - } - - // And finally add the saved shifts. - ShiftLeft(shifts * power_exponent); -} - - -// Precondition: this/other < 16bit. -uint16_t Bignum::DivideModuloIntBignum(const Bignum& other) { - ASSERT(IsClamped()); - ASSERT(other.IsClamped()); - ASSERT(other.used_digits_ > 0); - - // Easy case: if we have less digits than the divisor than the result is 0. - // Note: this handles the case where this == 0, too. - if (BigitLength() < other.BigitLength()) { - return 0; - } - - Align(other); - - uint16_t result = 0; - - // Start by removing multiples of 'other' until both numbers have the same - // number of digits. - while (BigitLength() > other.BigitLength()) { - // This naive approach is extremely inefficient if `this` divided by other - // is big. This function is implemented for doubleToString where - // the result should be small (less than 10). - ASSERT(other.bigits_[other.used_digits_ - 1] >= ((1 << kBigitSize) / 16)); - ASSERT(bigits_[used_digits_ - 1] < 0x10000); - // Remove the multiples of the first digit. - // Example this = 23 and other equals 9. -> Remove 2 multiples. - result += static_cast(bigits_[used_digits_ - 1]); - SubtractTimes(other, bigits_[used_digits_ - 1]); - } - - ASSERT(BigitLength() == other.BigitLength()); - - // Both bignums are at the same length now. - // Since other has more than 0 digits we know that the access to - // bigits_[used_digits_ - 1] is safe. - Chunk this_bigit = bigits_[used_digits_ - 1]; - Chunk other_bigit = other.bigits_[other.used_digits_ - 1]; - - if (other.used_digits_ == 1) { - // Shortcut for easy (and common) case. - int quotient = this_bigit / other_bigit; - bigits_[used_digits_ - 1] = this_bigit - other_bigit * quotient; - ASSERT(quotient < 0x10000); - result += static_cast(quotient); - Clamp(); - return result; - } - - int division_estimate = this_bigit / (other_bigit + 1); - ASSERT(division_estimate < 0x10000); - result += static_cast(division_estimate); - SubtractTimes(other, division_estimate); - - if (other_bigit * (division_estimate + 1) > this_bigit) { - // No need to even try to subtract. Even if other's remaining digits were 0 - // another subtraction would be too much. - return result; - } - - while (LessEqual(other, *this)) { - SubtractBignum(other); - result++; - } - return result; -} - - -template -static int SizeInHexChars(S number) { - ASSERT(number > 0); - int result = 0; - while (number != 0) { - number >>= 4; - result++; - } - return result; -} - - -static char HexCharOfValue(int value) { - ASSERT(0 <= value && value <= 16); - if (value < 10) return static_cast(value + '0'); - return static_cast(value - 10 + 'A'); -} - - -bool Bignum::ToHexString(char* buffer, int buffer_size) const { - ASSERT(IsClamped()); - // Each bigit must be printable as separate hex-character. - ASSERT(kBigitSize % 4 == 0); - const int kHexCharsPerBigit = kBigitSize / 4; - - if (used_digits_ == 0) { - if (buffer_size < 2) return false; - buffer[0] = '0'; - buffer[1] = '\0'; - return true; - } - // We add 1 for the terminating '\0' character. - int needed_chars = (BigitLength() - 1) * kHexCharsPerBigit + - SizeInHexChars(bigits_[used_digits_ - 1]) + 1; - if (needed_chars > buffer_size) return false; - int string_index = needed_chars - 1; - buffer[string_index--] = '\0'; - for (int i = 0; i < exponent_; ++i) { - for (int j = 0; j < kHexCharsPerBigit; ++j) { - buffer[string_index--] = '0'; - } - } - for (int i = 0; i < used_digits_ - 1; ++i) { - Chunk current_bigit = bigits_[i]; - for (int j = 0; j < kHexCharsPerBigit; ++j) { - buffer[string_index--] = HexCharOfValue(current_bigit & 0xF); - current_bigit >>= 4; - } - } - // And finally the last bigit. - Chunk most_significant_bigit = bigits_[used_digits_ - 1]; - while (most_significant_bigit != 0) { - buffer[string_index--] = HexCharOfValue(most_significant_bigit & 0xF); - most_significant_bigit >>= 4; - } - return true; -} - - -Bignum::Chunk Bignum::BigitAt(int index) const { - if (index >= BigitLength()) return 0; - if (index < exponent_) return 0; - return bigits_[index - exponent_]; -} - - -int Bignum::Compare(const Bignum& a, const Bignum& b) { - ASSERT(a.IsClamped()); - ASSERT(b.IsClamped()); - int bigit_length_a = a.BigitLength(); - int bigit_length_b = b.BigitLength(); - if (bigit_length_a < bigit_length_b) return -1; - if (bigit_length_a > bigit_length_b) return +1; - for (int i = bigit_length_a - 1; i >= Min(a.exponent_, b.exponent_); --i) { - Chunk bigit_a = a.BigitAt(i); - Chunk bigit_b = b.BigitAt(i); - if (bigit_a < bigit_b) return -1; - if (bigit_a > bigit_b) return +1; - // Otherwise they are equal up to this digit. Try the next digit. - } - return 0; -} - - -int Bignum::PlusCompare(const Bignum& a, const Bignum& b, const Bignum& c) { - ASSERT(a.IsClamped()); - ASSERT(b.IsClamped()); - ASSERT(c.IsClamped()); - if (a.BigitLength() < b.BigitLength()) { - return PlusCompare(b, a, c); - } - if (a.BigitLength() + 1 < c.BigitLength()) return -1; - if (a.BigitLength() > c.BigitLength()) return +1; - // The exponent encodes 0-bigits. So if there are more 0-digits in 'a' than - // 'b' has digits, then the bigit-length of 'a'+'b' must be equal to the one - // of 'a'. - if (a.exponent_ >= b.BigitLength() && a.BigitLength() < c.BigitLength()) { - return -1; - } - - Chunk borrow = 0; - // Starting at min_exponent all digits are == 0. So no need to compare them. - int min_exponent = Min(Min(a.exponent_, b.exponent_), c.exponent_); - for (int i = c.BigitLength() - 1; i >= min_exponent; --i) { - Chunk chunk_a = a.BigitAt(i); - Chunk chunk_b = b.BigitAt(i); - Chunk chunk_c = c.BigitAt(i); - Chunk sum = chunk_a + chunk_b; - if (sum > chunk_c + borrow) { - return +1; - } else { - borrow = chunk_c + borrow - sum; - if (borrow > 1) return -1; - borrow <<= kBigitSize; - } - } - if (borrow == 0) return 0; - return -1; -} - - -void Bignum::Clamp() { - while (used_digits_ > 0 && bigits_[used_digits_ - 1] == 0) { - used_digits_--; - } - if (used_digits_ == 0) { - // Zero. - exponent_ = 0; - } -} - - -bool Bignum::IsClamped() const { - return used_digits_ == 0 || bigits_[used_digits_ - 1] != 0; -} - - -void Bignum::Zero() { - for (int i = 0; i < used_digits_; ++i) { - bigits_[i] = 0; - } - used_digits_ = 0; - exponent_ = 0; -} - - -void Bignum::Align(const Bignum& other) { - if (exponent_ > other.exponent_) { - // If "X" represents a "hidden" digit (by the exponent) then we are in the - // following case (a == this, b == other): - // a: aaaaaaXXXX or a: aaaaaXXX - // b: bbbbbbX b: bbbbbbbbXX - // We replace some of the hidden digits (X) of a with 0 digits. - // a: aaaaaa000X or a: aaaaa0XX - int zero_digits = exponent_ - other.exponent_; - EnsureCapacity(used_digits_ + zero_digits); - for (int i = used_digits_ - 1; i >= 0; --i) { - bigits_[i + zero_digits] = bigits_[i]; - } - for (int i = 0; i < zero_digits; ++i) { - bigits_[i] = 0; - } - used_digits_ += zero_digits; - exponent_ -= zero_digits; - ASSERT(used_digits_ >= 0); - ASSERT(exponent_ >= 0); - } -} - - -void Bignum::BigitsShiftLeft(int shift_amount) { - ASSERT(shift_amount < kBigitSize); - ASSERT(shift_amount >= 0); - Chunk carry = 0; - for (int i = 0; i < used_digits_; ++i) { - Chunk new_carry = bigits_[i] >> (kBigitSize - shift_amount); - bigits_[i] = ((bigits_[i] << shift_amount) + carry) & kBigitMask; - carry = new_carry; - } - if (carry != 0) { - bigits_[used_digits_] = carry; - used_digits_++; - } -} - - -void Bignum::SubtractTimes(const Bignum& other, int factor) { - ASSERT(exponent_ <= other.exponent_); - if (factor < 3) { - for (int i = 0; i < factor; ++i) { - SubtractBignum(other); - } - return; - } - Chunk borrow = 0; - int exponent_diff = other.exponent_ - exponent_; - for (int i = 0; i < other.used_digits_; ++i) { - DoubleChunk product = static_cast(factor) * other.bigits_[i]; - DoubleChunk remove = borrow + product; - Chunk difference = bigits_[i + exponent_diff] - (remove & kBigitMask); - bigits_[i + exponent_diff] = difference & kBigitMask; - borrow = static_cast((difference >> (kChunkSize - 1)) + - (remove >> kBigitSize)); - } - for (int i = other.used_digits_ + exponent_diff; i < used_digits_; ++i) { - if (borrow == 0) return; - Chunk difference = bigits_[i] - borrow; - bigits_[i] = difference & kBigitMask; - borrow = difference >> (kChunkSize - 1); - } - Clamp(); -} - - -} // namespace double_conversion diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/bignum.h b/ios/Pods/Flipper-DoubleConversion/double-conversion/bignum.h deleted file mode 100644 index 5ec3544..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/bignum.h +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_BIGNUM_H_ -#define DOUBLE_CONVERSION_BIGNUM_H_ - -#include "utils.h" - -namespace double_conversion { - -class Bignum { - public: - // 3584 = 128 * 28. We can represent 2^3584 > 10^1000 accurately. - // This bignum can encode much bigger numbers, since it contains an - // exponent. - static const int kMaxSignificantBits = 3584; - - Bignum(); - void AssignUInt16(uint16_t value); - void AssignUInt64(uint64_t value); - void AssignBignum(const Bignum& other); - - void AssignDecimalString(Vector value); - void AssignHexString(Vector value); - - void AssignPowerUInt16(uint16_t base, int exponent); - - void AddUInt16(uint16_t operand); - void AddUInt64(uint64_t operand); - void AddBignum(const Bignum& other); - // Precondition: this >= other. - void SubtractBignum(const Bignum& other); - - void Square(); - void ShiftLeft(int shift_amount); - void MultiplyByUInt32(uint32_t factor); - void MultiplyByUInt64(uint64_t factor); - void MultiplyByPowerOfTen(int exponent); - void Times10() { return MultiplyByUInt32(10); } - // Pseudocode: - // int result = this / other; - // this = this % other; - // In the worst case this function is in O(this/other). - uint16_t DivideModuloIntBignum(const Bignum& other); - - bool ToHexString(char* buffer, int buffer_size) const; - - // Returns - // -1 if a < b, - // 0 if a == b, and - // +1 if a > b. - static int Compare(const Bignum& a, const Bignum& b); - static bool Equal(const Bignum& a, const Bignum& b) { - return Compare(a, b) == 0; - } - static bool LessEqual(const Bignum& a, const Bignum& b) { - return Compare(a, b) <= 0; - } - static bool Less(const Bignum& a, const Bignum& b) { - return Compare(a, b) < 0; - } - // Returns Compare(a + b, c); - static int PlusCompare(const Bignum& a, const Bignum& b, const Bignum& c); - // Returns a + b == c - static bool PlusEqual(const Bignum& a, const Bignum& b, const Bignum& c) { - return PlusCompare(a, b, c) == 0; - } - // Returns a + b <= c - static bool PlusLessEqual(const Bignum& a, const Bignum& b, const Bignum& c) { - return PlusCompare(a, b, c) <= 0; - } - // Returns a + b < c - static bool PlusLess(const Bignum& a, const Bignum& b, const Bignum& c) { - return PlusCompare(a, b, c) < 0; - } - private: - typedef uint32_t Chunk; - typedef uint64_t DoubleChunk; - - static const int kChunkSize = sizeof(Chunk) * 8; - static const int kDoubleChunkSize = sizeof(DoubleChunk) * 8; - // With bigit size of 28 we loose some bits, but a double still fits easily - // into two chunks, and more importantly we can use the Comba multiplication. - static const int kBigitSize = 28; - static const Chunk kBigitMask = (1 << kBigitSize) - 1; - // Every instance allocates kBigitLength chunks on the stack. Bignums cannot - // grow. There are no checks if the stack-allocated space is sufficient. - static const int kBigitCapacity = kMaxSignificantBits / kBigitSize; - - void EnsureCapacity(int size) { - if (size > kBigitCapacity) { - UNREACHABLE(); - } - } - void Align(const Bignum& other); - void Clamp(); - bool IsClamped() const; - void Zero(); - // Requires this to have enough capacity (no tests done). - // Updates used_digits_ if necessary. - // shift_amount must be < kBigitSize. - void BigitsShiftLeft(int shift_amount); - // BigitLength includes the "hidden" digits encoded in the exponent. - int BigitLength() const { return used_digits_ + exponent_; } - Chunk BigitAt(int index) const; - void SubtractTimes(const Bignum& other, int factor); - - Chunk bigits_buffer_[kBigitCapacity]; - // A vector backed by bigits_buffer_. This way accesses to the array are - // checked for out-of-bounds errors. - Vector bigits_; - int used_digits_; - // The Bignum's value equals value(bigits_) * 2^(exponent_ * kBigitSize). - int exponent_; - - DISALLOW_COPY_AND_ASSIGN(Bignum); -}; - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_BIGNUM_H_ diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/cached-powers.cc b/ios/Pods/Flipper-DoubleConversion/double-conversion/cached-powers.cc deleted file mode 100644 index d1359ff..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/cached-powers.cc +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright 2006-2008 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include -#include -#include - -#include "utils.h" - -#include "cached-powers.h" - -namespace double_conversion { - -struct CachedPower { - uint64_t significand; - int16_t binary_exponent; - int16_t decimal_exponent; -}; - -static const CachedPower kCachedPowers[] = { - {UINT64_2PART_C(0xfa8fd5a0, 081c0288), -1220, -348}, - {UINT64_2PART_C(0xbaaee17f, a23ebf76), -1193, -340}, - {UINT64_2PART_C(0x8b16fb20, 3055ac76), -1166, -332}, - {UINT64_2PART_C(0xcf42894a, 5dce35ea), -1140, -324}, - {UINT64_2PART_C(0x9a6bb0aa, 55653b2d), -1113, -316}, - {UINT64_2PART_C(0xe61acf03, 3d1a45df), -1087, -308}, - {UINT64_2PART_C(0xab70fe17, c79ac6ca), -1060, -300}, - {UINT64_2PART_C(0xff77b1fc, bebcdc4f), -1034, -292}, - {UINT64_2PART_C(0xbe5691ef, 416bd60c), -1007, -284}, - {UINT64_2PART_C(0x8dd01fad, 907ffc3c), -980, -276}, - {UINT64_2PART_C(0xd3515c28, 31559a83), -954, -268}, - {UINT64_2PART_C(0x9d71ac8f, ada6c9b5), -927, -260}, - {UINT64_2PART_C(0xea9c2277, 23ee8bcb), -901, -252}, - {UINT64_2PART_C(0xaecc4991, 4078536d), -874, -244}, - {UINT64_2PART_C(0x823c1279, 5db6ce57), -847, -236}, - {UINT64_2PART_C(0xc2109436, 4dfb5637), -821, -228}, - {UINT64_2PART_C(0x9096ea6f, 3848984f), -794, -220}, - {UINT64_2PART_C(0xd77485cb, 25823ac7), -768, -212}, - {UINT64_2PART_C(0xa086cfcd, 97bf97f4), -741, -204}, - {UINT64_2PART_C(0xef340a98, 172aace5), -715, -196}, - {UINT64_2PART_C(0xb23867fb, 2a35b28e), -688, -188}, - {UINT64_2PART_C(0x84c8d4df, d2c63f3b), -661, -180}, - {UINT64_2PART_C(0xc5dd4427, 1ad3cdba), -635, -172}, - {UINT64_2PART_C(0x936b9fce, bb25c996), -608, -164}, - {UINT64_2PART_C(0xdbac6c24, 7d62a584), -582, -156}, - {UINT64_2PART_C(0xa3ab6658, 0d5fdaf6), -555, -148}, - {UINT64_2PART_C(0xf3e2f893, dec3f126), -529, -140}, - {UINT64_2PART_C(0xb5b5ada8, aaff80b8), -502, -132}, - {UINT64_2PART_C(0x87625f05, 6c7c4a8b), -475, -124}, - {UINT64_2PART_C(0xc9bcff60, 34c13053), -449, -116}, - {UINT64_2PART_C(0x964e858c, 91ba2655), -422, -108}, - {UINT64_2PART_C(0xdff97724, 70297ebd), -396, -100}, - {UINT64_2PART_C(0xa6dfbd9f, b8e5b88f), -369, -92}, - {UINT64_2PART_C(0xf8a95fcf, 88747d94), -343, -84}, - {UINT64_2PART_C(0xb9447093, 8fa89bcf), -316, -76}, - {UINT64_2PART_C(0x8a08f0f8, bf0f156b), -289, -68}, - {UINT64_2PART_C(0xcdb02555, 653131b6), -263, -60}, - {UINT64_2PART_C(0x993fe2c6, d07b7fac), -236, -52}, - {UINT64_2PART_C(0xe45c10c4, 2a2b3b06), -210, -44}, - {UINT64_2PART_C(0xaa242499, 697392d3), -183, -36}, - {UINT64_2PART_C(0xfd87b5f2, 8300ca0e), -157, -28}, - {UINT64_2PART_C(0xbce50864, 92111aeb), -130, -20}, - {UINT64_2PART_C(0x8cbccc09, 6f5088cc), -103, -12}, - {UINT64_2PART_C(0xd1b71758, e219652c), -77, -4}, - {UINT64_2PART_C(0x9c400000, 00000000), -50, 4}, - {UINT64_2PART_C(0xe8d4a510, 00000000), -24, 12}, - {UINT64_2PART_C(0xad78ebc5, ac620000), 3, 20}, - {UINT64_2PART_C(0x813f3978, f8940984), 30, 28}, - {UINT64_2PART_C(0xc097ce7b, c90715b3), 56, 36}, - {UINT64_2PART_C(0x8f7e32ce, 7bea5c70), 83, 44}, - {UINT64_2PART_C(0xd5d238a4, abe98068), 109, 52}, - {UINT64_2PART_C(0x9f4f2726, 179a2245), 136, 60}, - {UINT64_2PART_C(0xed63a231, d4c4fb27), 162, 68}, - {UINT64_2PART_C(0xb0de6538, 8cc8ada8), 189, 76}, - {UINT64_2PART_C(0x83c7088e, 1aab65db), 216, 84}, - {UINT64_2PART_C(0xc45d1df9, 42711d9a), 242, 92}, - {UINT64_2PART_C(0x924d692c, a61be758), 269, 100}, - {UINT64_2PART_C(0xda01ee64, 1a708dea), 295, 108}, - {UINT64_2PART_C(0xa26da399, 9aef774a), 322, 116}, - {UINT64_2PART_C(0xf209787b, b47d6b85), 348, 124}, - {UINT64_2PART_C(0xb454e4a1, 79dd1877), 375, 132}, - {UINT64_2PART_C(0x865b8692, 5b9bc5c2), 402, 140}, - {UINT64_2PART_C(0xc83553c5, c8965d3d), 428, 148}, - {UINT64_2PART_C(0x952ab45c, fa97a0b3), 455, 156}, - {UINT64_2PART_C(0xde469fbd, 99a05fe3), 481, 164}, - {UINT64_2PART_C(0xa59bc234, db398c25), 508, 172}, - {UINT64_2PART_C(0xf6c69a72, a3989f5c), 534, 180}, - {UINT64_2PART_C(0xb7dcbf53, 54e9bece), 561, 188}, - {UINT64_2PART_C(0x88fcf317, f22241e2), 588, 196}, - {UINT64_2PART_C(0xcc20ce9b, d35c78a5), 614, 204}, - {UINT64_2PART_C(0x98165af3, 7b2153df), 641, 212}, - {UINT64_2PART_C(0xe2a0b5dc, 971f303a), 667, 220}, - {UINT64_2PART_C(0xa8d9d153, 5ce3b396), 694, 228}, - {UINT64_2PART_C(0xfb9b7cd9, a4a7443c), 720, 236}, - {UINT64_2PART_C(0xbb764c4c, a7a44410), 747, 244}, - {UINT64_2PART_C(0x8bab8eef, b6409c1a), 774, 252}, - {UINT64_2PART_C(0xd01fef10, a657842c), 800, 260}, - {UINT64_2PART_C(0x9b10a4e5, e9913129), 827, 268}, - {UINT64_2PART_C(0xe7109bfb, a19c0c9d), 853, 276}, - {UINT64_2PART_C(0xac2820d9, 623bf429), 880, 284}, - {UINT64_2PART_C(0x80444b5e, 7aa7cf85), 907, 292}, - {UINT64_2PART_C(0xbf21e440, 03acdd2d), 933, 300}, - {UINT64_2PART_C(0x8e679c2f, 5e44ff8f), 960, 308}, - {UINT64_2PART_C(0xd433179d, 9c8cb841), 986, 316}, - {UINT64_2PART_C(0x9e19db92, b4e31ba9), 1013, 324}, - {UINT64_2PART_C(0xeb96bf6e, badf77d9), 1039, 332}, - {UINT64_2PART_C(0xaf87023b, 9bf0ee6b), 1066, 340}, -}; - -static const int kCachedPowersLength = ARRAY_SIZE(kCachedPowers); -static const int kCachedPowersOffset = 348; // -1 * the first decimal_exponent. -static const double kD_1_LOG2_10 = 0.30102999566398114; // 1 / lg(10) -// Difference between the decimal exponents in the table above. -const int PowersOfTenCache::kDecimalExponentDistance = 8; -const int PowersOfTenCache::kMinDecimalExponent = -348; -const int PowersOfTenCache::kMaxDecimalExponent = 340; - -void PowersOfTenCache::GetCachedPowerForBinaryExponentRange( - int min_exponent, - int max_exponent, - DiyFp* power, - int* decimal_exponent) { - int kQ = DiyFp::kSignificandSize; - double k = ceil((min_exponent + kQ - 1) * kD_1_LOG2_10); - int foo = kCachedPowersOffset; - int index = - (foo + static_cast(k) - 1) / kDecimalExponentDistance + 1; - ASSERT(0 <= index && index < kCachedPowersLength); - CachedPower cached_power = kCachedPowers[index]; - ASSERT(min_exponent <= cached_power.binary_exponent); - (void) max_exponent; // Mark variable as used. - ASSERT(cached_power.binary_exponent <= max_exponent); - *decimal_exponent = cached_power.decimal_exponent; - *power = DiyFp(cached_power.significand, cached_power.binary_exponent); -} - - -void PowersOfTenCache::GetCachedPowerForDecimalExponent(int requested_exponent, - DiyFp* power, - int* found_exponent) { - ASSERT(kMinDecimalExponent <= requested_exponent); - ASSERT(requested_exponent < kMaxDecimalExponent + kDecimalExponentDistance); - int index = - (requested_exponent + kCachedPowersOffset) / kDecimalExponentDistance; - CachedPower cached_power = kCachedPowers[index]; - *power = DiyFp(cached_power.significand, cached_power.binary_exponent); - *found_exponent = cached_power.decimal_exponent; - ASSERT(*found_exponent <= requested_exponent); - ASSERT(requested_exponent < *found_exponent + kDecimalExponentDistance); -} - -} // namespace double_conversion diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/cached-powers.h b/ios/Pods/Flipper-DoubleConversion/double-conversion/cached-powers.h deleted file mode 100644 index 61a5061..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/cached-powers.h +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_CACHED_POWERS_H_ -#define DOUBLE_CONVERSION_CACHED_POWERS_H_ - -#include "diy-fp.h" - -namespace double_conversion { - -class PowersOfTenCache { - public: - - // Not all powers of ten are cached. The decimal exponent of two neighboring - // cached numbers will differ by kDecimalExponentDistance. - static const int kDecimalExponentDistance; - - static const int kMinDecimalExponent; - static const int kMaxDecimalExponent; - - // Returns a cached power-of-ten with a binary exponent in the range - // [min_exponent; max_exponent] (boundaries included). - static void GetCachedPowerForBinaryExponentRange(int min_exponent, - int max_exponent, - DiyFp* power, - int* decimal_exponent); - - // Returns a cached power of ten x ~= 10^k such that - // k <= decimal_exponent < k + kCachedPowersDecimalDistance. - // The given decimal_exponent must satisfy - // kMinDecimalExponent <= requested_exponent, and - // requested_exponent < kMaxDecimalExponent + kDecimalExponentDistance. - static void GetCachedPowerForDecimalExponent(int requested_exponent, - DiyFp* power, - int* found_exponent); -}; - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_CACHED_POWERS_H_ diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/diy-fp.cc b/ios/Pods/Flipper-DoubleConversion/double-conversion/diy-fp.cc deleted file mode 100644 index ddd1891..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/diy-fp.cc +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#include "diy-fp.h" -#include "utils.h" - -namespace double_conversion { - -void DiyFp::Multiply(const DiyFp& other) { - // Simply "emulates" a 128 bit multiplication. - // However: the resulting number only contains 64 bits. The least - // significant 64 bits are only used for rounding the most significant 64 - // bits. - const uint64_t kM32 = 0xFFFFFFFFU; - uint64_t a = f_ >> 32; - uint64_t b = f_ & kM32; - uint64_t c = other.f_ >> 32; - uint64_t d = other.f_ & kM32; - uint64_t ac = a * c; - uint64_t bc = b * c; - uint64_t ad = a * d; - uint64_t bd = b * d; - uint64_t tmp = (bd >> 32) + (ad & kM32) + (bc & kM32); - // By adding 1U << 31 to tmp we round the final result. - // Halfway cases will be round up. - tmp += 1U << 31; - uint64_t result_f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32); - e_ += other.e_ + 64; - f_ = result_f; -} - -} // namespace double_conversion diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/diy-fp.h b/ios/Pods/Flipper-DoubleConversion/double-conversion/diy-fp.h deleted file mode 100644 index 9dcf8fb..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/diy-fp.h +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_DIY_FP_H_ -#define DOUBLE_CONVERSION_DIY_FP_H_ - -#include "utils.h" - -namespace double_conversion { - -// This "Do It Yourself Floating Point" class implements a floating-point number -// with a uint64 significand and an int exponent. Normalized DiyFp numbers will -// have the most significant bit of the significand set. -// Multiplication and Subtraction do not normalize their results. -// DiyFp are not designed to contain special doubles (NaN and Infinity). -class DiyFp { - public: - static const int kSignificandSize = 64; - - DiyFp() : f_(0), e_(0) {} - DiyFp(uint64_t f, int e) : f_(f), e_(e) {} - - // this = this - other. - // The exponents of both numbers must be the same and the significand of this - // must be bigger than the significand of other. - // The result will not be normalized. - void Subtract(const DiyFp& other) { - ASSERT(e_ == other.e_); - ASSERT(f_ >= other.f_); - f_ -= other.f_; - } - - // Returns a - b. - // The exponents of both numbers must be the same and this must be bigger - // than other. The result will not be normalized. - static DiyFp Minus(const DiyFp& a, const DiyFp& b) { - DiyFp result = a; - result.Subtract(b); - return result; - } - - - // this = this * other. - void Multiply(const DiyFp& other); - - // returns a * b; - static DiyFp Times(const DiyFp& a, const DiyFp& b) { - DiyFp result = a; - result.Multiply(b); - return result; - } - - void Normalize() { - ASSERT(f_ != 0); - uint64_t f = f_; - int e = e_; - - // This method is mainly called for normalizing boundaries. In general - // boundaries need to be shifted by 10 bits. We thus optimize for this case. - const uint64_t k10MSBits = UINT64_2PART_C(0xFFC00000, 00000000); - while ((f & k10MSBits) == 0) { - f <<= 10; - e -= 10; - } - while ((f & kUint64MSB) == 0) { - f <<= 1; - e--; - } - f_ = f; - e_ = e; - } - - static DiyFp Normalize(const DiyFp& a) { - DiyFp result = a; - result.Normalize(); - return result; - } - - uint64_t f() const { return f_; } - int e() const { return e_; } - - void set_f(uint64_t new_value) { f_ = new_value; } - void set_e(int new_value) { e_ = new_value; } - - private: - static const uint64_t kUint64MSB = UINT64_2PART_C(0x80000000, 00000000); - - uint64_t f_; - int e_; -}; - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_DIY_FP_H_ diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/double-conversion.cc b/ios/Pods/Flipper-DoubleConversion/double-conversion/double-conversion.cc deleted file mode 100644 index db3feec..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/double-conversion.cc +++ /dev/null @@ -1,910 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include -#include - -#include "double-conversion.h" - -#include "bignum-dtoa.h" -#include "fast-dtoa.h" -#include "fixed-dtoa.h" -#include "ieee.h" -#include "strtod.h" -#include "utils.h" - -namespace double_conversion { - -const DoubleToStringConverter& DoubleToStringConverter::EcmaScriptConverter() { - int flags = UNIQUE_ZERO | EMIT_POSITIVE_EXPONENT_SIGN; - static DoubleToStringConverter converter(flags, - "Infinity", - "NaN", - 'e', - -6, 21, - 6, 0); - return converter; -} - - -bool DoubleToStringConverter::HandleSpecialValues( - double value, - StringBuilder* result_builder) const { - Double double_inspect(value); - if (double_inspect.IsInfinite()) { - if (infinity_symbol_ == NULL) return false; - if (value < 0) { - result_builder->AddCharacter('-'); - } - result_builder->AddString(infinity_symbol_); - return true; - } - if (double_inspect.IsNan()) { - if (nan_symbol_ == NULL) return false; - result_builder->AddString(nan_symbol_); - return true; - } - return false; -} - - -void DoubleToStringConverter::CreateExponentialRepresentation( - const char* decimal_digits, - int length, - int exponent, - StringBuilder* result_builder) const { - ASSERT(length != 0); - result_builder->AddCharacter(decimal_digits[0]); - if (length != 1) { - result_builder->AddCharacter('.'); - result_builder->AddSubstring(&decimal_digits[1], length-1); - } - result_builder->AddCharacter(exponent_character_); - if (exponent < 0) { - result_builder->AddCharacter('-'); - exponent = -exponent; - } else { - if ((flags_ & EMIT_POSITIVE_EXPONENT_SIGN) != 0) { - result_builder->AddCharacter('+'); - } - } - if (exponent == 0) { - result_builder->AddCharacter('0'); - return; - } - ASSERT(exponent < 1e4); - const int kMaxExponentLength = 5; - char buffer[kMaxExponentLength + 1]; - buffer[kMaxExponentLength] = '\0'; - int first_char_pos = kMaxExponentLength; - while (exponent > 0) { - buffer[--first_char_pos] = '0' + (exponent % 10); - exponent /= 10; - } - result_builder->AddSubstring(&buffer[first_char_pos], - kMaxExponentLength - first_char_pos); -} - - -void DoubleToStringConverter::CreateDecimalRepresentation( - const char* decimal_digits, - int length, - int decimal_point, - int digits_after_point, - StringBuilder* result_builder) const { - // Create a representation that is padded with zeros if needed. - if (decimal_point <= 0) { - // "0.00000decimal_rep". - result_builder->AddCharacter('0'); - if (digits_after_point > 0) { - result_builder->AddCharacter('.'); - result_builder->AddPadding('0', -decimal_point); - ASSERT(length <= digits_after_point - (-decimal_point)); - result_builder->AddSubstring(decimal_digits, length); - int remaining_digits = digits_after_point - (-decimal_point) - length; - result_builder->AddPadding('0', remaining_digits); - } - } else if (decimal_point >= length) { - // "decimal_rep0000.00000" or "decimal_rep.0000" - result_builder->AddSubstring(decimal_digits, length); - result_builder->AddPadding('0', decimal_point - length); - if (digits_after_point > 0) { - result_builder->AddCharacter('.'); - result_builder->AddPadding('0', digits_after_point); - } - } else { - // "decima.l_rep000" - ASSERT(digits_after_point > 0); - result_builder->AddSubstring(decimal_digits, decimal_point); - result_builder->AddCharacter('.'); - ASSERT(length - decimal_point <= digits_after_point); - result_builder->AddSubstring(&decimal_digits[decimal_point], - length - decimal_point); - int remaining_digits = digits_after_point - (length - decimal_point); - result_builder->AddPadding('0', remaining_digits); - } - if (digits_after_point == 0) { - if ((flags_ & EMIT_TRAILING_DECIMAL_POINT) != 0) { - result_builder->AddCharacter('.'); - } - if ((flags_ & EMIT_TRAILING_ZERO_AFTER_POINT) != 0) { - result_builder->AddCharacter('0'); - } - } -} - - -bool DoubleToStringConverter::ToShortestIeeeNumber( - double value, - StringBuilder* result_builder, - DoubleToStringConverter::DtoaMode mode) const { - ASSERT(mode == SHORTEST || mode == SHORTEST_SINGLE); - if (Double(value).IsSpecial()) { - return HandleSpecialValues(value, result_builder); - } - - int decimal_point; - bool sign; - const int kDecimalRepCapacity = kBase10MaximalLength + 1; - char decimal_rep[kDecimalRepCapacity]; - int decimal_rep_length; - - DoubleToAscii(value, mode, 0, decimal_rep, kDecimalRepCapacity, - &sign, &decimal_rep_length, &decimal_point); - - bool unique_zero = (flags_ & UNIQUE_ZERO) != 0; - if (sign && (value != 0.0 || !unique_zero)) { - result_builder->AddCharacter('-'); - } - - int exponent = decimal_point - 1; - if ((decimal_in_shortest_low_ <= exponent) && - (exponent < decimal_in_shortest_high_)) { - CreateDecimalRepresentation(decimal_rep, decimal_rep_length, - decimal_point, - Max(0, decimal_rep_length - decimal_point), - result_builder); - } else { - CreateExponentialRepresentation(decimal_rep, decimal_rep_length, exponent, - result_builder); - } - return true; -} - - -bool DoubleToStringConverter::ToFixed(double value, - int requested_digits, - StringBuilder* result_builder) const { - ASSERT(kMaxFixedDigitsBeforePoint == 60); - const double kFirstNonFixed = 1e60; - - if (Double(value).IsSpecial()) { - return HandleSpecialValues(value, result_builder); - } - - if (requested_digits > kMaxFixedDigitsAfterPoint) return false; - if (value >= kFirstNonFixed || value <= -kFirstNonFixed) return false; - - // Find a sufficiently precise decimal representation of n. - int decimal_point; - bool sign; - // Add space for the '\0' byte. - const int kDecimalRepCapacity = - kMaxFixedDigitsBeforePoint + kMaxFixedDigitsAfterPoint + 1; - char decimal_rep[kDecimalRepCapacity]; - int decimal_rep_length; - DoubleToAscii(value, FIXED, requested_digits, - decimal_rep, kDecimalRepCapacity, - &sign, &decimal_rep_length, &decimal_point); - - bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0); - if (sign && (value != 0.0 || !unique_zero)) { - result_builder->AddCharacter('-'); - } - - CreateDecimalRepresentation(decimal_rep, decimal_rep_length, decimal_point, - requested_digits, result_builder); - return true; -} - - -bool DoubleToStringConverter::ToExponential( - double value, - int requested_digits, - StringBuilder* result_builder) const { - if (Double(value).IsSpecial()) { - return HandleSpecialValues(value, result_builder); - } - - if (requested_digits < -1) return false; - if (requested_digits > kMaxExponentialDigits) return false; - - int decimal_point; - bool sign; - // Add space for digit before the decimal point and the '\0' character. - const int kDecimalRepCapacity = kMaxExponentialDigits + 2; - ASSERT(kDecimalRepCapacity > kBase10MaximalLength); - char decimal_rep[kDecimalRepCapacity]; - int decimal_rep_length; - - if (requested_digits == -1) { - DoubleToAscii(value, SHORTEST, 0, - decimal_rep, kDecimalRepCapacity, - &sign, &decimal_rep_length, &decimal_point); - } else { - DoubleToAscii(value, PRECISION, requested_digits + 1, - decimal_rep, kDecimalRepCapacity, - &sign, &decimal_rep_length, &decimal_point); - ASSERT(decimal_rep_length <= requested_digits + 1); - - for (int i = decimal_rep_length; i < requested_digits + 1; ++i) { - decimal_rep[i] = '0'; - } - decimal_rep_length = requested_digits + 1; - } - - bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0); - if (sign && (value != 0.0 || !unique_zero)) { - result_builder->AddCharacter('-'); - } - - int exponent = decimal_point - 1; - CreateExponentialRepresentation(decimal_rep, - decimal_rep_length, - exponent, - result_builder); - return true; -} - - -bool DoubleToStringConverter::ToPrecision(double value, - int precision, - StringBuilder* result_builder) const { - if (Double(value).IsSpecial()) { - return HandleSpecialValues(value, result_builder); - } - - if (precision < kMinPrecisionDigits || precision > kMaxPrecisionDigits) { - return false; - } - - // Find a sufficiently precise decimal representation of n. - int decimal_point; - bool sign; - // Add one for the terminating null character. - const int kDecimalRepCapacity = kMaxPrecisionDigits + 1; - char decimal_rep[kDecimalRepCapacity]; - int decimal_rep_length; - - DoubleToAscii(value, PRECISION, precision, - decimal_rep, kDecimalRepCapacity, - &sign, &decimal_rep_length, &decimal_point); - ASSERT(decimal_rep_length <= precision); - - bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0); - if (sign && (value != 0.0 || !unique_zero)) { - result_builder->AddCharacter('-'); - } - - // The exponent if we print the number as x.xxeyyy. That is with the - // decimal point after the first digit. - int exponent = decimal_point - 1; - - int extra_zero = ((flags_ & EMIT_TRAILING_ZERO_AFTER_POINT) != 0) ? 1 : 0; - if ((-decimal_point + 1 > max_leading_padding_zeroes_in_precision_mode_) || - (decimal_point - precision + extra_zero > - max_trailing_padding_zeroes_in_precision_mode_)) { - // Fill buffer to contain 'precision' digits. - // Usually the buffer is already at the correct length, but 'DoubleToAscii' - // is allowed to return less characters. - for (int i = decimal_rep_length; i < precision; ++i) { - decimal_rep[i] = '0'; - } - - CreateExponentialRepresentation(decimal_rep, - precision, - exponent, - result_builder); - } else { - CreateDecimalRepresentation(decimal_rep, decimal_rep_length, decimal_point, - Max(0, precision - decimal_point), - result_builder); - } - return true; -} - - -static BignumDtoaMode DtoaToBignumDtoaMode( - DoubleToStringConverter::DtoaMode dtoa_mode) { - switch (dtoa_mode) { - case DoubleToStringConverter::SHORTEST: return BIGNUM_DTOA_SHORTEST; - case DoubleToStringConverter::SHORTEST_SINGLE: - return BIGNUM_DTOA_SHORTEST_SINGLE; - case DoubleToStringConverter::FIXED: return BIGNUM_DTOA_FIXED; - case DoubleToStringConverter::PRECISION: return BIGNUM_DTOA_PRECISION; - default: - UNREACHABLE(); - } -} - - -void DoubleToStringConverter::DoubleToAscii(double v, - DtoaMode mode, - int requested_digits, - char* buffer, - int buffer_length, - bool* sign, - int* length, - int* point) { - Vector vector(buffer, buffer_length); - ASSERT(!Double(v).IsSpecial()); - ASSERT(mode == SHORTEST || mode == SHORTEST_SINGLE || requested_digits >= 0); - - if (Double(v).Sign() < 0) { - *sign = true; - v = -v; - } else { - *sign = false; - } - - if (mode == PRECISION && requested_digits == 0) { - vector[0] = '\0'; - *length = 0; - return; - } - - if (v == 0) { - vector[0] = '0'; - vector[1] = '\0'; - *length = 1; - *point = 1; - return; - } - - bool fast_worked; - switch (mode) { - case SHORTEST: - fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST, 0, vector, length, point); - break; - case SHORTEST_SINGLE: - fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST_SINGLE, 0, - vector, length, point); - break; - case FIXED: - fast_worked = FastFixedDtoa(v, requested_digits, vector, length, point); - break; - case PRECISION: - fast_worked = FastDtoa(v, FAST_DTOA_PRECISION, requested_digits, - vector, length, point); - break; - default: - fast_worked = false; - UNREACHABLE(); - } - if (fast_worked) return; - - // If the fast dtoa didn't succeed use the slower bignum version. - BignumDtoaMode bignum_mode = DtoaToBignumDtoaMode(mode); - BignumDtoa(v, bignum_mode, requested_digits, vector, length, point); - vector[*length] = '\0'; -} - - -// Consumes the given substring from the iterator. -// Returns false, if the substring does not match. -static bool ConsumeSubString(const char** current, - const char* end, - const char* substring) { - ASSERT(**current == *substring); - for (substring++; *substring != '\0'; substring++) { - ++*current; - if (*current == end || **current != *substring) return false; - } - ++*current; - return true; -} - - -// Maximum number of significant digits in decimal representation. -// The longest possible double in decimal representation is -// (2^53 - 1) * 2 ^ -1074 that is (2 ^ 53 - 1) * 5 ^ 1074 / 10 ^ 1074 -// (768 digits). If we parse a number whose first digits are equal to a -// mean of 2 adjacent doubles (that could have up to 769 digits) the result -// must be rounded to the bigger one unless the tail consists of zeros, so -// we don't need to preserve all the digits. -const int kMaxSignificantDigits = 772; - - -// Returns true if a nonspace found and false if the end has reached. -static inline bool AdvanceToNonspace(const char** current, const char* end) { - while (*current != end) { - if (**current != ' ') return true; - ++*current; - } - return false; -} - - -static bool isDigit(int x, int radix) { - return (x >= '0' && x <= '9' && x < '0' + radix) - || (radix > 10 && x >= 'a' && x < 'a' + radix - 10) - || (radix > 10 && x >= 'A' && x < 'A' + radix - 10); -} - - -static double SignedZero(bool sign) { - return sign ? -0.0 : 0.0; -} - - -// Returns true if 'c' is a decimal digit that is valid for the given radix. -// -// The function is small and could be inlined, but VS2012 emitted a warning -// because it constant-propagated the radix and concluded that the last -// condition was always true. By moving it into a separate function the -// compiler wouldn't warn anymore. -static bool IsDecimalDigitForRadix(int c, int radix) { - return '0' <= c && c <= '9' && (c - '0') < radix; -} - -// Returns true if 'c' is a character digit that is valid for the given radix. -// The 'a_character' should be 'a' or 'A'. -// -// The function is small and could be inlined, but VS2012 emitted a warning -// because it constant-propagated the radix and concluded that the first -// condition was always false. By moving it into a separate function the -// compiler wouldn't warn anymore. -static bool IsCharacterDigitForRadix(int c, int radix, char a_character) { - return radix > 10 && c >= a_character && c < a_character + radix - 10; -} - - -// Parsing integers with radix 2, 4, 8, 16, 32. Assumes current != end. -template -static double RadixStringToIeee(const char* current, - const char* end, - bool sign, - bool allow_trailing_junk, - double junk_string_value, - bool read_as_double, - const char** trailing_pointer) { - ASSERT(current != end); - - const int kDoubleSize = Double::kSignificandSize; - const int kSingleSize = Single::kSignificandSize; - const int kSignificandSize = read_as_double? kDoubleSize: kSingleSize; - - // Skip leading 0s. - while (*current == '0') { - ++current; - if (current == end) { - *trailing_pointer = end; - return SignedZero(sign); - } - } - - int64_t number = 0; - int exponent = 0; - const int radix = (1 << radix_log_2); - - do { - int digit; - if (IsDecimalDigitForRadix(*current, radix)) { - digit = static_cast(*current) - '0'; - } else if (IsCharacterDigitForRadix(*current, radix, 'a')) { - digit = static_cast(*current) - 'a' + 10; - } else if (IsCharacterDigitForRadix(*current, radix, 'A')) { - digit = static_cast(*current) - 'A' + 10; - } else { - if (allow_trailing_junk || !AdvanceToNonspace(¤t, end)) { - break; - } else { - return junk_string_value; - } - } - - number = number * radix + digit; - int overflow = static_cast(number >> kSignificandSize); - if (overflow != 0) { - // Overflow occurred. Need to determine which direction to round the - // result. - int overflow_bits_count = 1; - while (overflow > 1) { - overflow_bits_count++; - overflow >>= 1; - } - - int dropped_bits_mask = ((1 << overflow_bits_count) - 1); - int dropped_bits = static_cast(number) & dropped_bits_mask; - number >>= overflow_bits_count; - exponent = overflow_bits_count; - - bool zero_tail = true; - for (;;) { - ++current; - if (current == end || !isDigit(*current, radix)) break; - zero_tail = zero_tail && *current == '0'; - exponent += radix_log_2; - } - - if (!allow_trailing_junk && AdvanceToNonspace(¤t, end)) { - return junk_string_value; - } - - int middle_value = (1 << (overflow_bits_count - 1)); - if (dropped_bits > middle_value) { - number++; // Rounding up. - } else if (dropped_bits == middle_value) { - // Rounding to even to consistency with decimals: half-way case rounds - // up if significant part is odd and down otherwise. - if ((number & 1) != 0 || !zero_tail) { - number++; // Rounding up. - } - } - - // Rounding up may cause overflow. - if ((number & ((int64_t)1 << kSignificandSize)) != 0) { - exponent++; - number >>= 1; - } - break; - } - ++current; - } while (current != end); - - ASSERT(number < ((int64_t)1 << kSignificandSize)); - ASSERT(static_cast(static_cast(number)) == number); - - *trailing_pointer = current; - - if (exponent == 0) { - if (sign) { - if (number == 0) return -0.0; - number = -number; - } - return static_cast(number); - } - - ASSERT(number != 0); - return Double(DiyFp(number, exponent)).value(); -} - - -double StringToDoubleConverter::StringToIeee( - const char* input, - int length, - int* processed_characters_count, - bool read_as_double) const { - const char* current = input; - const char* end = input + length; - - *processed_characters_count = 0; - - const bool allow_trailing_junk = (flags_ & ALLOW_TRAILING_JUNK) != 0; - const bool allow_leading_spaces = (flags_ & ALLOW_LEADING_SPACES) != 0; - const bool allow_trailing_spaces = (flags_ & ALLOW_TRAILING_SPACES) != 0; - const bool allow_spaces_after_sign = (flags_ & ALLOW_SPACES_AFTER_SIGN) != 0; - - // To make sure that iterator dereferencing is valid the following - // convention is used: - // 1. Each '++current' statement is followed by check for equality to 'end'. - // 2. If AdvanceToNonspace returned false then current == end. - // 3. If 'current' becomes equal to 'end' the function returns or goes to - // 'parsing_done'. - // 4. 'current' is not dereferenced after the 'parsing_done' label. - // 5. Code before 'parsing_done' may rely on 'current != end'. - if (current == end) return empty_string_value_; - - if (allow_leading_spaces || allow_trailing_spaces) { - if (!AdvanceToNonspace(¤t, end)) { - *processed_characters_count = static_cast(current - input); - return empty_string_value_; - } - if (!allow_leading_spaces && (input != current)) { - // No leading spaces allowed, but AdvanceToNonspace moved forward. - return junk_string_value_; - } - } - - // The longest form of simplified number is: "-.1eXXX\0". - const int kBufferSize = kMaxSignificantDigits + 10; - char buffer[kBufferSize]; // NOLINT: size is known at compile time. - int buffer_pos = 0; - - // Exponent will be adjusted if insignificant digits of the integer part - // or insignificant leading zeros of the fractional part are dropped. - int exponent = 0; - int significant_digits = 0; - int insignificant_digits = 0; - bool nonzero_digit_dropped = false; - - bool sign = false; - - if (*current == '+' || *current == '-') { - sign = (*current == '-'); - ++current; - const char* next_non_space = current; - // Skip following spaces (if allowed). - if (!AdvanceToNonspace(&next_non_space, end)) return junk_string_value_; - if (!allow_spaces_after_sign && (current != next_non_space)) { - return junk_string_value_; - } - current = next_non_space; - } - - if (infinity_symbol_ != NULL) { - if (*current == infinity_symbol_[0]) { - if (!ConsumeSubString(¤t, end, infinity_symbol_)) { - return junk_string_value_; - } - - if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) { - return junk_string_value_; - } - if (!allow_trailing_junk && AdvanceToNonspace(¤t, end)) { - return junk_string_value_; - } - - ASSERT(buffer_pos == 0); - *processed_characters_count = static_cast(current - input); - return sign ? -Double::Infinity() : Double::Infinity(); - } - } - - if (nan_symbol_ != NULL) { - if (*current == nan_symbol_[0]) { - if (!ConsumeSubString(¤t, end, nan_symbol_)) { - return junk_string_value_; - } - - if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) { - return junk_string_value_; - } - if (!allow_trailing_junk && AdvanceToNonspace(¤t, end)) { - return junk_string_value_; - } - - ASSERT(buffer_pos == 0); - *processed_characters_count = static_cast(current - input); - return sign ? -Double::NaN() : Double::NaN(); - } - } - - bool leading_zero = false; - if (*current == '0') { - ++current; - if (current == end) { - *processed_characters_count = static_cast(current - input); - return SignedZero(sign); - } - - leading_zero = true; - - // It could be hexadecimal value. - if ((flags_ & ALLOW_HEX) && (*current == 'x' || *current == 'X')) { - ++current; - if (current == end || !isDigit(*current, 16)) { - return junk_string_value_; // "0x". - } - - const char* tail_pointer = NULL; - double result = RadixStringToIeee<4>(current, - end, - sign, - allow_trailing_junk, - junk_string_value_, - read_as_double, - &tail_pointer); - if (tail_pointer != NULL) { - if (allow_trailing_spaces) AdvanceToNonspace(&tail_pointer, end); - *processed_characters_count = static_cast(tail_pointer - input); - } - return result; - } - - // Ignore leading zeros in the integer part. - while (*current == '0') { - ++current; - if (current == end) { - *processed_characters_count = static_cast(current - input); - return SignedZero(sign); - } - } - } - - bool octal = leading_zero && (flags_ & ALLOW_OCTALS) != 0; - - // Copy significant digits of the integer part (if any) to the buffer. - while (*current >= '0' && *current <= '9') { - if (significant_digits < kMaxSignificantDigits) { - ASSERT(buffer_pos < kBufferSize); - buffer[buffer_pos++] = static_cast(*current); - significant_digits++; - // Will later check if it's an octal in the buffer. - } else { - insignificant_digits++; // Move the digit into the exponential part. - nonzero_digit_dropped = nonzero_digit_dropped || *current != '0'; - } - octal = octal && *current < '8'; - ++current; - if (current == end) goto parsing_done; - } - - if (significant_digits == 0) { - octal = false; - } - - if (*current == '.') { - if (octal && !allow_trailing_junk) return junk_string_value_; - if (octal) goto parsing_done; - - ++current; - if (current == end) { - if (significant_digits == 0 && !leading_zero) { - return junk_string_value_; - } else { - goto parsing_done; - } - } - - if (significant_digits == 0) { - // octal = false; - // Integer part consists of 0 or is absent. Significant digits start after - // leading zeros (if any). - while (*current == '0') { - ++current; - if (current == end) { - *processed_characters_count = static_cast(current - input); - return SignedZero(sign); - } - exponent--; // Move this 0 into the exponent. - } - } - - // There is a fractional part. - // We don't emit a '.', but adjust the exponent instead. - while (*current >= '0' && *current <= '9') { - if (significant_digits < kMaxSignificantDigits) { - ASSERT(buffer_pos < kBufferSize); - buffer[buffer_pos++] = static_cast(*current); - significant_digits++; - exponent--; - } else { - // Ignore insignificant digits in the fractional part. - nonzero_digit_dropped = nonzero_digit_dropped || *current != '0'; - } - ++current; - if (current == end) goto parsing_done; - } - } - - if (!leading_zero && exponent == 0 && significant_digits == 0) { - // If leading_zeros is true then the string contains zeros. - // If exponent < 0 then string was [+-]\.0*... - // If significant_digits != 0 the string is not equal to 0. - // Otherwise there are no digits in the string. - return junk_string_value_; - } - - // Parse exponential part. - if (*current == 'e' || *current == 'E') { - if (octal && !allow_trailing_junk) return junk_string_value_; - if (octal) goto parsing_done; - ++current; - if (current == end) { - if (allow_trailing_junk) { - goto parsing_done; - } else { - return junk_string_value_; - } - } - char sign = '+'; - if (*current == '+' || *current == '-') { - sign = static_cast(*current); - ++current; - if (current == end) { - if (allow_trailing_junk) { - goto parsing_done; - } else { - return junk_string_value_; - } - } - } - - if (current == end || *current < '0' || *current > '9') { - if (allow_trailing_junk) { - goto parsing_done; - } else { - return junk_string_value_; - } - } - - const int max_exponent = INT_MAX / 2; - ASSERT(-max_exponent / 2 <= exponent && exponent <= max_exponent / 2); - int num = 0; - do { - // Check overflow. - int digit = *current - '0'; - if (num >= max_exponent / 10 - && !(num == max_exponent / 10 && digit <= max_exponent % 10)) { - num = max_exponent; - } else { - num = num * 10 + digit; - } - ++current; - } while (current != end && *current >= '0' && *current <= '9'); - - exponent += (sign == '-' ? -num : num); - } - - if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) { - return junk_string_value_; - } - if (!allow_trailing_junk && AdvanceToNonspace(¤t, end)) { - return junk_string_value_; - } - if (allow_trailing_spaces) { - AdvanceToNonspace(¤t, end); - } - - parsing_done: - exponent += insignificant_digits; - - if (octal) { - double result; - const char* tail_pointer = NULL; - result = RadixStringToIeee<3>(buffer, - buffer + buffer_pos, - sign, - allow_trailing_junk, - junk_string_value_, - read_as_double, - &tail_pointer); - ASSERT(tail_pointer != NULL); - *processed_characters_count = static_cast(current - input); - return result; - } - - if (nonzero_digit_dropped) { - buffer[buffer_pos++] = '1'; - exponent--; - } - - ASSERT(buffer_pos < kBufferSize); - buffer[buffer_pos] = '\0'; - - double converted; - if (read_as_double) { - converted = Strtod(Vector(buffer, buffer_pos), exponent); - } else { - converted = Strtof(Vector(buffer, buffer_pos), exponent); - } - *processed_characters_count = static_cast(current - input); - return sign? -converted: converted; -} - -} // namespace double_conversion diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/double-conversion.h b/ios/Pods/Flipper-DoubleConversion/double-conversion/double-conversion.h deleted file mode 100644 index 1c3387d..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/double-conversion.h +++ /dev/null @@ -1,536 +0,0 @@ -// Copyright 2012 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_DOUBLE_CONVERSION_H_ -#define DOUBLE_CONVERSION_DOUBLE_CONVERSION_H_ - -#include "utils.h" - -namespace double_conversion { - -class DoubleToStringConverter { - public: - // When calling ToFixed with a double > 10^kMaxFixedDigitsBeforePoint - // or a requested_digits parameter > kMaxFixedDigitsAfterPoint then the - // function returns false. - static const int kMaxFixedDigitsBeforePoint = 60; - static const int kMaxFixedDigitsAfterPoint = 60; - - // When calling ToExponential with a requested_digits - // parameter > kMaxExponentialDigits then the function returns false. - static const int kMaxExponentialDigits = 120; - - // When calling ToPrecision with a requested_digits - // parameter < kMinPrecisionDigits or requested_digits > kMaxPrecisionDigits - // then the function returns false. - static const int kMinPrecisionDigits = 1; - static const int kMaxPrecisionDigits = 120; - - enum Flags { - NO_FLAGS = 0, - EMIT_POSITIVE_EXPONENT_SIGN = 1, - EMIT_TRAILING_DECIMAL_POINT = 2, - EMIT_TRAILING_ZERO_AFTER_POINT = 4, - UNIQUE_ZERO = 8 - }; - - // Flags should be a bit-or combination of the possible Flags-enum. - // - NO_FLAGS: no special flags. - // - EMIT_POSITIVE_EXPONENT_SIGN: when the number is converted into exponent - // form, emits a '+' for positive exponents. Example: 1.2e+2. - // - EMIT_TRAILING_DECIMAL_POINT: when the input number is an integer and is - // converted into decimal format then a trailing decimal point is appended. - // Example: 2345.0 is converted to "2345.". - // - EMIT_TRAILING_ZERO_AFTER_POINT: in addition to a trailing decimal point - // emits a trailing '0'-character. This flag requires the - // EXMIT_TRAILING_DECIMAL_POINT flag. - // Example: 2345.0 is converted to "2345.0". - // - UNIQUE_ZERO: "-0.0" is converted to "0.0". - // - // Infinity symbol and nan_symbol provide the string representation for these - // special values. If the string is NULL and the special value is encountered - // then the conversion functions return false. - // - // The exponent_character is used in exponential representations. It is - // usually 'e' or 'E'. - // - // When converting to the shortest representation the converter will - // represent input numbers in decimal format if they are in the interval - // [10^decimal_in_shortest_low; 10^decimal_in_shortest_high[ - // (lower boundary included, greater boundary excluded). - // Example: with decimal_in_shortest_low = -6 and - // decimal_in_shortest_high = 21: - // ToShortest(0.000001) -> "0.000001" - // ToShortest(0.0000001) -> "1e-7" - // ToShortest(111111111111111111111.0) -> "111111111111111110000" - // ToShortest(100000000000000000000.0) -> "100000000000000000000" - // ToShortest(1111111111111111111111.0) -> "1.1111111111111111e+21" - // - // When converting to precision mode the converter may add - // max_leading_padding_zeroes before returning the number in exponential - // format. - // Example with max_leading_padding_zeroes_in_precision_mode = 6. - // ToPrecision(0.0000012345, 2) -> "0.0000012" - // ToPrecision(0.00000012345, 2) -> "1.2e-7" - // Similarily the converter may add up to - // max_trailing_padding_zeroes_in_precision_mode in precision mode to avoid - // returning an exponential representation. A zero added by the - // EMIT_TRAILING_ZERO_AFTER_POINT flag is counted for this limit. - // Examples for max_trailing_padding_zeroes_in_precision_mode = 1: - // ToPrecision(230.0, 2) -> "230" - // ToPrecision(230.0, 2) -> "230." with EMIT_TRAILING_DECIMAL_POINT. - // ToPrecision(230.0, 2) -> "2.3e2" with EMIT_TRAILING_ZERO_AFTER_POINT. - DoubleToStringConverter(int flags, - const char* infinity_symbol, - const char* nan_symbol, - char exponent_character, - int decimal_in_shortest_low, - int decimal_in_shortest_high, - int max_leading_padding_zeroes_in_precision_mode, - int max_trailing_padding_zeroes_in_precision_mode) - : flags_(flags), - infinity_symbol_(infinity_symbol), - nan_symbol_(nan_symbol), - exponent_character_(exponent_character), - decimal_in_shortest_low_(decimal_in_shortest_low), - decimal_in_shortest_high_(decimal_in_shortest_high), - max_leading_padding_zeroes_in_precision_mode_( - max_leading_padding_zeroes_in_precision_mode), - max_trailing_padding_zeroes_in_precision_mode_( - max_trailing_padding_zeroes_in_precision_mode) { - // When 'trailing zero after the point' is set, then 'trailing point' - // must be set too. - ASSERT(((flags & EMIT_TRAILING_DECIMAL_POINT) != 0) || - !((flags & EMIT_TRAILING_ZERO_AFTER_POINT) != 0)); - } - - // Returns a converter following the EcmaScript specification. - static const DoubleToStringConverter& EcmaScriptConverter(); - - // Computes the shortest string of digits that correctly represent the input - // number. Depending on decimal_in_shortest_low and decimal_in_shortest_high - // (see constructor) it then either returns a decimal representation, or an - // exponential representation. - // Example with decimal_in_shortest_low = -6, - // decimal_in_shortest_high = 21, - // EMIT_POSITIVE_EXPONENT_SIGN activated, and - // EMIT_TRAILING_DECIMAL_POINT deactived: - // ToShortest(0.000001) -> "0.000001" - // ToShortest(0.0000001) -> "1e-7" - // ToShortest(111111111111111111111.0) -> "111111111111111110000" - // ToShortest(100000000000000000000.0) -> "100000000000000000000" - // ToShortest(1111111111111111111111.0) -> "1.1111111111111111e+21" - // - // Note: the conversion may round the output if the returned string - // is accurate enough to uniquely identify the input-number. - // For example the most precise representation of the double 9e59 equals - // "899999999999999918767229449717619953810131273674690656206848", but - // the converter will return the shorter (but still correct) "9e59". - // - // Returns true if the conversion succeeds. The conversion always succeeds - // except when the input value is special and no infinity_symbol or - // nan_symbol has been given to the constructor. - bool ToShortest(double value, StringBuilder* result_builder) const { - return ToShortestIeeeNumber(value, result_builder, SHORTEST); - } - - // Same as ToShortest, but for single-precision floats. - bool ToShortestSingle(float value, StringBuilder* result_builder) const { - return ToShortestIeeeNumber(value, result_builder, SHORTEST_SINGLE); - } - - - // Computes a decimal representation with a fixed number of digits after the - // decimal point. The last emitted digit is rounded. - // - // Examples: - // ToFixed(3.12, 1) -> "3.1" - // ToFixed(3.1415, 3) -> "3.142" - // ToFixed(1234.56789, 4) -> "1234.5679" - // ToFixed(1.23, 5) -> "1.23000" - // ToFixed(0.1, 4) -> "0.1000" - // ToFixed(1e30, 2) -> "1000000000000000019884624838656.00" - // ToFixed(0.1, 30) -> "0.100000000000000005551115123126" - // ToFixed(0.1, 17) -> "0.10000000000000001" - // - // If requested_digits equals 0, then the tail of the result depends on - // the EMIT_TRAILING_DECIMAL_POINT and EMIT_TRAILING_ZERO_AFTER_POINT. - // Examples, for requested_digits == 0, - // let EMIT_TRAILING_DECIMAL_POINT and EMIT_TRAILING_ZERO_AFTER_POINT be - // - false and false: then 123.45 -> 123 - // 0.678 -> 1 - // - true and false: then 123.45 -> 123. - // 0.678 -> 1. - // - true and true: then 123.45 -> 123.0 - // 0.678 -> 1.0 - // - // Returns true if the conversion succeeds. The conversion always succeeds - // except for the following cases: - // - the input value is special and no infinity_symbol or nan_symbol has - // been provided to the constructor, - // - 'value' > 10^kMaxFixedDigitsBeforePoint, or - // - 'requested_digits' > kMaxFixedDigitsAfterPoint. - // The last two conditions imply that the result will never contain more than - // 1 + kMaxFixedDigitsBeforePoint + 1 + kMaxFixedDigitsAfterPoint characters - // (one additional character for the sign, and one for the decimal point). - bool ToFixed(double value, - int requested_digits, - StringBuilder* result_builder) const; - - // Computes a representation in exponential format with requested_digits - // after the decimal point. The last emitted digit is rounded. - // If requested_digits equals -1, then the shortest exponential representation - // is computed. - // - // Examples with EMIT_POSITIVE_EXPONENT_SIGN deactivated, and - // exponent_character set to 'e'. - // ToExponential(3.12, 1) -> "3.1e0" - // ToExponential(5.0, 3) -> "5.000e0" - // ToExponential(0.001, 2) -> "1.00e-3" - // ToExponential(3.1415, -1) -> "3.1415e0" - // ToExponential(3.1415, 4) -> "3.1415e0" - // ToExponential(3.1415, 3) -> "3.142e0" - // ToExponential(123456789000000, 3) -> "1.235e14" - // ToExponential(1000000000000000019884624838656.0, -1) -> "1e30" - // ToExponential(1000000000000000019884624838656.0, 32) -> - // "1.00000000000000001988462483865600e30" - // ToExponential(1234, 0) -> "1e3" - // - // Returns true if the conversion succeeds. The conversion always succeeds - // except for the following cases: - // - the input value is special and no infinity_symbol or nan_symbol has - // been provided to the constructor, - // - 'requested_digits' > kMaxExponentialDigits. - // The last condition implies that the result will never contain more than - // kMaxExponentialDigits + 8 characters (the sign, the digit before the - // decimal point, the decimal point, the exponent character, the - // exponent's sign, and at most 3 exponent digits). - bool ToExponential(double value, - int requested_digits, - StringBuilder* result_builder) const; - - // Computes 'precision' leading digits of the given 'value' and returns them - // either in exponential or decimal format, depending on - // max_{leading|trailing}_padding_zeroes_in_precision_mode (given to the - // constructor). - // The last computed digit is rounded. - // - // Example with max_leading_padding_zeroes_in_precision_mode = 6. - // ToPrecision(0.0000012345, 2) -> "0.0000012" - // ToPrecision(0.00000012345, 2) -> "1.2e-7" - // Similarily the converter may add up to - // max_trailing_padding_zeroes_in_precision_mode in precision mode to avoid - // returning an exponential representation. A zero added by the - // EMIT_TRAILING_ZERO_AFTER_POINT flag is counted for this limit. - // Examples for max_trailing_padding_zeroes_in_precision_mode = 1: - // ToPrecision(230.0, 2) -> "230" - // ToPrecision(230.0, 2) -> "230." with EMIT_TRAILING_DECIMAL_POINT. - // ToPrecision(230.0, 2) -> "2.3e2" with EMIT_TRAILING_ZERO_AFTER_POINT. - // Examples for max_trailing_padding_zeroes_in_precision_mode = 3, and no - // EMIT_TRAILING_ZERO_AFTER_POINT: - // ToPrecision(123450.0, 6) -> "123450" - // ToPrecision(123450.0, 5) -> "123450" - // ToPrecision(123450.0, 4) -> "123500" - // ToPrecision(123450.0, 3) -> "123000" - // ToPrecision(123450.0, 2) -> "1.2e5" - // - // Returns true if the conversion succeeds. The conversion always succeeds - // except for the following cases: - // - the input value is special and no infinity_symbol or nan_symbol has - // been provided to the constructor, - // - precision < kMinPericisionDigits - // - precision > kMaxPrecisionDigits - // The last condition implies that the result will never contain more than - // kMaxPrecisionDigits + 7 characters (the sign, the decimal point, the - // exponent character, the exponent's sign, and at most 3 exponent digits). - bool ToPrecision(double value, - int precision, - StringBuilder* result_builder) const; - - enum DtoaMode { - // Produce the shortest correct representation. - // For example the output of 0.299999999999999988897 is (the less accurate - // but correct) 0.3. - SHORTEST, - // Same as SHORTEST, but for single-precision floats. - SHORTEST_SINGLE, - // Produce a fixed number of digits after the decimal point. - // For instance fixed(0.1, 4) becomes 0.1000 - // If the input number is big, the output will be big. - FIXED, - // Fixed number of digits (independent of the decimal point). - PRECISION - }; - - // The maximal number of digits that are needed to emit a double in base 10. - // A higher precision can be achieved by using more digits, but the shortest - // accurate representation of any double will never use more digits than - // kBase10MaximalLength. - // Note that DoubleToAscii null-terminates its input. So the given buffer - // should be at least kBase10MaximalLength + 1 characters long. - static const int kBase10MaximalLength = 17; - - // Converts the given double 'v' to ascii. 'v' must not be NaN, +Infinity, or - // -Infinity. In SHORTEST_SINGLE-mode this restriction also applies to 'v' - // after it has been casted to a single-precision float. That is, in this - // mode static_cast(v) must not be NaN, +Infinity or -Infinity. - // - // The result should be interpreted as buffer * 10^(point-length). - // - // The output depends on the given mode: - // - SHORTEST: produce the least amount of digits for which the internal - // identity requirement is still satisfied. If the digits are printed - // (together with the correct exponent) then reading this number will give - // 'v' again. The buffer will choose the representation that is closest to - // 'v'. If there are two at the same distance, than the one farther away - // from 0 is chosen (halfway cases - ending with 5 - are rounded up). - // In this mode the 'requested_digits' parameter is ignored. - // - SHORTEST_SINGLE: same as SHORTEST but with single-precision. - // - FIXED: produces digits necessary to print a given number with - // 'requested_digits' digits after the decimal point. The produced digits - // might be too short in which case the caller has to fill the remainder - // with '0's. - // Example: toFixed(0.001, 5) is allowed to return buffer="1", point=-2. - // Halfway cases are rounded towards +/-Infinity (away from 0). The call - // toFixed(0.15, 2) thus returns buffer="2", point=0. - // The returned buffer may contain digits that would be truncated from the - // shortest representation of the input. - // - PRECISION: produces 'requested_digits' where the first digit is not '0'. - // Even though the length of produced digits usually equals - // 'requested_digits', the function is allowed to return fewer digits, in - // which case the caller has to fill the missing digits with '0's. - // Halfway cases are again rounded away from 0. - // DoubleToAscii expects the given buffer to be big enough to hold all - // digits and a terminating null-character. In SHORTEST-mode it expects a - // buffer of at least kBase10MaximalLength + 1. In all other modes the - // requested_digits parameter and the padding-zeroes limit the size of the - // output. Don't forget the decimal point, the exponent character and the - // terminating null-character when computing the maximal output size. - // The given length is only used in debug mode to ensure the buffer is big - // enough. - static void DoubleToAscii(double v, - DtoaMode mode, - int requested_digits, - char* buffer, - int buffer_length, - bool* sign, - int* length, - int* point); - - private: - // Implementation for ToShortest and ToShortestSingle. - bool ToShortestIeeeNumber(double value, - StringBuilder* result_builder, - DtoaMode mode) const; - - // If the value is a special value (NaN or Infinity) constructs the - // corresponding string using the configured infinity/nan-symbol. - // If either of them is NULL or the value is not special then the - // function returns false. - bool HandleSpecialValues(double value, StringBuilder* result_builder) const; - // Constructs an exponential representation (i.e. 1.234e56). - // The given exponent assumes a decimal point after the first decimal digit. - void CreateExponentialRepresentation(const char* decimal_digits, - int length, - int exponent, - StringBuilder* result_builder) const; - // Creates a decimal representation (i.e 1234.5678). - void CreateDecimalRepresentation(const char* decimal_digits, - int length, - int decimal_point, - int digits_after_point, - StringBuilder* result_builder) const; - - const int flags_; - const char* const infinity_symbol_; - const char* const nan_symbol_; - const char exponent_character_; - const int decimal_in_shortest_low_; - const int decimal_in_shortest_high_; - const int max_leading_padding_zeroes_in_precision_mode_; - const int max_trailing_padding_zeroes_in_precision_mode_; - - DISALLOW_IMPLICIT_CONSTRUCTORS(DoubleToStringConverter); -}; - - -class StringToDoubleConverter { - public: - // Enumeration for allowing octals and ignoring junk when converting - // strings to numbers. - enum Flags { - NO_FLAGS = 0, - ALLOW_HEX = 1, - ALLOW_OCTALS = 2, - ALLOW_TRAILING_JUNK = 4, - ALLOW_LEADING_SPACES = 8, - ALLOW_TRAILING_SPACES = 16, - ALLOW_SPACES_AFTER_SIGN = 32 - }; - - // Flags should be a bit-or combination of the possible Flags-enum. - // - NO_FLAGS: no special flags. - // - ALLOW_HEX: recognizes the prefix "0x". Hex numbers may only be integers. - // Ex: StringToDouble("0x1234") -> 4660.0 - // In StringToDouble("0x1234.56") the characters ".56" are trailing - // junk. The result of the call is hence dependent on - // the ALLOW_TRAILING_JUNK flag and/or the junk value. - // With this flag "0x" is a junk-string. Even with ALLOW_TRAILING_JUNK, - // the string will not be parsed as "0" followed by junk. - // - // - ALLOW_OCTALS: recognizes the prefix "0" for octals: - // If a sequence of octal digits starts with '0', then the number is - // read as octal integer. Octal numbers may only be integers. - // Ex: StringToDouble("01234") -> 668.0 - // StringToDouble("012349") -> 12349.0 // Not a sequence of octal - // // digits. - // In StringToDouble("01234.56") the characters ".56" are trailing - // junk. The result of the call is hence dependent on - // the ALLOW_TRAILING_JUNK flag and/or the junk value. - // In StringToDouble("01234e56") the characters "e56" are trailing - // junk, too. - // - ALLOW_TRAILING_JUNK: ignore trailing characters that are not part of - // a double literal. - // - ALLOW_LEADING_SPACES: skip over leading spaces. - // - ALLOW_TRAILING_SPACES: ignore trailing spaces. - // - ALLOW_SPACES_AFTER_SIGN: ignore spaces after the sign. - // Ex: StringToDouble("- 123.2") -> -123.2. - // StringToDouble("+ 123.2") -> 123.2 - // - // empty_string_value is returned when an empty string is given as input. - // If ALLOW_LEADING_SPACES or ALLOW_TRAILING_SPACES are set, then a string - // containing only spaces is converted to the 'empty_string_value', too. - // - // junk_string_value is returned when - // a) ALLOW_TRAILING_JUNK is not set, and a junk character (a character not - // part of a double-literal) is found. - // b) ALLOW_TRAILING_JUNK is set, but the string does not start with a - // double literal. - // - // infinity_symbol and nan_symbol are strings that are used to detect - // inputs that represent infinity and NaN. They can be null, in which case - // they are ignored. - // The conversion routine first reads any possible signs. Then it compares the - // following character of the input-string with the first character of - // the infinity, and nan-symbol. If either matches, the function assumes, that - // a match has been found, and expects the following input characters to match - // the remaining characters of the special-value symbol. - // This means that the following restrictions apply to special-value symbols: - // - they must not start with signs ('+', or '-'), - // - they must not have the same first character. - // - they must not start with digits. - // - // Examples: - // flags = ALLOW_HEX | ALLOW_TRAILING_JUNK, - // empty_string_value = 0.0, - // junk_string_value = NaN, - // infinity_symbol = "infinity", - // nan_symbol = "nan": - // StringToDouble("0x1234") -> 4660.0. - // StringToDouble("0x1234K") -> 4660.0. - // StringToDouble("") -> 0.0 // empty_string_value. - // StringToDouble(" ") -> NaN // junk_string_value. - // StringToDouble(" 1") -> NaN // junk_string_value. - // StringToDouble("0x") -> NaN // junk_string_value. - // StringToDouble("-123.45") -> -123.45. - // StringToDouble("--123.45") -> NaN // junk_string_value. - // StringToDouble("123e45") -> 123e45. - // StringToDouble("123E45") -> 123e45. - // StringToDouble("123e+45") -> 123e45. - // StringToDouble("123E-45") -> 123e-45. - // StringToDouble("123e") -> 123.0 // trailing junk ignored. - // StringToDouble("123e-") -> 123.0 // trailing junk ignored. - // StringToDouble("+NaN") -> NaN // NaN string literal. - // StringToDouble("-infinity") -> -inf. // infinity literal. - // StringToDouble("Infinity") -> NaN // junk_string_value. - // - // flags = ALLOW_OCTAL | ALLOW_LEADING_SPACES, - // empty_string_value = 0.0, - // junk_string_value = NaN, - // infinity_symbol = NULL, - // nan_symbol = NULL: - // StringToDouble("0x1234") -> NaN // junk_string_value. - // StringToDouble("01234") -> 668.0. - // StringToDouble("") -> 0.0 // empty_string_value. - // StringToDouble(" ") -> 0.0 // empty_string_value. - // StringToDouble(" 1") -> 1.0 - // StringToDouble("0x") -> NaN // junk_string_value. - // StringToDouble("0123e45") -> NaN // junk_string_value. - // StringToDouble("01239E45") -> 1239e45. - // StringToDouble("-infinity") -> NaN // junk_string_value. - // StringToDouble("NaN") -> NaN // junk_string_value. - StringToDoubleConverter(int flags, - double empty_string_value, - double junk_string_value, - const char* infinity_symbol, - const char* nan_symbol) - : flags_(flags), - empty_string_value_(empty_string_value), - junk_string_value_(junk_string_value), - infinity_symbol_(infinity_symbol), - nan_symbol_(nan_symbol) { - } - - // Performs the conversion. - // The output parameter 'processed_characters_count' is set to the number - // of characters that have been processed to read the number. - // Spaces than are processed with ALLOW_{LEADING|TRAILING}_SPACES are included - // in the 'processed_characters_count'. Trailing junk is never included. - double StringToDouble(const char* buffer, - int length, - int* processed_characters_count) const { - return StringToIeee(buffer, length, processed_characters_count, true); - } - - // Same as StringToDouble but reads a float. - // Note that this is not equivalent to static_cast(StringToDouble(...)) - // due to potential double-rounding. - float StringToFloat(const char* buffer, - int length, - int* processed_characters_count) const { - return static_cast(StringToIeee(buffer, length, - processed_characters_count, false)); - } - - private: - const int flags_; - const double empty_string_value_; - const double junk_string_value_; - const char* const infinity_symbol_; - const char* const nan_symbol_; - - double StringToIeee(const char* buffer, - int length, - int* processed_characters_count, - bool read_as_double) const; - - DISALLOW_IMPLICIT_CONSTRUCTORS(StringToDoubleConverter); -}; - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_DOUBLE_CONVERSION_H_ diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/fast-dtoa.cc b/ios/Pods/Flipper-DoubleConversion/double-conversion/fast-dtoa.cc deleted file mode 100644 index 6135038..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/fast-dtoa.cc +++ /dev/null @@ -1,665 +0,0 @@ -// Copyright 2012 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include "fast-dtoa.h" - -#include "cached-powers.h" -#include "diy-fp.h" -#include "ieee.h" - -namespace double_conversion { - -// The minimal and maximal target exponent define the range of w's binary -// exponent, where 'w' is the result of multiplying the input by a cached power -// of ten. -// -// A different range might be chosen on a different platform, to optimize digit -// generation, but a smaller range requires more powers of ten to be cached. -static const int kMinimalTargetExponent = -60; -static const int kMaximalTargetExponent = -32; - - -// Adjusts the last digit of the generated number, and screens out generated -// solutions that may be inaccurate. A solution may be inaccurate if it is -// outside the safe interval, or if we cannot prove that it is closer to the -// input than a neighboring representation of the same length. -// -// Input: * buffer containing the digits of too_high / 10^kappa -// * the buffer's length -// * distance_too_high_w == (too_high - w).f() * unit -// * unsafe_interval == (too_high - too_low).f() * unit -// * rest = (too_high - buffer * 10^kappa).f() * unit -// * ten_kappa = 10^kappa * unit -// * unit = the common multiplier -// Output: returns true if the buffer is guaranteed to contain the closest -// representable number to the input. -// Modifies the generated digits in the buffer to approach (round towards) w. -static bool RoundWeed(Vector buffer, - int length, - uint64_t distance_too_high_w, - uint64_t unsafe_interval, - uint64_t rest, - uint64_t ten_kappa, - uint64_t unit) { - uint64_t small_distance = distance_too_high_w - unit; - uint64_t big_distance = distance_too_high_w + unit; - // Let w_low = too_high - big_distance, and - // w_high = too_high - small_distance. - // Note: w_low < w < w_high - // - // The real w (* unit) must lie somewhere inside the interval - // ]w_low; w_high[ (often written as "(w_low; w_high)") - - // Basically the buffer currently contains a number in the unsafe interval - // ]too_low; too_high[ with too_low < w < too_high - // - // too_high - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // ^v 1 unit ^ ^ ^ ^ - // boundary_high --------------------- . . . . - // ^v 1 unit . . . . - // - - - - - - - - - - - - - - - - - - - + - - + - - - - - - . . - // . . ^ . . - // . big_distance . . . - // . . . . rest - // small_distance . . . . - // v . . . . - // w_high - - - - - - - - - - - - - - - - - - . . . . - // ^v 1 unit . . . . - // w ---------------------------------------- . . . . - // ^v 1 unit v . . . - // w_low - - - - - - - - - - - - - - - - - - - - - . . . - // . . v - // buffer --------------------------------------------------+-------+-------- - // . . - // safe_interval . - // v . - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . - // ^v 1 unit . - // boundary_low ------------------------- unsafe_interval - // ^v 1 unit v - // too_low - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - // - // Note that the value of buffer could lie anywhere inside the range too_low - // to too_high. - // - // boundary_low, boundary_high and w are approximations of the real boundaries - // and v (the input number). They are guaranteed to be precise up to one unit. - // In fact the error is guaranteed to be strictly less than one unit. - // - // Anything that lies outside the unsafe interval is guaranteed not to round - // to v when read again. - // Anything that lies inside the safe interval is guaranteed to round to v - // when read again. - // If the number inside the buffer lies inside the unsafe interval but not - // inside the safe interval then we simply do not know and bail out (returning - // false). - // - // Similarly we have to take into account the imprecision of 'w' when finding - // the closest representation of 'w'. If we have two potential - // representations, and one is closer to both w_low and w_high, then we know - // it is closer to the actual value v. - // - // By generating the digits of too_high we got the largest (closest to - // too_high) buffer that is still in the unsafe interval. In the case where - // w_high < buffer < too_high we try to decrement the buffer. - // This way the buffer approaches (rounds towards) w. - // There are 3 conditions that stop the decrementation process: - // 1) the buffer is already below w_high - // 2) decrementing the buffer would make it leave the unsafe interval - // 3) decrementing the buffer would yield a number below w_high and farther - // away than the current number. In other words: - // (buffer{-1} < w_high) && w_high - buffer{-1} > buffer - w_high - // Instead of using the buffer directly we use its distance to too_high. - // Conceptually rest ~= too_high - buffer - // We need to do the following tests in this order to avoid over- and - // underflows. - ASSERT(rest <= unsafe_interval); - while (rest < small_distance && // Negated condition 1 - unsafe_interval - rest >= ten_kappa && // Negated condition 2 - (rest + ten_kappa < small_distance || // buffer{-1} > w_high - small_distance - rest >= rest + ten_kappa - small_distance)) { - buffer[length - 1]--; - rest += ten_kappa; - } - - // We have approached w+ as much as possible. We now test if approaching w- - // would require changing the buffer. If yes, then we have two possible - // representations close to w, but we cannot decide which one is closer. - if (rest < big_distance && - unsafe_interval - rest >= ten_kappa && - (rest + ten_kappa < big_distance || - big_distance - rest > rest + ten_kappa - big_distance)) { - return false; - } - - // Weeding test. - // The safe interval is [too_low + 2 ulp; too_high - 2 ulp] - // Since too_low = too_high - unsafe_interval this is equivalent to - // [too_high - unsafe_interval + 4 ulp; too_high - 2 ulp] - // Conceptually we have: rest ~= too_high - buffer - return (2 * unit <= rest) && (rest <= unsafe_interval - 4 * unit); -} - - -// Rounds the buffer upwards if the result is closer to v by possibly adding -// 1 to the buffer. If the precision of the calculation is not sufficient to -// round correctly, return false. -// The rounding might shift the whole buffer in which case the kappa is -// adjusted. For example "99", kappa = 3 might become "10", kappa = 4. -// -// If 2*rest > ten_kappa then the buffer needs to be round up. -// rest can have an error of +/- 1 unit. This function accounts for the -// imprecision and returns false, if the rounding direction cannot be -// unambiguously determined. -// -// Precondition: rest < ten_kappa. -static bool RoundWeedCounted(Vector buffer, - int length, - uint64_t rest, - uint64_t ten_kappa, - uint64_t unit, - int* kappa) { - ASSERT(rest < ten_kappa); - // The following tests are done in a specific order to avoid overflows. They - // will work correctly with any uint64 values of rest < ten_kappa and unit. - // - // If the unit is too big, then we don't know which way to round. For example - // a unit of 50 means that the real number lies within rest +/- 50. If - // 10^kappa == 40 then there is no way to tell which way to round. - if (unit >= ten_kappa) return false; - // Even if unit is just half the size of 10^kappa we are already completely - // lost. (And after the previous test we know that the expression will not - // over/underflow.) - if (ten_kappa - unit <= unit) return false; - // If 2 * (rest + unit) <= 10^kappa we can safely round down. - if ((ten_kappa - rest > rest) && (ten_kappa - 2 * rest >= 2 * unit)) { - return true; - } - // If 2 * (rest - unit) >= 10^kappa, then we can safely round up. - if ((rest > unit) && (ten_kappa - (rest - unit) <= (rest - unit))) { - // Increment the last digit recursively until we find a non '9' digit. - buffer[length - 1]++; - for (int i = length - 1; i > 0; --i) { - if (buffer[i] != '0' + 10) break; - buffer[i] = '0'; - buffer[i - 1]++; - } - // If the first digit is now '0'+ 10 we had a buffer with all '9's. With the - // exception of the first digit all digits are now '0'. Simply switch the - // first digit to '1' and adjust the kappa. Example: "99" becomes "10" and - // the power (the kappa) is increased. - if (buffer[0] == '0' + 10) { - buffer[0] = '1'; - (*kappa) += 1; - } - return true; - } - return false; -} - -// Returns the biggest power of ten that is less than or equal to the given -// number. We furthermore receive the maximum number of bits 'number' has. -// -// Returns power == 10^(exponent_plus_one-1) such that -// power <= number < power * 10. -// If number_bits == 0 then 0^(0-1) is returned. -// The number of bits must be <= 32. -// Precondition: number < (1 << (number_bits + 1)). - -// Inspired by the method for finding an integer log base 10 from here: -// http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10 -static unsigned int const kSmallPowersOfTen[] = - {0, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, - 1000000000}; - -static void BiggestPowerTen(uint32_t number, - int number_bits, - uint32_t* power, - int* exponent_plus_one) { - ASSERT(number < (1u << (number_bits + 1))); - // 1233/4096 is approximately 1/lg(10). - int exponent_plus_one_guess = ((number_bits + 1) * 1233 >> 12); - // We increment to skip over the first entry in the kPowersOf10 table. - // Note: kPowersOf10[i] == 10^(i-1). - exponent_plus_one_guess++; - // We don't have any guarantees that 2^number_bits <= number. - if (number < kSmallPowersOfTen[exponent_plus_one_guess]) { - exponent_plus_one_guess--; - } - *power = kSmallPowersOfTen[exponent_plus_one_guess]; - *exponent_plus_one = exponent_plus_one_guess; -} - -// Generates the digits of input number w. -// w is a floating-point number (DiyFp), consisting of a significand and an -// exponent. Its exponent is bounded by kMinimalTargetExponent and -// kMaximalTargetExponent. -// Hence -60 <= w.e() <= -32. -// -// Returns false if it fails, in which case the generated digits in the buffer -// should not be used. -// Preconditions: -// * low, w and high are correct up to 1 ulp (unit in the last place). That -// is, their error must be less than a unit of their last digits. -// * low.e() == w.e() == high.e() -// * low < w < high, and taking into account their error: low~ <= high~ -// * kMinimalTargetExponent <= w.e() <= kMaximalTargetExponent -// Postconditions: returns false if procedure fails. -// otherwise: -// * buffer is not null-terminated, but len contains the number of digits. -// * buffer contains the shortest possible decimal digit-sequence -// such that LOW < buffer * 10^kappa < HIGH, where LOW and HIGH are the -// correct values of low and high (without their error). -// * if more than one decimal representation gives the minimal number of -// decimal digits then the one closest to W (where W is the correct value -// of w) is chosen. -// Remark: this procedure takes into account the imprecision of its input -// numbers. If the precision is not enough to guarantee all the postconditions -// then false is returned. This usually happens rarely (~0.5%). -// -// Say, for the sake of example, that -// w.e() == -48, and w.f() == 0x1234567890abcdef -// w's value can be computed by w.f() * 2^w.e() -// We can obtain w's integral digits by simply shifting w.f() by -w.e(). -// -> w's integral part is 0x1234 -// w's fractional part is therefore 0x567890abcdef. -// Printing w's integral part is easy (simply print 0x1234 in decimal). -// In order to print its fraction we repeatedly multiply the fraction by 10 and -// get each digit. Example the first digit after the point would be computed by -// (0x567890abcdef * 10) >> 48. -> 3 -// The whole thing becomes slightly more complicated because we want to stop -// once we have enough digits. That is, once the digits inside the buffer -// represent 'w' we can stop. Everything inside the interval low - high -// represents w. However we have to pay attention to low, high and w's -// imprecision. -static bool DigitGen(DiyFp low, - DiyFp w, - DiyFp high, - Vector buffer, - int* length, - int* kappa) { - ASSERT(low.e() == w.e() && w.e() == high.e()); - ASSERT(low.f() + 1 <= high.f() - 1); - ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent); - // low, w and high are imprecise, but by less than one ulp (unit in the last - // place). - // If we remove (resp. add) 1 ulp from low (resp. high) we are certain that - // the new numbers are outside of the interval we want the final - // representation to lie in. - // Inversely adding (resp. removing) 1 ulp from low (resp. high) would yield - // numbers that are certain to lie in the interval. We will use this fact - // later on. - // We will now start by generating the digits within the uncertain - // interval. Later we will weed out representations that lie outside the safe - // interval and thus _might_ lie outside the correct interval. - uint64_t unit = 1; - DiyFp too_low = DiyFp(low.f() - unit, low.e()); - DiyFp too_high = DiyFp(high.f() + unit, high.e()); - // too_low and too_high are guaranteed to lie outside the interval we want the - // generated number in. - DiyFp unsafe_interval = DiyFp::Minus(too_high, too_low); - // We now cut the input number into two parts: the integral digits and the - // fractionals. We will not write any decimal separator though, but adapt - // kappa instead. - // Reminder: we are currently computing the digits (stored inside the buffer) - // such that: too_low < buffer * 10^kappa < too_high - // We use too_high for the digit_generation and stop as soon as possible. - // If we stop early we effectively round down. - DiyFp one = DiyFp(static_cast(1) << -w.e(), w.e()); - // Division by one is a shift. - uint32_t integrals = static_cast(too_high.f() >> -one.e()); - // Modulo by one is an and. - uint64_t fractionals = too_high.f() & (one.f() - 1); - uint32_t divisor; - int divisor_exponent_plus_one; - BiggestPowerTen(integrals, DiyFp::kSignificandSize - (-one.e()), - &divisor, &divisor_exponent_plus_one); - *kappa = divisor_exponent_plus_one; - *length = 0; - // Loop invariant: buffer = too_high / 10^kappa (integer division) - // The invariant holds for the first iteration: kappa has been initialized - // with the divisor exponent + 1. And the divisor is the biggest power of ten - // that is smaller than integrals. - while (*kappa > 0) { - int digit = integrals / divisor; - ASSERT(digit <= 9); - buffer[*length] = static_cast('0' + digit); - (*length)++; - integrals %= divisor; - (*kappa)--; - // Note that kappa now equals the exponent of the divisor and that the - // invariant thus holds again. - uint64_t rest = - (static_cast(integrals) << -one.e()) + fractionals; - // Invariant: too_high = buffer * 10^kappa + DiyFp(rest, one.e()) - // Reminder: unsafe_interval.e() == one.e() - if (rest < unsafe_interval.f()) { - // Rounding down (by not emitting the remaining digits) yields a number - // that lies within the unsafe interval. - return RoundWeed(buffer, *length, DiyFp::Minus(too_high, w).f(), - unsafe_interval.f(), rest, - static_cast(divisor) << -one.e(), unit); - } - divisor /= 10; - } - - // The integrals have been generated. We are at the point of the decimal - // separator. In the following loop we simply multiply the remaining digits by - // 10 and divide by one. We just need to pay attention to multiply associated - // data (like the interval or 'unit'), too. - // Note that the multiplication by 10 does not overflow, because w.e >= -60 - // and thus one.e >= -60. - ASSERT(one.e() >= -60); - ASSERT(fractionals < one.f()); - ASSERT(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f()); - for (;;) { - fractionals *= 10; - unit *= 10; - unsafe_interval.set_f(unsafe_interval.f() * 10); - // Integer division by one. - int digit = static_cast(fractionals >> -one.e()); - ASSERT(digit <= 9); - buffer[*length] = static_cast('0' + digit); - (*length)++; - fractionals &= one.f() - 1; // Modulo by one. - (*kappa)--; - if (fractionals < unsafe_interval.f()) { - return RoundWeed(buffer, *length, DiyFp::Minus(too_high, w).f() * unit, - unsafe_interval.f(), fractionals, one.f(), unit); - } - } -} - - - -// Generates (at most) requested_digits digits of input number w. -// w is a floating-point number (DiyFp), consisting of a significand and an -// exponent. Its exponent is bounded by kMinimalTargetExponent and -// kMaximalTargetExponent. -// Hence -60 <= w.e() <= -32. -// -// Returns false if it fails, in which case the generated digits in the buffer -// should not be used. -// Preconditions: -// * w is correct up to 1 ulp (unit in the last place). That -// is, its error must be strictly less than a unit of its last digit. -// * kMinimalTargetExponent <= w.e() <= kMaximalTargetExponent -// -// Postconditions: returns false if procedure fails. -// otherwise: -// * buffer is not null-terminated, but length contains the number of -// digits. -// * the representation in buffer is the most precise representation of -// requested_digits digits. -// * buffer contains at most requested_digits digits of w. If there are less -// than requested_digits digits then some trailing '0's have been removed. -// * kappa is such that -// w = buffer * 10^kappa + eps with |eps| < 10^kappa / 2. -// -// Remark: This procedure takes into account the imprecision of its input -// numbers. If the precision is not enough to guarantee all the postconditions -// then false is returned. This usually happens rarely, but the failure-rate -// increases with higher requested_digits. -static bool DigitGenCounted(DiyFp w, - int requested_digits, - Vector buffer, - int* length, - int* kappa) { - ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent); - ASSERT(kMinimalTargetExponent >= -60); - ASSERT(kMaximalTargetExponent <= -32); - // w is assumed to have an error less than 1 unit. Whenever w is scaled we - // also scale its error. - uint64_t w_error = 1; - // We cut the input number into two parts: the integral digits and the - // fractional digits. We don't emit any decimal separator, but adapt kappa - // instead. Example: instead of writing "1.2" we put "12" into the buffer and - // increase kappa by 1. - DiyFp one = DiyFp(static_cast(1) << -w.e(), w.e()); - // Division by one is a shift. - uint32_t integrals = static_cast(w.f() >> -one.e()); - // Modulo by one is an and. - uint64_t fractionals = w.f() & (one.f() - 1); - uint32_t divisor; - int divisor_exponent_plus_one; - BiggestPowerTen(integrals, DiyFp::kSignificandSize - (-one.e()), - &divisor, &divisor_exponent_plus_one); - *kappa = divisor_exponent_plus_one; - *length = 0; - - // Loop invariant: buffer = w / 10^kappa (integer division) - // The invariant holds for the first iteration: kappa has been initialized - // with the divisor exponent + 1. And the divisor is the biggest power of ten - // that is smaller than 'integrals'. - while (*kappa > 0) { - int digit = integrals / divisor; - ASSERT(digit <= 9); - buffer[*length] = static_cast('0' + digit); - (*length)++; - requested_digits--; - integrals %= divisor; - (*kappa)--; - // Note that kappa now equals the exponent of the divisor and that the - // invariant thus holds again. - if (requested_digits == 0) break; - divisor /= 10; - } - - if (requested_digits == 0) { - uint64_t rest = - (static_cast(integrals) << -one.e()) + fractionals; - return RoundWeedCounted(buffer, *length, rest, - static_cast(divisor) << -one.e(), w_error, - kappa); - } - - // The integrals have been generated. We are at the point of the decimal - // separator. In the following loop we simply multiply the remaining digits by - // 10 and divide by one. We just need to pay attention to multiply associated - // data (the 'unit'), too. - // Note that the multiplication by 10 does not overflow, because w.e >= -60 - // and thus one.e >= -60. - ASSERT(one.e() >= -60); - ASSERT(fractionals < one.f()); - ASSERT(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f()); - while (requested_digits > 0 && fractionals > w_error) { - fractionals *= 10; - w_error *= 10; - // Integer division by one. - int digit = static_cast(fractionals >> -one.e()); - ASSERT(digit <= 9); - buffer[*length] = static_cast('0' + digit); - (*length)++; - requested_digits--; - fractionals &= one.f() - 1; // Modulo by one. - (*kappa)--; - } - if (requested_digits != 0) return false; - return RoundWeedCounted(buffer, *length, fractionals, one.f(), w_error, - kappa); -} - - -// Provides a decimal representation of v. -// Returns true if it succeeds, otherwise the result cannot be trusted. -// There will be *length digits inside the buffer (not null-terminated). -// If the function returns true then -// v == (double) (buffer * 10^decimal_exponent). -// The digits in the buffer are the shortest representation possible: no -// 0.09999999999999999 instead of 0.1. The shorter representation will even be -// chosen even if the longer one would be closer to v. -// The last digit will be closest to the actual v. That is, even if several -// digits might correctly yield 'v' when read again, the closest will be -// computed. -static bool Grisu3(double v, - FastDtoaMode mode, - Vector buffer, - int* length, - int* decimal_exponent) { - DiyFp w = Double(v).AsNormalizedDiyFp(); - // boundary_minus and boundary_plus are the boundaries between v and its - // closest floating-point neighbors. Any number strictly between - // boundary_minus and boundary_plus will round to v when convert to a double. - // Grisu3 will never output representations that lie exactly on a boundary. - DiyFp boundary_minus, boundary_plus; - if (mode == FAST_DTOA_SHORTEST) { - Double(v).NormalizedBoundaries(&boundary_minus, &boundary_plus); - } else { - ASSERT(mode == FAST_DTOA_SHORTEST_SINGLE); - float single_v = static_cast(v); - Single(single_v).NormalizedBoundaries(&boundary_minus, &boundary_plus); - } - ASSERT(boundary_plus.e() == w.e()); - DiyFp ten_mk; // Cached power of ten: 10^-k - int mk; // -k - int ten_mk_minimal_binary_exponent = - kMinimalTargetExponent - (w.e() + DiyFp::kSignificandSize); - int ten_mk_maximal_binary_exponent = - kMaximalTargetExponent - (w.e() + DiyFp::kSignificandSize); - PowersOfTenCache::GetCachedPowerForBinaryExponentRange( - ten_mk_minimal_binary_exponent, - ten_mk_maximal_binary_exponent, - &ten_mk, &mk); - ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() + - DiyFp::kSignificandSize) && - (kMaximalTargetExponent >= w.e() + ten_mk.e() + - DiyFp::kSignificandSize)); - // Note that ten_mk is only an approximation of 10^-k. A DiyFp only contains a - // 64 bit significand and ten_mk is thus only precise up to 64 bits. - - // The DiyFp::Times procedure rounds its result, and ten_mk is approximated - // too. The variable scaled_w (as well as scaled_boundary_minus/plus) are now - // off by a small amount. - // In fact: scaled_w - w*10^k < 1ulp (unit in the last place) of scaled_w. - // In other words: let f = scaled_w.f() and e = scaled_w.e(), then - // (f-1) * 2^e < w*10^k < (f+1) * 2^e - DiyFp scaled_w = DiyFp::Times(w, ten_mk); - ASSERT(scaled_w.e() == - boundary_plus.e() + ten_mk.e() + DiyFp::kSignificandSize); - // In theory it would be possible to avoid some recomputations by computing - // the difference between w and boundary_minus/plus (a power of 2) and to - // compute scaled_boundary_minus/plus by subtracting/adding from - // scaled_w. However the code becomes much less readable and the speed - // enhancements are not terriffic. - DiyFp scaled_boundary_minus = DiyFp::Times(boundary_minus, ten_mk); - DiyFp scaled_boundary_plus = DiyFp::Times(boundary_plus, ten_mk); - - // DigitGen will generate the digits of scaled_w. Therefore we have - // v == (double) (scaled_w * 10^-mk). - // Set decimal_exponent == -mk and pass it to DigitGen. If scaled_w is not an - // integer than it will be updated. For instance if scaled_w == 1.23 then - // the buffer will be filled with "123" und the decimal_exponent will be - // decreased by 2. - int kappa; - bool result = DigitGen(scaled_boundary_minus, scaled_w, scaled_boundary_plus, - buffer, length, &kappa); - *decimal_exponent = -mk + kappa; - return result; -} - - -// The "counted" version of grisu3 (see above) only generates requested_digits -// number of digits. This version does not generate the shortest representation, -// and with enough requested digits 0.1 will at some point print as 0.9999999... -// Grisu3 is too imprecise for real halfway cases (1.5 will not work) and -// therefore the rounding strategy for halfway cases is irrelevant. -static bool Grisu3Counted(double v, - int requested_digits, - Vector buffer, - int* length, - int* decimal_exponent) { - DiyFp w = Double(v).AsNormalizedDiyFp(); - DiyFp ten_mk; // Cached power of ten: 10^-k - int mk; // -k - int ten_mk_minimal_binary_exponent = - kMinimalTargetExponent - (w.e() + DiyFp::kSignificandSize); - int ten_mk_maximal_binary_exponent = - kMaximalTargetExponent - (w.e() + DiyFp::kSignificandSize); - PowersOfTenCache::GetCachedPowerForBinaryExponentRange( - ten_mk_minimal_binary_exponent, - ten_mk_maximal_binary_exponent, - &ten_mk, &mk); - ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() + - DiyFp::kSignificandSize) && - (kMaximalTargetExponent >= w.e() + ten_mk.e() + - DiyFp::kSignificandSize)); - // Note that ten_mk is only an approximation of 10^-k. A DiyFp only contains a - // 64 bit significand and ten_mk is thus only precise up to 64 bits. - - // The DiyFp::Times procedure rounds its result, and ten_mk is approximated - // too. The variable scaled_w (as well as scaled_boundary_minus/plus) are now - // off by a small amount. - // In fact: scaled_w - w*10^k < 1ulp (unit in the last place) of scaled_w. - // In other words: let f = scaled_w.f() and e = scaled_w.e(), then - // (f-1) * 2^e < w*10^k < (f+1) * 2^e - DiyFp scaled_w = DiyFp::Times(w, ten_mk); - - // We now have (double) (scaled_w * 10^-mk). - // DigitGen will generate the first requested_digits digits of scaled_w and - // return together with a kappa such that scaled_w ~= buffer * 10^kappa. (It - // will not always be exactly the same since DigitGenCounted only produces a - // limited number of digits.) - int kappa; - bool result = DigitGenCounted(scaled_w, requested_digits, - buffer, length, &kappa); - *decimal_exponent = -mk + kappa; - return result; -} - - -bool FastDtoa(double v, - FastDtoaMode mode, - int requested_digits, - Vector buffer, - int* length, - int* decimal_point) { - ASSERT(v > 0); - ASSERT(!Double(v).IsSpecial()); - - bool result = false; - int decimal_exponent = 0; - switch (mode) { - case FAST_DTOA_SHORTEST: - case FAST_DTOA_SHORTEST_SINGLE: - result = Grisu3(v, mode, buffer, length, &decimal_exponent); - break; - case FAST_DTOA_PRECISION: - result = Grisu3Counted(v, requested_digits, - buffer, length, &decimal_exponent); - break; - default: - UNREACHABLE(); - } - if (result) { - *decimal_point = *length + decimal_exponent; - buffer[*length] = '\0'; - } - return result; -} - -} // namespace double_conversion diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/fast-dtoa.h b/ios/Pods/Flipper-DoubleConversion/double-conversion/fast-dtoa.h deleted file mode 100644 index 5f1e8ee..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/fast-dtoa.h +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_FAST_DTOA_H_ -#define DOUBLE_CONVERSION_FAST_DTOA_H_ - -#include "utils.h" - -namespace double_conversion { - -enum FastDtoaMode { - // Computes the shortest representation of the given input. The returned - // result will be the most accurate number of this length. Longer - // representations might be more accurate. - FAST_DTOA_SHORTEST, - // Same as FAST_DTOA_SHORTEST but for single-precision floats. - FAST_DTOA_SHORTEST_SINGLE, - // Computes a representation where the precision (number of digits) is - // given as input. The precision is independent of the decimal point. - FAST_DTOA_PRECISION -}; - -// FastDtoa will produce at most kFastDtoaMaximalLength digits. This does not -// include the terminating '\0' character. -static const int kFastDtoaMaximalLength = 17; -// Same for single-precision numbers. -static const int kFastDtoaMaximalSingleLength = 9; - -// Provides a decimal representation of v. -// The result should be interpreted as buffer * 10^(point - length). -// -// Precondition: -// * v must be a strictly positive finite double. -// -// Returns true if it succeeds, otherwise the result can not be trusted. -// There will be *length digits inside the buffer followed by a null terminator. -// If the function returns true and mode equals -// - FAST_DTOA_SHORTEST, then -// the parameter requested_digits is ignored. -// The result satisfies -// v == (double) (buffer * 10^(point - length)). -// The digits in the buffer are the shortest representation possible. E.g. -// if 0.099999999999 and 0.1 represent the same double then "1" is returned -// with point = 0. -// The last digit will be closest to the actual v. That is, even if several -// digits might correctly yield 'v' when read again, the buffer will contain -// the one closest to v. -// - FAST_DTOA_PRECISION, then -// the buffer contains requested_digits digits. -// the difference v - (buffer * 10^(point-length)) is closest to zero for -// all possible representations of requested_digits digits. -// If there are two values that are equally close, then FastDtoa returns -// false. -// For both modes the buffer must be large enough to hold the result. -bool FastDtoa(double d, - FastDtoaMode mode, - int requested_digits, - Vector buffer, - int* length, - int* decimal_point); - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_FAST_DTOA_H_ diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/fixed-dtoa.cc b/ios/Pods/Flipper-DoubleConversion/double-conversion/fixed-dtoa.cc deleted file mode 100644 index aef65fd..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/fixed-dtoa.cc +++ /dev/null @@ -1,404 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include - -#include "fixed-dtoa.h" -#include "ieee.h" - -namespace double_conversion { - -// Represents a 128bit type. This class should be replaced by a native type on -// platforms that support 128bit integers. -class UInt128 { - public: - UInt128() : high_bits_(0), low_bits_(0) { } - UInt128(uint64_t high, uint64_t low) : high_bits_(high), low_bits_(low) { } - - void Multiply(uint32_t multiplicand) { - uint64_t accumulator; - - accumulator = (low_bits_ & kMask32) * multiplicand; - uint32_t part = static_cast(accumulator & kMask32); - accumulator >>= 32; - accumulator = accumulator + (low_bits_ >> 32) * multiplicand; - low_bits_ = (accumulator << 32) + part; - accumulator >>= 32; - accumulator = accumulator + (high_bits_ & kMask32) * multiplicand; - part = static_cast(accumulator & kMask32); - accumulator >>= 32; - accumulator = accumulator + (high_bits_ >> 32) * multiplicand; - high_bits_ = (accumulator << 32) + part; - ASSERT((accumulator >> 32) == 0); - } - - void Shift(int shift_amount) { - ASSERT(-64 <= shift_amount && shift_amount <= 64); - if (shift_amount == 0) { - return; - } else if (shift_amount == -64) { - high_bits_ = low_bits_; - low_bits_ = 0; - } else if (shift_amount == 64) { - low_bits_ = high_bits_; - high_bits_ = 0; - } else if (shift_amount <= 0) { - high_bits_ <<= -shift_amount; - high_bits_ += low_bits_ >> (64 + shift_amount); - low_bits_ <<= -shift_amount; - } else { - low_bits_ >>= shift_amount; - low_bits_ += high_bits_ << (64 - shift_amount); - high_bits_ >>= shift_amount; - } - } - - // Modifies *this to *this MOD (2^power). - // Returns *this DIV (2^power). - int DivModPowerOf2(int power) { - if (power >= 64) { - int result = static_cast(high_bits_ >> (power - 64)); - high_bits_ -= static_cast(result) << (power - 64); - return result; - } else { - uint64_t part_low = low_bits_ >> power; - uint64_t part_high = high_bits_ << (64 - power); - int result = static_cast(part_low + part_high); - high_bits_ = 0; - low_bits_ -= part_low << power; - return result; - } - } - - bool IsZero() const { - return high_bits_ == 0 && low_bits_ == 0; - } - - int BitAt(int position) { - if (position >= 64) { - return static_cast(high_bits_ >> (position - 64)) & 1; - } else { - return static_cast(low_bits_ >> position) & 1; - } - } - - private: - static const uint64_t kMask32 = 0xFFFFFFFF; - // Value == (high_bits_ << 64) + low_bits_ - uint64_t high_bits_; - uint64_t low_bits_; -}; - - -static const int kDoubleSignificandSize = 53; // Includes the hidden bit. - - -static void FillDigits32FixedLength(uint32_t number, int requested_length, - Vector buffer, int* length) { - for (int i = requested_length - 1; i >= 0; --i) { - buffer[(*length) + i] = '0' + number % 10; - number /= 10; - } - *length += requested_length; -} - - -static void FillDigits32(uint32_t number, Vector buffer, int* length) { - int number_length = 0; - // We fill the digits in reverse order and exchange them afterwards. - while (number != 0) { - int digit = number % 10; - number /= 10; - buffer[(*length) + number_length] = static_cast('0' + digit); - number_length++; - } - // Exchange the digits. - int i = *length; - int j = *length + number_length - 1; - while (i < j) { - char tmp = buffer[i]; - buffer[i] = buffer[j]; - buffer[j] = tmp; - i++; - j--; - } - *length += number_length; -} - - -static void FillDigits64FixedLength(uint64_t number, - Vector buffer, int* length) { - const uint32_t kTen7 = 10000000; - // For efficiency cut the number into 3 uint32_t parts, and print those. - uint32_t part2 = static_cast(number % kTen7); - number /= kTen7; - uint32_t part1 = static_cast(number % kTen7); - uint32_t part0 = static_cast(number / kTen7); - - FillDigits32FixedLength(part0, 3, buffer, length); - FillDigits32FixedLength(part1, 7, buffer, length); - FillDigits32FixedLength(part2, 7, buffer, length); -} - - -static void FillDigits64(uint64_t number, Vector buffer, int* length) { - const uint32_t kTen7 = 10000000; - // For efficiency cut the number into 3 uint32_t parts, and print those. - uint32_t part2 = static_cast(number % kTen7); - number /= kTen7; - uint32_t part1 = static_cast(number % kTen7); - uint32_t part0 = static_cast(number / kTen7); - - if (part0 != 0) { - FillDigits32(part0, buffer, length); - FillDigits32FixedLength(part1, 7, buffer, length); - FillDigits32FixedLength(part2, 7, buffer, length); - } else if (part1 != 0) { - FillDigits32(part1, buffer, length); - FillDigits32FixedLength(part2, 7, buffer, length); - } else { - FillDigits32(part2, buffer, length); - } -} - - -static void RoundUp(Vector buffer, int* length, int* decimal_point) { - // An empty buffer represents 0. - if (*length == 0) { - buffer[0] = '1'; - *decimal_point = 1; - *length = 1; - return; - } - // Round the last digit until we either have a digit that was not '9' or until - // we reached the first digit. - buffer[(*length) - 1]++; - for (int i = (*length) - 1; i > 0; --i) { - if (buffer[i] != '0' + 10) { - return; - } - buffer[i] = '0'; - buffer[i - 1]++; - } - // If the first digit is now '0' + 10, we would need to set it to '0' and add - // a '1' in front. However we reach the first digit only if all following - // digits had been '9' before rounding up. Now all trailing digits are '0' and - // we simply switch the first digit to '1' and update the decimal-point - // (indicating that the point is now one digit to the right). - if (buffer[0] == '0' + 10) { - buffer[0] = '1'; - (*decimal_point)++; - } -} - - -// The given fractionals number represents a fixed-point number with binary -// point at bit (-exponent). -// Preconditions: -// -128 <= exponent <= 0. -// 0 <= fractionals * 2^exponent < 1 -// The buffer holds the result. -// The function will round its result. During the rounding-process digits not -// generated by this function might be updated, and the decimal-point variable -// might be updated. If this function generates the digits 99 and the buffer -// already contained "199" (thus yielding a buffer of "19999") then a -// rounding-up will change the contents of the buffer to "20000". -static void FillFractionals(uint64_t fractionals, int exponent, - int fractional_count, Vector buffer, - int* length, int* decimal_point) { - ASSERT(-128 <= exponent && exponent <= 0); - // 'fractionals' is a fixed-point number, with binary point at bit - // (-exponent). Inside the function the non-converted remainder of fractionals - // is a fixed-point number, with binary point at bit 'point'. - if (-exponent <= 64) { - // One 64 bit number is sufficient. - ASSERT(fractionals >> 56 == 0); - int point = -exponent; - for (int i = 0; i < fractional_count; ++i) { - if (fractionals == 0) break; - // Instead of multiplying by 10 we multiply by 5 and adjust the point - // location. This way the fractionals variable will not overflow. - // Invariant at the beginning of the loop: fractionals < 2^point. - // Initially we have: point <= 64 and fractionals < 2^56 - // After each iteration the point is decremented by one. - // Note that 5^3 = 125 < 128 = 2^7. - // Therefore three iterations of this loop will not overflow fractionals - // (even without the subtraction at the end of the loop body). At this - // time point will satisfy point <= 61 and therefore fractionals < 2^point - // and any further multiplication of fractionals by 5 will not overflow. - fractionals *= 5; - point--; - int digit = static_cast(fractionals >> point); - ASSERT(digit <= 9); - buffer[*length] = static_cast('0' + digit); - (*length)++; - fractionals -= static_cast(digit) << point; - } - // If the first bit after the point is set we have to round up. - if (((fractionals >> (point - 1)) & 1) == 1) { - RoundUp(buffer, length, decimal_point); - } - } else { // We need 128 bits. - ASSERT(64 < -exponent && -exponent <= 128); - UInt128 fractionals128 = UInt128(fractionals, 0); - fractionals128.Shift(-exponent - 64); - int point = 128; - for (int i = 0; i < fractional_count; ++i) { - if (fractionals128.IsZero()) break; - // As before: instead of multiplying by 10 we multiply by 5 and adjust the - // point location. - // This multiplication will not overflow for the same reasons as before. - fractionals128.Multiply(5); - point--; - int digit = fractionals128.DivModPowerOf2(point); - ASSERT(digit <= 9); - buffer[*length] = static_cast('0' + digit); - (*length)++; - } - if (fractionals128.BitAt(point - 1) == 1) { - RoundUp(buffer, length, decimal_point); - } - } -} - - -// Removes leading and trailing zeros. -// If leading zeros are removed then the decimal point position is adjusted. -static void TrimZeros(Vector buffer, int* length, int* decimal_point) { - while (*length > 0 && buffer[(*length) - 1] == '0') { - (*length)--; - } - int first_non_zero = 0; - while (first_non_zero < *length && buffer[first_non_zero] == '0') { - first_non_zero++; - } - if (first_non_zero != 0) { - for (int i = first_non_zero; i < *length; ++i) { - buffer[i - first_non_zero] = buffer[i]; - } - *length -= first_non_zero; - *decimal_point -= first_non_zero; - } -} - - -bool FastFixedDtoa(double v, - int fractional_count, - Vector buffer, - int* length, - int* decimal_point) { - const uint32_t kMaxUInt32 = 0xFFFFFFFF; - uint64_t significand = Double(v).Significand(); - int exponent = Double(v).Exponent(); - // v = significand * 2^exponent (with significand a 53bit integer). - // If the exponent is larger than 20 (i.e. we may have a 73bit number) then we - // don't know how to compute the representation. 2^73 ~= 9.5*10^21. - // If necessary this limit could probably be increased, but we don't need - // more. - if (exponent > 20) return false; - if (fractional_count > 20) return false; - *length = 0; - // At most kDoubleSignificandSize bits of the significand are non-zero. - // Given a 64 bit integer we have 11 0s followed by 53 potentially non-zero - // bits: 0..11*..0xxx..53*..xx - if (exponent + kDoubleSignificandSize > 64) { - // The exponent must be > 11. - // - // We know that v = significand * 2^exponent. - // And the exponent > 11. - // We simplify the task by dividing v by 10^17. - // The quotient delivers the first digits, and the remainder fits into a 64 - // bit number. - // Dividing by 10^17 is equivalent to dividing by 5^17*2^17. - const uint64_t kFive17 = UINT64_2PART_C(0xB1, A2BC2EC5); // 5^17 - uint64_t divisor = kFive17; - int divisor_power = 17; - uint64_t dividend = significand; - uint32_t quotient; - uint64_t remainder; - // Let v = f * 2^e with f == significand and e == exponent. - // Then need q (quotient) and r (remainder) as follows: - // v = q * 10^17 + r - // f * 2^e = q * 10^17 + r - // f * 2^e = q * 5^17 * 2^17 + r - // If e > 17 then - // f * 2^(e-17) = q * 5^17 + r/2^17 - // else - // f = q * 5^17 * 2^(17-e) + r/2^e - if (exponent > divisor_power) { - // We only allow exponents of up to 20 and therefore (17 - e) <= 3 - dividend <<= exponent - divisor_power; - quotient = static_cast(dividend / divisor); - remainder = (dividend % divisor) << divisor_power; - } else { - divisor <<= divisor_power - exponent; - quotient = static_cast(dividend / divisor); - remainder = (dividend % divisor) << exponent; - } - FillDigits32(quotient, buffer, length); - FillDigits64FixedLength(remainder, buffer, length); - *decimal_point = *length; - } else if (exponent >= 0) { - // 0 <= exponent <= 11 - significand <<= exponent; - FillDigits64(significand, buffer, length); - *decimal_point = *length; - } else if (exponent > -kDoubleSignificandSize) { - // We have to cut the number. - uint64_t integrals = significand >> -exponent; - uint64_t fractionals = significand - (integrals << -exponent); - if (integrals > kMaxUInt32) { - FillDigits64(integrals, buffer, length); - } else { - FillDigits32(static_cast(integrals), buffer, length); - } - *decimal_point = *length; - FillFractionals(fractionals, exponent, fractional_count, - buffer, length, decimal_point); - } else if (exponent < -128) { - // This configuration (with at most 20 digits) means that all digits must be - // 0. - ASSERT(fractional_count <= 20); - buffer[0] = '\0'; - *length = 0; - *decimal_point = -fractional_count; - } else { - *decimal_point = 0; - FillFractionals(significand, exponent, fractional_count, - buffer, length, decimal_point); - } - TrimZeros(buffer, length, decimal_point); - buffer[*length] = '\0'; - if ((*length) == 0) { - // The string is empty and the decimal_point thus has no importance. Mimick - // Gay's dtoa and and set it to -fractional_count. - *decimal_point = -fractional_count; - } - return true; -} - -} // namespace double_conversion diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/fixed-dtoa.h b/ios/Pods/Flipper-DoubleConversion/double-conversion/fixed-dtoa.h deleted file mode 100644 index 3bdd08e..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/fixed-dtoa.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_FIXED_DTOA_H_ -#define DOUBLE_CONVERSION_FIXED_DTOA_H_ - -#include "utils.h" - -namespace double_conversion { - -// Produces digits necessary to print a given number with -// 'fractional_count' digits after the decimal point. -// The buffer must be big enough to hold the result plus one terminating null -// character. -// -// The produced digits might be too short in which case the caller has to fill -// the gaps with '0's. -// Example: FastFixedDtoa(0.001, 5, ...) is allowed to return buffer = "1", and -// decimal_point = -2. -// Halfway cases are rounded towards +/-Infinity (away from 0). The call -// FastFixedDtoa(0.15, 2, ...) thus returns buffer = "2", decimal_point = 0. -// The returned buffer may contain digits that would be truncated from the -// shortest representation of the input. -// -// This method only works for some parameters. If it can't handle the input it -// returns false. The output is null-terminated when the function succeeds. -bool FastFixedDtoa(double v, int fractional_count, - Vector buffer, int* length, int* decimal_point); - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_FIXED_DTOA_H_ diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/ieee.h b/ios/Pods/Flipper-DoubleConversion/double-conversion/ieee.h deleted file mode 100644 index 661141d..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/ieee.h +++ /dev/null @@ -1,402 +0,0 @@ -// Copyright 2012 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_DOUBLE_H_ -#define DOUBLE_CONVERSION_DOUBLE_H_ - -#include "diy-fp.h" - -namespace double_conversion { - -// We assume that doubles and uint64_t have the same endianness. -static uint64_t double_to_uint64(double d) { return BitCast(d); } -static double uint64_to_double(uint64_t d64) { return BitCast(d64); } -static uint32_t float_to_uint32(float f) { return BitCast(f); } -static float uint32_to_float(uint32_t d32) { return BitCast(d32); } - -// Helper functions for doubles. -class Double { - public: - static const uint64_t kSignMask = UINT64_2PART_C(0x80000000, 00000000); - static const uint64_t kExponentMask = UINT64_2PART_C(0x7FF00000, 00000000); - static const uint64_t kSignificandMask = UINT64_2PART_C(0x000FFFFF, FFFFFFFF); - static const uint64_t kHiddenBit = UINT64_2PART_C(0x00100000, 00000000); - static const int kPhysicalSignificandSize = 52; // Excludes the hidden bit. - static const int kSignificandSize = 53; - - Double() : d64_(0) {} - explicit Double(double d) : d64_(double_to_uint64(d)) {} - explicit Double(uint64_t d64) : d64_(d64) {} - explicit Double(DiyFp diy_fp) - : d64_(DiyFpToUint64(diy_fp)) {} - - // The value encoded by this Double must be greater or equal to +0.0. - // It must not be special (infinity, or NaN). - DiyFp AsDiyFp() const { - ASSERT(Sign() > 0); - ASSERT(!IsSpecial()); - return DiyFp(Significand(), Exponent()); - } - - // The value encoded by this Double must be strictly greater than 0. - DiyFp AsNormalizedDiyFp() const { - ASSERT(value() > 0.0); - uint64_t f = Significand(); - int e = Exponent(); - - // The current double could be a denormal. - while ((f & kHiddenBit) == 0) { - f <<= 1; - e--; - } - // Do the final shifts in one go. - f <<= DiyFp::kSignificandSize - kSignificandSize; - e -= DiyFp::kSignificandSize - kSignificandSize; - return DiyFp(f, e); - } - - // Returns the double's bit as uint64. - uint64_t AsUint64() const { - return d64_; - } - - // Returns the next greater double. Returns +infinity on input +infinity. - double NextDouble() const { - if (d64_ == kInfinity) return Double(kInfinity).value(); - if (Sign() < 0 && Significand() == 0) { - // -0.0 - return 0.0; - } - if (Sign() < 0) { - return Double(d64_ - 1).value(); - } else { - return Double(d64_ + 1).value(); - } - } - - double PreviousDouble() const { - if (d64_ == (kInfinity | kSignMask)) return -Double::Infinity(); - if (Sign() < 0) { - return Double(d64_ + 1).value(); - } else { - if (Significand() == 0) return -0.0; - return Double(d64_ - 1).value(); - } - } - - int Exponent() const { - if (IsDenormal()) return kDenormalExponent; - - uint64_t d64 = AsUint64(); - int biased_e = - static_cast((d64 & kExponentMask) >> kPhysicalSignificandSize); - return biased_e - kExponentBias; - } - - uint64_t Significand() const { - uint64_t d64 = AsUint64(); - uint64_t significand = d64 & kSignificandMask; - if (!IsDenormal()) { - return significand + kHiddenBit; - } else { - return significand; - } - } - - // Returns true if the double is a denormal. - bool IsDenormal() const { - uint64_t d64 = AsUint64(); - return (d64 & kExponentMask) == 0; - } - - // We consider denormals not to be special. - // Hence only Infinity and NaN are special. - bool IsSpecial() const { - uint64_t d64 = AsUint64(); - return (d64 & kExponentMask) == kExponentMask; - } - - bool IsNan() const { - uint64_t d64 = AsUint64(); - return ((d64 & kExponentMask) == kExponentMask) && - ((d64 & kSignificandMask) != 0); - } - - bool IsInfinite() const { - uint64_t d64 = AsUint64(); - return ((d64 & kExponentMask) == kExponentMask) && - ((d64 & kSignificandMask) == 0); - } - - int Sign() const { - uint64_t d64 = AsUint64(); - return (d64 & kSignMask) == 0? 1: -1; - } - - // Precondition: the value encoded by this Double must be greater or equal - // than +0.0. - DiyFp UpperBoundary() const { - ASSERT(Sign() > 0); - return DiyFp(Significand() * 2 + 1, Exponent() - 1); - } - - // Computes the two boundaries of this. - // The bigger boundary (m_plus) is normalized. The lower boundary has the same - // exponent as m_plus. - // Precondition: the value encoded by this Double must be greater than 0. - void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const { - ASSERT(value() > 0.0); - DiyFp v = this->AsDiyFp(); - DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1)); - DiyFp m_minus; - if (LowerBoundaryIsCloser()) { - m_minus = DiyFp((v.f() << 2) - 1, v.e() - 2); - } else { - m_minus = DiyFp((v.f() << 1) - 1, v.e() - 1); - } - m_minus.set_f(m_minus.f() << (m_minus.e() - m_plus.e())); - m_minus.set_e(m_plus.e()); - *out_m_plus = m_plus; - *out_m_minus = m_minus; - } - - bool LowerBoundaryIsCloser() const { - // The boundary is closer if the significand is of the form f == 2^p-1 then - // the lower boundary is closer. - // Think of v = 1000e10 and v- = 9999e9. - // Then the boundary (== (v - v-)/2) is not just at a distance of 1e9 but - // at a distance of 1e8. - // The only exception is for the smallest normal: the largest denormal is - // at the same distance as its successor. - // Note: denormals have the same exponent as the smallest normals. - bool physical_significand_is_zero = ((AsUint64() & kSignificandMask) == 0); - return physical_significand_is_zero && (Exponent() != kDenormalExponent); - } - - double value() const { return uint64_to_double(d64_); } - - // Returns the significand size for a given order of magnitude. - // If v = f*2^e with 2^p-1 <= f <= 2^p then p+e is v's order of magnitude. - // This function returns the number of significant binary digits v will have - // once it's encoded into a double. In almost all cases this is equal to - // kSignificandSize. The only exceptions are denormals. They start with - // leading zeroes and their effective significand-size is hence smaller. - static int SignificandSizeForOrderOfMagnitude(int order) { - if (order >= (kDenormalExponent + kSignificandSize)) { - return kSignificandSize; - } - if (order <= kDenormalExponent) return 0; - return order - kDenormalExponent; - } - - static double Infinity() { - return Double(kInfinity).value(); - } - - static double NaN() { - return Double(kNaN).value(); - } - - private: - static const int kExponentBias = 0x3FF + kPhysicalSignificandSize; - static const int kDenormalExponent = -kExponentBias + 1; - static const int kMaxExponent = 0x7FF - kExponentBias; - static const uint64_t kInfinity = UINT64_2PART_C(0x7FF00000, 00000000); - static const uint64_t kNaN = UINT64_2PART_C(0x7FF80000, 00000000); - - const uint64_t d64_; - - static uint64_t DiyFpToUint64(DiyFp diy_fp) { - uint64_t significand = diy_fp.f(); - int exponent = diy_fp.e(); - while (significand > kHiddenBit + kSignificandMask) { - significand >>= 1; - exponent++; - } - if (exponent >= kMaxExponent) { - return kInfinity; - } - if (exponent < kDenormalExponent) { - return 0; - } - while (exponent > kDenormalExponent && (significand & kHiddenBit) == 0) { - significand <<= 1; - exponent--; - } - uint64_t biased_exponent; - if (exponent == kDenormalExponent && (significand & kHiddenBit) == 0) { - biased_exponent = 0; - } else { - biased_exponent = static_cast(exponent + kExponentBias); - } - return (significand & kSignificandMask) | - (biased_exponent << kPhysicalSignificandSize); - } - - DISALLOW_COPY_AND_ASSIGN(Double); -}; - -class Single { - public: - static const uint32_t kSignMask = 0x80000000; - static const uint32_t kExponentMask = 0x7F800000; - static const uint32_t kSignificandMask = 0x007FFFFF; - static const uint32_t kHiddenBit = 0x00800000; - static const int kPhysicalSignificandSize = 23; // Excludes the hidden bit. - static const int kSignificandSize = 24; - - Single() : d32_(0) {} - explicit Single(float f) : d32_(float_to_uint32(f)) {} - explicit Single(uint32_t d32) : d32_(d32) {} - - // The value encoded by this Single must be greater or equal to +0.0. - // It must not be special (infinity, or NaN). - DiyFp AsDiyFp() const { - ASSERT(Sign() > 0); - ASSERT(!IsSpecial()); - return DiyFp(Significand(), Exponent()); - } - - // Returns the single's bit as uint64. - uint32_t AsUint32() const { - return d32_; - } - - int Exponent() const { - if (IsDenormal()) return kDenormalExponent; - - uint32_t d32 = AsUint32(); - int biased_e = - static_cast((d32 & kExponentMask) >> kPhysicalSignificandSize); - return biased_e - kExponentBias; - } - - uint32_t Significand() const { - uint32_t d32 = AsUint32(); - uint32_t significand = d32 & kSignificandMask; - if (!IsDenormal()) { - return significand + kHiddenBit; - } else { - return significand; - } - } - - // Returns true if the single is a denormal. - bool IsDenormal() const { - uint32_t d32 = AsUint32(); - return (d32 & kExponentMask) == 0; - } - - // We consider denormals not to be special. - // Hence only Infinity and NaN are special. - bool IsSpecial() const { - uint32_t d32 = AsUint32(); - return (d32 & kExponentMask) == kExponentMask; - } - - bool IsNan() const { - uint32_t d32 = AsUint32(); - return ((d32 & kExponentMask) == kExponentMask) && - ((d32 & kSignificandMask) != 0); - } - - bool IsInfinite() const { - uint32_t d32 = AsUint32(); - return ((d32 & kExponentMask) == kExponentMask) && - ((d32 & kSignificandMask) == 0); - } - - int Sign() const { - uint32_t d32 = AsUint32(); - return (d32 & kSignMask) == 0? 1: -1; - } - - // Computes the two boundaries of this. - // The bigger boundary (m_plus) is normalized. The lower boundary has the same - // exponent as m_plus. - // Precondition: the value encoded by this Single must be greater than 0. - void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const { - ASSERT(value() > 0.0); - DiyFp v = this->AsDiyFp(); - DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1)); - DiyFp m_minus; - if (LowerBoundaryIsCloser()) { - m_minus = DiyFp((v.f() << 2) - 1, v.e() - 2); - } else { - m_minus = DiyFp((v.f() << 1) - 1, v.e() - 1); - } - m_minus.set_f(m_minus.f() << (m_minus.e() - m_plus.e())); - m_minus.set_e(m_plus.e()); - *out_m_plus = m_plus; - *out_m_minus = m_minus; - } - - // Precondition: the value encoded by this Single must be greater or equal - // than +0.0. - DiyFp UpperBoundary() const { - ASSERT(Sign() > 0); - return DiyFp(Significand() * 2 + 1, Exponent() - 1); - } - - bool LowerBoundaryIsCloser() const { - // The boundary is closer if the significand is of the form f == 2^p-1 then - // the lower boundary is closer. - // Think of v = 1000e10 and v- = 9999e9. - // Then the boundary (== (v - v-)/2) is not just at a distance of 1e9 but - // at a distance of 1e8. - // The only exception is for the smallest normal: the largest denormal is - // at the same distance as its successor. - // Note: denormals have the same exponent as the smallest normals. - bool physical_significand_is_zero = ((AsUint32() & kSignificandMask) == 0); - return physical_significand_is_zero && (Exponent() != kDenormalExponent); - } - - float value() const { return uint32_to_float(d32_); } - - static float Infinity() { - return Single(kInfinity).value(); - } - - static float NaN() { - return Single(kNaN).value(); - } - - private: - static const int kExponentBias = 0x7F + kPhysicalSignificandSize; - static const int kDenormalExponent = -kExponentBias + 1; - static const int kMaxExponent = 0xFF - kExponentBias; - static const uint32_t kInfinity = 0x7F800000; - static const uint32_t kNaN = 0x7FC00000; - - const uint32_t d32_; - - DISALLOW_COPY_AND_ASSIGN(Single); -}; - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_DOUBLE_H_ diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/strtod.cc b/ios/Pods/Flipper-DoubleConversion/double-conversion/strtod.cc deleted file mode 100644 index 17abcbb..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/strtod.cc +++ /dev/null @@ -1,555 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#include -#include - -#include "strtod.h" -#include "bignum.h" -#include "cached-powers.h" -#include "ieee.h" - -namespace double_conversion { - -// 2^53 = 9007199254740992. -// Any integer with at most 15 decimal digits will hence fit into a double -// (which has a 53bit significand) without loss of precision. -static const int kMaxExactDoubleIntegerDecimalDigits = 15; -// 2^64 = 18446744073709551616 > 10^19 -static const int kMaxUint64DecimalDigits = 19; - -// Max double: 1.7976931348623157 x 10^308 -// Min non-zero double: 4.9406564584124654 x 10^-324 -// Any x >= 10^309 is interpreted as +infinity. -// Any x <= 10^-324 is interpreted as 0. -// Note that 2.5e-324 (despite being smaller than the min double) will be read -// as non-zero (equal to the min non-zero double). -static const int kMaxDecimalPower = 309; -static const int kMinDecimalPower = -324; - -// 2^64 = 18446744073709551616 -static const uint64_t kMaxUint64 = UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF); - - -static const double exact_powers_of_ten[] = { - 1.0, // 10^0 - 10.0, - 100.0, - 1000.0, - 10000.0, - 100000.0, - 1000000.0, - 10000000.0, - 100000000.0, - 1000000000.0, - 10000000000.0, // 10^10 - 100000000000.0, - 1000000000000.0, - 10000000000000.0, - 100000000000000.0, - 1000000000000000.0, - 10000000000000000.0, - 100000000000000000.0, - 1000000000000000000.0, - 10000000000000000000.0, - 100000000000000000000.0, // 10^20 - 1000000000000000000000.0, - // 10^22 = 0x21e19e0c9bab2400000 = 0x878678326eac9 * 2^22 - 10000000000000000000000.0 -}; -static const int kExactPowersOfTenSize = ARRAY_SIZE(exact_powers_of_ten); - -// Maximum number of significant digits in the decimal representation. -// In fact the value is 772 (see conversions.cc), but to give us some margin -// we round up to 780. -static const int kMaxSignificantDecimalDigits = 780; - -static Vector TrimLeadingZeros(Vector buffer) { - for (int i = 0; i < buffer.length(); i++) { - if (buffer[i] != '0') { - return buffer.SubVector(i, buffer.length()); - } - } - return Vector(buffer.start(), 0); -} - - -static Vector TrimTrailingZeros(Vector buffer) { - for (int i = buffer.length() - 1; i >= 0; --i) { - if (buffer[i] != '0') { - return buffer.SubVector(0, i + 1); - } - } - return Vector(buffer.start(), 0); -} - - -static void CutToMaxSignificantDigits(Vector buffer, - int exponent, - char* significant_buffer, - int* significant_exponent) { - for (int i = 0; i < kMaxSignificantDecimalDigits - 1; ++i) { - significant_buffer[i] = buffer[i]; - } - // The input buffer has been trimmed. Therefore the last digit must be - // different from '0'. - ASSERT(buffer[buffer.length() - 1] != '0'); - // Set the last digit to be non-zero. This is sufficient to guarantee - // correct rounding. - significant_buffer[kMaxSignificantDecimalDigits - 1] = '1'; - *significant_exponent = - exponent + (buffer.length() - kMaxSignificantDecimalDigits); -} - - -// Trims the buffer and cuts it to at most kMaxSignificantDecimalDigits. -// If possible the input-buffer is reused, but if the buffer needs to be -// modified (due to cutting), then the input needs to be copied into the -// buffer_copy_space. -static void TrimAndCut(Vector buffer, int exponent, - char* buffer_copy_space, int space_size, - Vector* trimmed, int* updated_exponent) { - Vector left_trimmed = TrimLeadingZeros(buffer); - Vector right_trimmed = TrimTrailingZeros(left_trimmed); - exponent += left_trimmed.length() - right_trimmed.length(); - if (right_trimmed.length() > kMaxSignificantDecimalDigits) { - (void) space_size; // Mark variable as used. - ASSERT(space_size >= kMaxSignificantDecimalDigits); - CutToMaxSignificantDigits(right_trimmed, exponent, - buffer_copy_space, updated_exponent); - *trimmed = Vector(buffer_copy_space, - kMaxSignificantDecimalDigits); - } else { - *trimmed = right_trimmed; - *updated_exponent = exponent; - } -} - - -// Reads digits from the buffer and converts them to a uint64. -// Reads in as many digits as fit into a uint64. -// When the string starts with "1844674407370955161" no further digit is read. -// Since 2^64 = 18446744073709551616 it would still be possible read another -// digit if it was less or equal than 6, but this would complicate the code. -static uint64_t ReadUint64(Vector buffer, - int* number_of_read_digits) { - uint64_t result = 0; - int i = 0; - while (i < buffer.length() && result <= (kMaxUint64 / 10 - 1)) { - int digit = buffer[i++] - '0'; - ASSERT(0 <= digit && digit <= 9); - result = 10 * result + digit; - } - *number_of_read_digits = i; - return result; -} - - -// Reads a DiyFp from the buffer. -// The returned DiyFp is not necessarily normalized. -// If remaining_decimals is zero then the returned DiyFp is accurate. -// Otherwise it has been rounded and has error of at most 1/2 ulp. -static void ReadDiyFp(Vector buffer, - DiyFp* result, - int* remaining_decimals) { - int read_digits; - uint64_t significand = ReadUint64(buffer, &read_digits); - if (buffer.length() == read_digits) { - *result = DiyFp(significand, 0); - *remaining_decimals = 0; - } else { - // Round the significand. - if (buffer[read_digits] >= '5') { - significand++; - } - // Compute the binary exponent. - int exponent = 0; - *result = DiyFp(significand, exponent); - *remaining_decimals = buffer.length() - read_digits; - } -} - - -static bool DoubleStrtod(Vector trimmed, - int exponent, - double* result) { -#if !defined(DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS) - // On x86 the floating-point stack can be 64 or 80 bits wide. If it is - // 80 bits wide (as is the case on Linux) then double-rounding occurs and the - // result is not accurate. - // We know that Windows32 uses 64 bits and is therefore accurate. - // Note that the ARM simulator is compiled for 32bits. It therefore exhibits - // the same problem. - return false; -#endif - if (trimmed.length() <= kMaxExactDoubleIntegerDecimalDigits) { - int read_digits; - // The trimmed input fits into a double. - // If the 10^exponent (resp. 10^-exponent) fits into a double too then we - // can compute the result-double simply by multiplying (resp. dividing) the - // two numbers. - // This is possible because IEEE guarantees that floating-point operations - // return the best possible approximation. - if (exponent < 0 && -exponent < kExactPowersOfTenSize) { - // 10^-exponent fits into a double. - *result = static_cast(ReadUint64(trimmed, &read_digits)); - ASSERT(read_digits == trimmed.length()); - *result /= exact_powers_of_ten[-exponent]; - return true; - } - if (0 <= exponent && exponent < kExactPowersOfTenSize) { - // 10^exponent fits into a double. - *result = static_cast(ReadUint64(trimmed, &read_digits)); - ASSERT(read_digits == trimmed.length()); - *result *= exact_powers_of_ten[exponent]; - return true; - } - int remaining_digits = - kMaxExactDoubleIntegerDecimalDigits - trimmed.length(); - if ((0 <= exponent) && - (exponent - remaining_digits < kExactPowersOfTenSize)) { - // The trimmed string was short and we can multiply it with - // 10^remaining_digits. As a result the remaining exponent now fits - // into a double too. - *result = static_cast(ReadUint64(trimmed, &read_digits)); - ASSERT(read_digits == trimmed.length()); - *result *= exact_powers_of_ten[remaining_digits]; - *result *= exact_powers_of_ten[exponent - remaining_digits]; - return true; - } - } - return false; -} - - -// Returns 10^exponent as an exact DiyFp. -// The given exponent must be in the range [1; kDecimalExponentDistance[. -static DiyFp AdjustmentPowerOfTen(int exponent) { - ASSERT(0 < exponent); - ASSERT(exponent < PowersOfTenCache::kDecimalExponentDistance); - // Simply hardcode the remaining powers for the given decimal exponent - // distance. - ASSERT(PowersOfTenCache::kDecimalExponentDistance == 8); - switch (exponent) { - case 1: return DiyFp(UINT64_2PART_C(0xa0000000, 00000000), -60); - case 2: return DiyFp(UINT64_2PART_C(0xc8000000, 00000000), -57); - case 3: return DiyFp(UINT64_2PART_C(0xfa000000, 00000000), -54); - case 4: return DiyFp(UINT64_2PART_C(0x9c400000, 00000000), -50); - case 5: return DiyFp(UINT64_2PART_C(0xc3500000, 00000000), -47); - case 6: return DiyFp(UINT64_2PART_C(0xf4240000, 00000000), -44); - case 7: return DiyFp(UINT64_2PART_C(0x98968000, 00000000), -40); - default: - UNREACHABLE(); - } -} - - -// If the function returns true then the result is the correct double. -// Otherwise it is either the correct double or the double that is just below -// the correct double. -static bool DiyFpStrtod(Vector buffer, - int exponent, - double* result) { - DiyFp input; - int remaining_decimals; - ReadDiyFp(buffer, &input, &remaining_decimals); - // Since we may have dropped some digits the input is not accurate. - // If remaining_decimals is different than 0 than the error is at most - // .5 ulp (unit in the last place). - // We don't want to deal with fractions and therefore keep a common - // denominator. - const int kDenominatorLog = 3; - const int kDenominator = 1 << kDenominatorLog; - // Move the remaining decimals into the exponent. - exponent += remaining_decimals; - uint64_t error = (remaining_decimals == 0 ? 0 : kDenominator / 2); - - int old_e = input.e(); - input.Normalize(); - error <<= old_e - input.e(); - - ASSERT(exponent <= PowersOfTenCache::kMaxDecimalExponent); - if (exponent < PowersOfTenCache::kMinDecimalExponent) { - *result = 0.0; - return true; - } - DiyFp cached_power; - int cached_decimal_exponent; - PowersOfTenCache::GetCachedPowerForDecimalExponent(exponent, - &cached_power, - &cached_decimal_exponent); - - if (cached_decimal_exponent != exponent) { - int adjustment_exponent = exponent - cached_decimal_exponent; - DiyFp adjustment_power = AdjustmentPowerOfTen(adjustment_exponent); - input.Multiply(adjustment_power); - if (kMaxUint64DecimalDigits - buffer.length() >= adjustment_exponent) { - // The product of input with the adjustment power fits into a 64 bit - // integer. - ASSERT(DiyFp::kSignificandSize == 64); - } else { - // The adjustment power is exact. There is hence only an error of 0.5. - error += kDenominator / 2; - } - } - - input.Multiply(cached_power); - // The error introduced by a multiplication of a*b equals - // error_a + error_b + error_a*error_b/2^64 + 0.5 - // Substituting a with 'input' and b with 'cached_power' we have - // error_b = 0.5 (all cached powers have an error of less than 0.5 ulp), - // error_ab = 0 or 1 / kDenominator > error_a*error_b/ 2^64 - int error_b = kDenominator / 2; - int error_ab = (error == 0 ? 0 : 1); // We round up to 1. - int fixed_error = kDenominator / 2; - error += error_b + error_ab + fixed_error; - - old_e = input.e(); - input.Normalize(); - error <<= old_e - input.e(); - - // See if the double's significand changes if we add/subtract the error. - int order_of_magnitude = DiyFp::kSignificandSize + input.e(); - int effective_significand_size = - Double::SignificandSizeForOrderOfMagnitude(order_of_magnitude); - int precision_digits_count = - DiyFp::kSignificandSize - effective_significand_size; - if (precision_digits_count + kDenominatorLog >= DiyFp::kSignificandSize) { - // This can only happen for very small denormals. In this case the - // half-way multiplied by the denominator exceeds the range of an uint64. - // Simply shift everything to the right. - int shift_amount = (precision_digits_count + kDenominatorLog) - - DiyFp::kSignificandSize + 1; - input.set_f(input.f() >> shift_amount); - input.set_e(input.e() + shift_amount); - // We add 1 for the lost precision of error, and kDenominator for - // the lost precision of input.f(). - error = (error >> shift_amount) + 1 + kDenominator; - precision_digits_count -= shift_amount; - } - // We use uint64_ts now. This only works if the DiyFp uses uint64_ts too. - ASSERT(DiyFp::kSignificandSize == 64); - ASSERT(precision_digits_count < 64); - uint64_t one64 = 1; - uint64_t precision_bits_mask = (one64 << precision_digits_count) - 1; - uint64_t precision_bits = input.f() & precision_bits_mask; - uint64_t half_way = one64 << (precision_digits_count - 1); - precision_bits *= kDenominator; - half_way *= kDenominator; - DiyFp rounded_input(input.f() >> precision_digits_count, - input.e() + precision_digits_count); - if (precision_bits >= half_way + error) { - rounded_input.set_f(rounded_input.f() + 1); - } - // If the last_bits are too close to the half-way case than we are too - // inaccurate and round down. In this case we return false so that we can - // fall back to a more precise algorithm. - - *result = Double(rounded_input).value(); - if (half_way - error < precision_bits && precision_bits < half_way + error) { - // Too imprecise. The caller will have to fall back to a slower version. - // However the returned number is guaranteed to be either the correct - // double, or the next-lower double. - return false; - } else { - return true; - } -} - - -// Returns -// - -1 if buffer*10^exponent < diy_fp. -// - 0 if buffer*10^exponent == diy_fp. -// - +1 if buffer*10^exponent > diy_fp. -// Preconditions: -// buffer.length() + exponent <= kMaxDecimalPower + 1 -// buffer.length() + exponent > kMinDecimalPower -// buffer.length() <= kMaxDecimalSignificantDigits -static int CompareBufferWithDiyFp(Vector buffer, - int exponent, - DiyFp diy_fp) { - ASSERT(buffer.length() + exponent <= kMaxDecimalPower + 1); - ASSERT(buffer.length() + exponent > kMinDecimalPower); - ASSERT(buffer.length() <= kMaxSignificantDecimalDigits); - // Make sure that the Bignum will be able to hold all our numbers. - // Our Bignum implementation has a separate field for exponents. Shifts will - // consume at most one bigit (< 64 bits). - // ln(10) == 3.3219... - ASSERT(((kMaxDecimalPower + 1) * 333 / 100) < Bignum::kMaxSignificantBits); - Bignum buffer_bignum; - Bignum diy_fp_bignum; - buffer_bignum.AssignDecimalString(buffer); - diy_fp_bignum.AssignUInt64(diy_fp.f()); - if (exponent >= 0) { - buffer_bignum.MultiplyByPowerOfTen(exponent); - } else { - diy_fp_bignum.MultiplyByPowerOfTen(-exponent); - } - if (diy_fp.e() > 0) { - diy_fp_bignum.ShiftLeft(diy_fp.e()); - } else { - buffer_bignum.ShiftLeft(-diy_fp.e()); - } - return Bignum::Compare(buffer_bignum, diy_fp_bignum); -} - - -// Returns true if the guess is the correct double. -// Returns false, when guess is either correct or the next-lower double. -static bool ComputeGuess(Vector trimmed, int exponent, - double* guess) { - if (trimmed.length() == 0) { - *guess = 0.0; - return true; - } - if (exponent + trimmed.length() - 1 >= kMaxDecimalPower) { - *guess = Double::Infinity(); - return true; - } - if (exponent + trimmed.length() <= kMinDecimalPower) { - *guess = 0.0; - return true; - } - - if (DoubleStrtod(trimmed, exponent, guess) || - DiyFpStrtod(trimmed, exponent, guess)) { - return true; - } - if (*guess == Double::Infinity()) { - return true; - } - return false; -} - -double Strtod(Vector buffer, int exponent) { - char copy_buffer[kMaxSignificantDecimalDigits]; - Vector trimmed; - int updated_exponent; - TrimAndCut(buffer, exponent, copy_buffer, kMaxSignificantDecimalDigits, - &trimmed, &updated_exponent); - exponent = updated_exponent; - - double guess; - bool is_correct = ComputeGuess(trimmed, exponent, &guess); - if (is_correct) return guess; - - DiyFp upper_boundary = Double(guess).UpperBoundary(); - int comparison = CompareBufferWithDiyFp(trimmed, exponent, upper_boundary); - if (comparison < 0) { - return guess; - } else if (comparison > 0) { - return Double(guess).NextDouble(); - } else if ((Double(guess).Significand() & 1) == 0) { - // Round towards even. - return guess; - } else { - return Double(guess).NextDouble(); - } -} - -float Strtof(Vector buffer, int exponent) { - char copy_buffer[kMaxSignificantDecimalDigits]; - Vector trimmed; - int updated_exponent; - TrimAndCut(buffer, exponent, copy_buffer, kMaxSignificantDecimalDigits, - &trimmed, &updated_exponent); - exponent = updated_exponent; - - double double_guess; - bool is_correct = ComputeGuess(trimmed, exponent, &double_guess); - - float float_guess = static_cast(double_guess); - if (float_guess == double_guess) { - // This shortcut triggers for integer values. - return float_guess; - } - - // We must catch double-rounding. Say the double has been rounded up, and is - // now a boundary of a float, and rounds up again. This is why we have to - // look at previous too. - // Example (in decimal numbers): - // input: 12349 - // high-precision (4 digits): 1235 - // low-precision (3 digits): - // when read from input: 123 - // when rounded from high precision: 124. - // To do this we simply look at the neigbors of the correct result and see - // if they would round to the same float. If the guess is not correct we have - // to look at four values (since two different doubles could be the correct - // double). - - double double_next = Double(double_guess).NextDouble(); - double double_previous = Double(double_guess).PreviousDouble(); - - float f1 = static_cast(double_previous); - float f2 = float_guess; - float f3 = static_cast(double_next); - float f4; - if (is_correct) { - f4 = f3; - } else { - double double_next2 = Double(double_next).NextDouble(); - f4 = static_cast(double_next2); - } - (void) f2; // Mark variable as used. - ASSERT(f1 <= f2 && f2 <= f3 && f3 <= f4); - - // If the guess doesn't lie near a single-precision boundary we can simply - // return its float-value. - if (f1 == f4) { - return float_guess; - } - - ASSERT((f1 != f2 && f2 == f3 && f3 == f4) || - (f1 == f2 && f2 != f3 && f3 == f4) || - (f1 == f2 && f2 == f3 && f3 != f4)); - - // guess and next are the two possible canditates (in the same way that - // double_guess was the lower candidate for a double-precision guess). - float guess = f1; - float next = f4; - DiyFp upper_boundary; - if (guess == 0.0f) { - float min_float = 1e-45f; - upper_boundary = Double(static_cast(min_float) / 2).AsDiyFp(); - } else { - upper_boundary = Single(guess).UpperBoundary(); - } - int comparison = CompareBufferWithDiyFp(trimmed, exponent, upper_boundary); - if (comparison < 0) { - return guess; - } else if (comparison > 0) { - return next; - } else if ((Single(guess).Significand() & 1) == 0) { - // Round towards even. - return guess; - } else { - return next; - } -} - -} // namespace double_conversion diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/strtod.h b/ios/Pods/Flipper-DoubleConversion/double-conversion/strtod.h deleted file mode 100644 index ed0293b..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/strtod.h +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_STRTOD_H_ -#define DOUBLE_CONVERSION_STRTOD_H_ - -#include "utils.h" - -namespace double_conversion { - -// The buffer must only contain digits in the range [0-9]. It must not -// contain a dot or a sign. It must not start with '0', and must not be empty. -double Strtod(Vector buffer, int exponent); - -// The buffer must only contain digits in the range [0-9]. It must not -// contain a dot or a sign. It must not start with '0', and must not be empty. -float Strtof(Vector buffer, int exponent); - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_STRTOD_H_ diff --git a/ios/Pods/Flipper-DoubleConversion/double-conversion/utils.h b/ios/Pods/Flipper-DoubleConversion/double-conversion/utils.h deleted file mode 100644 index a7c9b42..0000000 --- a/ios/Pods/Flipper-DoubleConversion/double-conversion/utils.h +++ /dev/null @@ -1,324 +0,0 @@ -// Copyright 2010 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#ifndef DOUBLE_CONVERSION_UTILS_H_ -#define DOUBLE_CONVERSION_UTILS_H_ - -#include -#include - -#include -#ifndef ASSERT -#define ASSERT(condition) \ - assert(condition); -#endif -#ifndef UNIMPLEMENTED -#define UNIMPLEMENTED() (abort()) -#endif -#ifndef UNREACHABLE -#define UNREACHABLE() (abort()) -#endif - -// Double operations detection based on target architecture. -// Linux uses a 80bit wide floating point stack on x86. This induces double -// rounding, which in turn leads to wrong results. -// An easy way to test if the floating-point operations are correct is to -// evaluate: 89255.0/1e22. If the floating-point stack is 64 bits wide then -// the result is equal to 89255e-22. -// The best way to test this, is to create a division-function and to compare -// the output of the division with the expected result. (Inlining must be -// disabled.) -// On Linux,x86 89255e-22 != Div_double(89255.0/1e22) -#if defined(_M_X64) || defined(__x86_64__) || \ - defined(__ARMEL__) || defined(__avr32__) || \ - defined(__hppa__) || defined(__ia64__) || \ - defined(__mips__) || \ - defined(__powerpc__) || defined(__ppc__) || defined(__ppc64__) || \ - defined(__sparc__) || defined(__sparc) || defined(__s390__) || \ - defined(__SH4__) || defined(__alpha__) || \ - defined(_MIPS_ARCH_MIPS32R2) || \ - defined(__AARCH64EL__) -#define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1 -#elif defined(__mc68000__) -#undef DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS -#elif defined(_M_IX86) || defined(__i386__) || defined(__i386) -#if defined(_WIN32) -// Windows uses a 64bit wide floating point stack. -#define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1 -#else -#undef DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS -#endif // _WIN32 -#else -#error Target architecture was not detected as supported by Double-Conversion. -#endif - -#if defined(__GNUC__) -#define DOUBLE_CONVERSION_UNUSED __attribute__((unused)) -#else -#define DOUBLE_CONVERSION_UNUSED -#endif - -#if defined(_WIN32) && !defined(__MINGW32__) - -typedef signed char int8_t; -typedef unsigned char uint8_t; -typedef short int16_t; // NOLINT -typedef unsigned short uint16_t; // NOLINT -typedef int int32_t; -typedef unsigned int uint32_t; -typedef __int64 int64_t; -typedef unsigned __int64 uint64_t; -// intptr_t and friends are defined in crtdefs.h through stdio.h. - -#else - -#include - -#endif - -// The following macro works on both 32 and 64-bit platforms. -// Usage: instead of writing 0x1234567890123456 -// write UINT64_2PART_C(0x12345678,90123456); -#define UINT64_2PART_C(a, b) (((static_cast(a) << 32) + 0x##b##u)) - - -// The expression ARRAY_SIZE(a) is a compile-time constant of type -// size_t which represents the number of elements of the given -// array. You should only use ARRAY_SIZE on statically allocated -// arrays. -#ifndef ARRAY_SIZE -#define ARRAY_SIZE(a) \ - ((sizeof(a) / sizeof(*(a))) / \ - static_cast(!(sizeof(a) % sizeof(*(a))))) -#endif - -// A macro to disallow the evil copy constructor and operator= functions -// This should be used in the private: declarations for a class -#ifndef DISALLOW_COPY_AND_ASSIGN -#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&); \ - void operator=(const TypeName&) -#endif - -// A macro to disallow all the implicit constructors, namely the -// default constructor, copy constructor and operator= functions. -// -// This should be used in the private: declarations for a class -// that wants to prevent anyone from instantiating it. This is -// especially useful for classes containing only static methods. -#ifndef DISALLOW_IMPLICIT_CONSTRUCTORS -#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \ - TypeName(); \ - DISALLOW_COPY_AND_ASSIGN(TypeName) -#endif - -namespace double_conversion { - -static const int kCharSize = sizeof(char); - -// Returns the maximum of the two parameters. -template -static T Max(T a, T b) { - return a < b ? b : a; -} - - -// Returns the minimum of the two parameters. -template -static T Min(T a, T b) { - return a < b ? a : b; -} - - -inline int StrLength(const char* string) { - size_t length = strlen(string); - ASSERT(length == static_cast(static_cast(length))); - return static_cast(length); -} - -// This is a simplified version of V8's Vector class. -template -class Vector { - public: - Vector() : start_(NULL), length_(0) {} - Vector(T* data, int length) : start_(data), length_(length) { - ASSERT(length == 0 || (length > 0 && data != NULL)); - } - - // Returns a vector using the same backing storage as this one, - // spanning from and including 'from', to but not including 'to'. - Vector SubVector(int from, int to) { - ASSERT(to <= length_); - ASSERT(from < to); - ASSERT(0 <= from); - return Vector(start() + from, to - from); - } - - // Returns the length of the vector. - int length() const { return length_; } - - // Returns whether or not the vector is empty. - bool is_empty() const { return length_ == 0; } - - // Returns the pointer to the start of the data in the vector. - T* start() const { return start_; } - - // Access individual vector elements - checks bounds in debug mode. - T& operator[](int index) const { - ASSERT(0 <= index && index < length_); - return start_[index]; - } - - T& first() { return start_[0]; } - - T& last() { return start_[length_ - 1]; } - - private: - T* start_; - int length_; -}; - - -// Helper class for building result strings in a character buffer. The -// purpose of the class is to use safe operations that checks the -// buffer bounds on all operations in debug mode. -class StringBuilder { - public: - StringBuilder(char* buffer, int size) - : buffer_(buffer, size), position_(0) { } - - ~StringBuilder() { if (!is_finalized()) Finalize(); } - - int size() const { return buffer_.length(); } - - // Get the current position in the builder. - int position() const { - ASSERT(!is_finalized()); - return position_; - } - - // Reset the position. - void Reset() { position_ = 0; } - - // Add a single character to the builder. It is not allowed to add - // 0-characters; use the Finalize() method to terminate the string - // instead. - void AddCharacter(char c) { - ASSERT(c != '\0'); - ASSERT(!is_finalized() && position_ < buffer_.length()); - buffer_[position_++] = c; - } - - // Add an entire string to the builder. Uses strlen() internally to - // compute the length of the input string. - void AddString(const char* s) { - AddSubstring(s, StrLength(s)); - } - - // Add the first 'n' characters of the given string 's' to the - // builder. The input string must have enough characters. - void AddSubstring(const char* s, int n) { - ASSERT(!is_finalized() && position_ + n < buffer_.length()); - ASSERT(static_cast(n) <= strlen(s)); - memmove(&buffer_[position_], s, n * kCharSize); - position_ += n; - } - - - // Add character padding to the builder. If count is non-positive, - // nothing is added to the builder. - void AddPadding(char c, int count) { - for (int i = 0; i < count; i++) { - AddCharacter(c); - } - } - - // Finalize the string by 0-terminating it and returning the buffer. - char* Finalize() { - ASSERT(!is_finalized() && position_ < buffer_.length()); - buffer_[position_] = '\0'; - // Make sure nobody managed to add a 0-character to the - // buffer while building the string. - ASSERT(strlen(buffer_.start()) == static_cast(position_)); - position_ = -1; - ASSERT(is_finalized()); - return buffer_.start(); - } - - private: - Vector buffer_; - int position_; - - bool is_finalized() const { return position_ < 0; } - - DISALLOW_IMPLICIT_CONSTRUCTORS(StringBuilder); -}; - -// The type-based aliasing rule allows the compiler to assume that pointers of -// different types (for some definition of different) never alias each other. -// Thus the following code does not work: -// -// float f = foo(); -// int fbits = *(int*)(&f); -// -// The compiler 'knows' that the int pointer can't refer to f since the types -// don't match, so the compiler may cache f in a register, leaving random data -// in fbits. Using C++ style casts makes no difference, however a pointer to -// char data is assumed to alias any other pointer. This is the 'memcpy -// exception'. -// -// Bit_cast uses the memcpy exception to move the bits from a variable of one -// type of a variable of another type. Of course the end result is likely to -// be implementation dependent. Most compilers (gcc-4.2 and MSVC 2005) -// will completely optimize BitCast away. -// -// There is an additional use for BitCast. -// Recent gccs will warn when they see casts that may result in breakage due to -// the type-based aliasing rule. If you have checked that there is no breakage -// you can use BitCast to cast one pointer type to another. This confuses gcc -// enough that it can no longer see that you have cast one pointer type to -// another thus avoiding the warning. -template -inline Dest BitCast(const Source& source) { - // Compile time assertion: sizeof(Dest) == sizeof(Source) - // A compile error here means your Dest and Source have different sizes. - DOUBLE_CONVERSION_UNUSED - typedef char VerifySizesAreEqual[sizeof(Dest) == sizeof(Source) ? 1 : -1]; - - Dest dest; - memmove(&dest, &source, sizeof(dest)); - return dest; -} - -template -inline Dest BitCast(Source* source) { - return BitCast(reinterpret_cast(source)); -} - -} // namespace double_conversion - -#endif // DOUBLE_CONVERSION_UTILS_H_ diff --git a/ios/Pods/Flipper-Folly/LICENSE b/ios/Pods/Flipper-Folly/LICENSE deleted file mode 100644 index 48bdb12..0000000 --- a/ios/Pods/Flipper-Folly/LICENSE +++ /dev/null @@ -1,200 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - -Files in folly/external/farmhash licensed as follows - - Copyright (c) 2014 Google, Inc. - - Permission is hereby granted, free of charge, to any person obtaining a copy - of this software and associated documentation files (the "Software"), to deal - in the Software without restriction, including without limitation the rights - to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - copies of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included in - all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - THE SOFTWARE. diff --git a/ios/Pods/Flipper-Folly/README.md b/ios/Pods/Flipper-Folly/README.md deleted file mode 100644 index f50d687..0000000 --- a/ios/Pods/Flipper-Folly/README.md +++ /dev/null @@ -1,267 +0,0 @@ -Folly: Facebook Open-source Library ------------------------------------ - -[![Build Status](https://travis-ci.org/facebook/folly.svg?branch=master)](https://travis-ci.org/facebook/folly) - -### What is `folly`? - -Folly (acronymed loosely after Facebook Open Source Library) is a -library of C++14 components designed with practicality and efficiency -in mind. **Folly contains a variety of core library components used extensively -at Facebook**. In particular, it's often a dependency of Facebook's other -open source C++ efforts and place where those projects can share code. - -It complements (as opposed to competing against) offerings -such as Boost and of course `std`. In fact, we embark on defining our -own component only when something we need is either not available, or -does not meet the needed performance profile. We endeavor to remove -things from folly if or when `std` or Boost obsoletes them. - -Performance concerns permeate much of Folly, sometimes leading to -designs that are more idiosyncratic than they would otherwise be (see -e.g. `PackedSyncPtr.h`, `SmallLocks.h`). Good performance at large -scale is a unifying theme in all of Folly. - -### Logical Design - -Folly is a collection of relatively independent components, some as -simple as a few symbols. There is no restriction on internal -dependencies, meaning that a given folly module may use any other -folly components. - -All symbols are defined in the top-level namespace `folly`, except of -course macros. Macro names are ALL_UPPERCASE and should be prefixed -with `FOLLY_`. Namespace `folly` defines other internal namespaces -such as `internal` or `detail`. User code should not depend on symbols -in those namespaces. - -Folly has an `experimental` directory as well. This designation connotes -primarily that we feel the API may change heavily over time. This code, -typically, is still in heavy use and is well tested. - -### Physical Design - -At the top level Folly uses the classic "stuttering" scheme -`folly/folly` used by Boost and others. The first directory serves as -an installation root of the library (with possible versioning a la -`folly-1.0/`), and the second is to distinguish the library when -including files, e.g. `#include `. - -The directory structure is flat (mimicking the namespace structure), -i.e. we don't have an elaborate directory hierarchy (it is possible -this will change in future versions). The subdirectory `experimental` -contains files that are used inside folly and possibly at Facebook but -not considered stable enough for client use. Your code should not use -files in `folly/experimental` lest it may break when you update Folly. - -The `folly/folly/test` subdirectory includes the unittests for all -components, usually named `ComponentXyzTest.cpp` for each -`ComponentXyz.*`. The `folly/folly/docs` directory contains -documentation. - -### What's in it? - -Because of folly's fairly flat structure, the best way to see what's in it -is to look at the headers in [top level `folly/` directory](https://github.com/facebook/folly/tree/master/folly). You can also -check the [`docs` folder](folly/docs) for documentation, starting with the -[overview](folly/docs/Overview.md). - -Folly is published on GitHub at https://github.com/facebook/folly - -### Build Notes - -#### Dependencies - -folly requires gcc 5.1+ and a version of boost compiled with C++14 support. - -googletest is required to build and run folly's tests. You can download -it from https://github.com/google/googletest/archive/release-1.8.0.tar.gz -The following commands can be used to download and install it: - -``` -wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz && \ -tar zxf release-1.8.0.tar.gz && \ -rm -f release-1.8.0.tar.gz && \ -cd googletest-release-1.8.0 && \ -cmake . && \ -make && \ -make install -``` - -#### Finding dependencies in non-default locations - -If you have boost, gtest, or other dependencies installed in a non-default -location, you can use the `CMAKE_INCLUDE_PATH` and `CMAKE_LIBRARY_PATH` -variables to make CMAKE look also look for header files and libraries in -non-standard locations. For example, to also search the directories -`/alt/include/path1` and `/alt/include/path2` for header files and the -directories `/alt/lib/path1` and `/alt/lib/path2` for libraries, you can invoke -`cmake` as follows: - -``` -cmake \ - -DCMAKE_INCLUDE_PATH=/alt/include/path1:/alt/include/path2 \ - -DCMAKE_LIBRARY_PATH=/alt/lib/path1:/alt/lib/path2 ... -``` - -#### Building tests - -By default, building the tests is disabled as part of the CMake `all` target. -To build the tests, specify `-DBUILD_TESTS=ON` to CMake at configure time. - -#### Ubuntu 16.04 LTS - -The following packages are required (feel free to cut and paste the apt-get -command below): - -``` -sudo apt-get install \ - g++ \ - cmake \ - libboost-all-dev \ - libevent-dev \ - libdouble-conversion-dev \ - libgoogle-glog-dev \ - libgflags-dev \ - libiberty-dev \ - liblz4-dev \ - liblzma-dev \ - libsnappy-dev \ - make \ - zlib1g-dev \ - binutils-dev \ - libjemalloc-dev \ - libssl-dev \ - pkg-config \ - libunwind-dev -``` - -Folly relies on [fmt](https://github.com/fmtlib/fmt) which needs to be installed from source. -The following commands will download, compile, and install fmt. - -``` -git clone https://github.com/fmtlib/fmt.git && cd fmt - -mkdir _build && cd _build -cmake .. - -make -j$(nproc) -sudo make install -``` - -If advanced debugging functionality is required, use: - -``` -sudo apt-get install \ - libunwind8-dev \ - libelf-dev \ - libdwarf-dev -``` - -In the folly directory (e.g. the checkout root or the archive unpack root), run: -``` - mkdir _build && cd _build - cmake .. - make -j $(nproc) - make install # with either sudo or DESTDIR as necessary -``` - -#### OS X (Homebrew) - -folly is available as a Formula and releases may be built via `brew install folly`. - -You may also use `folly/build/bootstrap-osx-homebrew.sh` to build against `master`: - -``` - ./folly/build/bootstrap-osx-homebrew.sh -``` - -This will create a build directory `_build` in the top-level. - -#### OS X (MacPorts) - -Install the required packages from MacPorts: - -``` - sudo port install \ - boost \ - cmake \ - gflags \ - git \ - google-glog \ - libevent \ - libtool \ - lz4 \ - lzma \ - openssl \ - snappy \ - xz \ - zlib -``` - -Download and install double-conversion: - -``` - git clone https://github.com/google/double-conversion.git - cd double-conversion - cmake -DBUILD_SHARED_LIBS=ON . - make - sudo make install -``` - -Download and install folly with the parameters listed below: - -``` - git clone https://github.com/facebook/folly.git - cd folly - mkdir _build - cd _build - cmake .. - make - sudo make install -``` - -#### Windows (Vcpkg) - -folly is available in [Vcpkg](https://github.com/Microsoft/vcpkg#vcpkg) and releases may be built via `vcpkg install folly:x64-windows`. - -You may also use `vcpkg install folly:x64-windows --head` to build against `master`. - -#### Other Linux distributions - -- double-conversion (https://github.com/google/double-conversion) - - Download and build double-conversion. - You may need to tell cmake where to find it. - - [double-conversion/] `ln -s src double-conversion` - - [folly/] `mkdir build && cd build` - [folly/build/] `cmake "-DCMAKE_INCLUDE_PATH=$DOUBLE_CONVERSION_HOME/include" "-DCMAKE_LIBRARY_PATH=$DOUBLE_CONVERSION_HOME/lib" ..` - - [folly/build/] `make` - -- additional platform specific dependencies: - - Fedora >= 21 64-bit (last tested on Fedora 28 64-bit) - - gcc - - gcc-c++ - - cmake - - automake - - boost-devel - - libtool - - lz4-devel - - lzma-devel - - snappy-devel - - zlib-devel - - glog-devel - - gflags-devel - - scons - - double-conversion-devel - - openssl-devel - - libevent-devel - - Optional - - libdwarf-dev - - libelf-dev - - libunwind8-dev diff --git a/ios/Pods/Flipper-Folly/folly/AtomicHashArray-inl.h b/ios/Pods/Flipper-Folly/folly/AtomicHashArray-inl.h deleted file mode 100644 index d058011..0000000 --- a/ios/Pods/Flipper-Folly/folly/AtomicHashArray-inl.h +++ /dev/null @@ -1,550 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef FOLLY_ATOMICHASHARRAY_H_ -#error "This should only be included by AtomicHashArray.h" -#endif - -#include - -#include -#include -#include -#include - -namespace folly { - -// AtomicHashArray private constructor -- -template < - class KeyT, - class ValueT, - class HashFcn, - class EqualFcn, - class Allocator, - class ProbeFcn, - class KeyConvertFcn> -AtomicHashArray< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>:: - AtomicHashArray( - size_t capacity, - KeyT emptyKey, - KeyT lockedKey, - KeyT erasedKey, - double _maxLoadFactor, - uint32_t cacheSize) - : capacity_(capacity), - maxEntries_(size_t(_maxLoadFactor * capacity_ + 0.5)), - kEmptyKey_(emptyKey), - kLockedKey_(lockedKey), - kErasedKey_(erasedKey), - kAnchorMask_(nextPowTwo(capacity_) - 1), - numEntries_(0, cacheSize), - numPendingEntries_(0, cacheSize), - isFull_(0), - numErases_(0) { - if (capacity == 0) { - throw_exception("capacity"); - } -} - -/* - * findInternal -- - * - * Sets ret.second to value found and ret.index to index - * of key and returns true, or if key does not exist returns false and - * ret.index is set to capacity_. - */ -template < - class KeyT, - class ValueT, - class HashFcn, - class EqualFcn, - class Allocator, - class ProbeFcn, - class KeyConvertFcn> -template -typename AtomicHashArray< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::SimpleRetT -AtomicHashArray< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::findInternal(const LookupKeyT key_in) { - checkLegalKeyIfKey(key_in); - - for (size_t idx = keyToAnchorIdx(key_in), - numProbes = 0; - ; - idx = ProbeFcn()(idx, numProbes, capacity_)) { - const KeyT key = acquireLoadKey(cells_[idx]); - if (LIKELY(LookupEqualFcn()(key, key_in))) { - return SimpleRetT(idx, true); - } - if (UNLIKELY(key == kEmptyKey_)) { - // if we hit an empty element, this key does not exist - return SimpleRetT(capacity_, false); - } - // NOTE: the way we count numProbes must be same in find(), insert(), - // and erase(). Otherwise it may break probing. - ++numProbes; - if (UNLIKELY(numProbes >= capacity_)) { - // probed every cell...fail - return SimpleRetT(capacity_, false); - } - } -} - -/* - * insertInternal -- - * - * Returns false on failure due to key collision or full. - * Also sets ret.index to the index of the key. If the map is full, sets - * ret.index = capacity_. Also sets ret.second to cell value, thus if insert - * successful this will be what we just inserted, if there is a key collision - * this will be the previously inserted value, and if the map is full it is - * default. - */ -template < - class KeyT, - class ValueT, - class HashFcn, - class EqualFcn, - class Allocator, - class ProbeFcn, - class KeyConvertFcn> -template < - typename LookupKeyT, - typename LookupHashFcn, - typename LookupEqualFcn, - typename LookupKeyToKeyFcn, - typename... ArgTs> -typename AtomicHashArray< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::SimpleRetT -AtomicHashArray< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::insertInternal(LookupKeyT key_in, ArgTs&&... vCtorArgs) { - const short NO_NEW_INSERTS = 1; - const short NO_PENDING_INSERTS = 2; - checkLegalKeyIfKey(key_in); - - size_t idx = keyToAnchorIdx(key_in); - size_t numProbes = 0; - for (;;) { - DCHECK_LT(idx, capacity_); - value_type* cell = &cells_[idx]; - if (relaxedLoadKey(*cell) == kEmptyKey_) { - // NOTE: isFull_ is set based on numEntries_.readFast(), so it's - // possible to insert more than maxEntries_ entries. However, it's not - // possible to insert past capacity_. - ++numPendingEntries_; - if (isFull_.load(std::memory_order_acquire)) { - --numPendingEntries_; - - // Before deciding whether this insert succeeded, this thread needs to - // wait until no other thread can add a new entry. - - // Correctness assumes isFull_ is true at this point. If - // another thread now does ++numPendingEntries_, we expect it - // to pass the isFull_.load() test above. (It shouldn't insert - // a new entry.) - detail::atomic_hash_spin_wait([&] { - return (isFull_.load(std::memory_order_acquire) != - NO_PENDING_INSERTS) && - (numPendingEntries_.readFull() != 0); - }); - isFull_.store(NO_PENDING_INSERTS, std::memory_order_release); - - if (relaxedLoadKey(*cell) == kEmptyKey_) { - // Don't insert past max load factor - return SimpleRetT(capacity_, false); - } - } else { - // An unallocated cell. Try once to lock it. If we succeed, insert here. - // If we fail, fall through to comparison below; maybe the insert that - // just beat us was for this very key.... - if (tryLockCell(cell)) { - KeyT key_new; - // Write the value - done before unlocking - try { - key_new = LookupKeyToKeyFcn()(key_in); - typedef - typename std::remove_const::type LookupKeyTNoConst; - constexpr bool kAlreadyChecked = - std::is_same::value; - if (!kAlreadyChecked) { - checkLegalKeyIfKey(key_new); - } - DCHECK(relaxedLoadKey(*cell) == kLockedKey_); - // A const mapped_type is only constant once constructed, so cast - // away any const for the placement new here. - using mapped = typename std::remove_const::type; - new (const_cast(&cell->second)) - ValueT(std::forward(vCtorArgs)...); - unlockCell(cell, key_new); // Sets the new key - } catch (...) { - // Transition back to empty key---requires handling - // locked->empty below. - unlockCell(cell, kEmptyKey_); - --numPendingEntries_; - throw; - } - // An erase() can race here and delete right after our insertion - // Direct comparison rather than EqualFcn ok here - // (we just inserted it) - DCHECK( - relaxedLoadKey(*cell) == key_new || - relaxedLoadKey(*cell) == kErasedKey_); - --numPendingEntries_; - ++numEntries_; // This is a thread cached atomic increment :) - if (numEntries_.readFast() >= maxEntries_) { - isFull_.store(NO_NEW_INSERTS, std::memory_order_relaxed); - } - return SimpleRetT(idx, true); - } - --numPendingEntries_; - } - } - DCHECK(relaxedLoadKey(*cell) != kEmptyKey_); - if (kLockedKey_ == acquireLoadKey(*cell)) { - detail::atomic_hash_spin_wait( - [&] { return kLockedKey_ == acquireLoadKey(*cell); }); - } - - const KeyT thisKey = acquireLoadKey(*cell); - if (LookupEqualFcn()(thisKey, key_in)) { - // Found an existing entry for our key, but we don't overwrite the - // previous value. - return SimpleRetT(idx, false); - } else if (thisKey == kEmptyKey_ || thisKey == kLockedKey_) { - // We need to try again (i.e., don't increment numProbes or - // advance idx): this case can happen if the constructor for - // ValueT threw for this very cell (the rethrow block above). - continue; - } - - // NOTE: the way we count numProbes must be same in find(), - // insert(), and erase(). Otherwise it may break probing. - ++numProbes; - if (UNLIKELY(numProbes >= capacity_)) { - // probed every cell...fail - return SimpleRetT(capacity_, false); - } - - idx = ProbeFcn()(idx, numProbes, capacity_); - } -} - -/* - * erase -- - * - * This will attempt to erase the given key key_in if the key is found. It - * returns 1 iff the key was located and marked as erased, and 0 otherwise. - * - * Memory is not freed or reclaimed by erase, i.e. the cell containing the - * erased key will never be reused. If there's an associated value, we won't - * touch it either. - */ -template < - class KeyT, - class ValueT, - class HashFcn, - class EqualFcn, - class Allocator, - class ProbeFcn, - class KeyConvertFcn> -size_t AtomicHashArray< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::erase(KeyT key_in) { - CHECK_NE(key_in, kEmptyKey_); - CHECK_NE(key_in, kLockedKey_); - CHECK_NE(key_in, kErasedKey_); - - for (size_t idx = keyToAnchorIdx(key_in), numProbes = 0;; - idx = ProbeFcn()(idx, numProbes, capacity_)) { - DCHECK_LT(idx, capacity_); - value_type* cell = &cells_[idx]; - KeyT currentKey = acquireLoadKey(*cell); - if (currentKey == kEmptyKey_ || currentKey == kLockedKey_) { - // If we hit an empty (or locked) element, this key does not exist. This - // is similar to how it's handled in find(). - return 0; - } - if (EqualFcn()(currentKey, key_in)) { - // Found an existing entry for our key, attempt to mark it erased. - // Some other thread may have erased our key, but this is ok. - KeyT expect = currentKey; - if (cellKeyPtr(*cell)->compare_exchange_strong(expect, kErasedKey_)) { - numErases_.fetch_add(1, std::memory_order_relaxed); - - // Even if there's a value in the cell, we won't delete (or even - // default construct) it because some other thread may be accessing it. - // Locking it meanwhile won't work either since another thread may be - // holding a pointer to it. - - // We found the key and successfully erased it. - return 1; - } - // If another thread succeeds in erasing our key, we'll stop our search. - return 0; - } - - // NOTE: the way we count numProbes must be same in find(), insert(), - // and erase(). Otherwise it may break probing. - ++numProbes; - if (UNLIKELY(numProbes >= capacity_)) { - // probed every cell...fail - return 0; - } - } -} - -template < - class KeyT, - class ValueT, - class HashFcn, - class EqualFcn, - class Allocator, - class ProbeFcn, - class KeyConvertFcn> -typename AtomicHashArray< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::SmartPtr -AtomicHashArray< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::create(size_t maxSize, const Config& c) { - CHECK_LE(c.maxLoadFactor, 1.0); - CHECK_GT(c.maxLoadFactor, 0.0); - CHECK_NE(c.emptyKey, c.lockedKey); - size_t capacity = size_t(maxSize / c.maxLoadFactor); - size_t sz = sizeof(AtomicHashArray) + sizeof(value_type) * capacity; - - auto const mem = Allocator().allocate(sz); - try { - new (mem) AtomicHashArray( - capacity, - c.emptyKey, - c.lockedKey, - c.erasedKey, - c.maxLoadFactor, - c.entryCountThreadCacheSize); - } catch (...) { - Allocator().deallocate(mem, sz); - throw; - } - - SmartPtr map(static_cast((void*)mem)); - - /* - * Mark all cells as empty. - * - * Note: we're bending the rules a little here accessing the key - * element in our cells even though the cell object has not been - * constructed, and casting them to atomic objects (see cellKeyPtr). - * (Also, in fact we never actually invoke the value_type - * constructor.) This is in order to avoid needing to default - * construct a bunch of value_type when we first start up: if you - * have an expensive default constructor for the value type this can - * noticeably speed construction time for an AHA. - */ - FOR_EACH_RANGE (i, 0, map->capacity_) { - cellKeyPtr(map->cells_[i]) - ->store(map->kEmptyKey_, std::memory_order_relaxed); - } - return map; -} - -template < - class KeyT, - class ValueT, - class HashFcn, - class EqualFcn, - class Allocator, - class ProbeFcn, - class KeyConvertFcn> -void AtomicHashArray< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::destroy(AtomicHashArray* p) { - assert(p); - - size_t sz = sizeof(AtomicHashArray) + sizeof(value_type) * p->capacity_; - - FOR_EACH_RANGE (i, 0, p->capacity_) { - if (p->cells_[i].first != p->kEmptyKey_) { - p->cells_[i].~value_type(); - } - } - p->~AtomicHashArray(); - - Allocator().deallocate((char*)p, sz); -} - -// clear -- clears all keys and values in the map and resets all counters -template < - class KeyT, - class ValueT, - class HashFcn, - class EqualFcn, - class Allocator, - class ProbeFcn, - class KeyConvertFcn> -void AtomicHashArray< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::clear() { - FOR_EACH_RANGE (i, 0, capacity_) { - if (cells_[i].first != kEmptyKey_) { - cells_[i].~value_type(); - *const_cast(&cells_[i].first) = kEmptyKey_; - } - CHECK(cells_[i].first == kEmptyKey_); - } - numEntries_.set(0); - numPendingEntries_.set(0); - isFull_.store(0, std::memory_order_relaxed); - numErases_.store(0, std::memory_order_relaxed); -} - -// Iterator implementation - -template < - class KeyT, - class ValueT, - class HashFcn, - class EqualFcn, - class Allocator, - class ProbeFcn, - class KeyConvertFcn> -template -struct AtomicHashArray< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::aha_iterator - : detail::IteratorFacade< - aha_iterator, - IterVal, - std::forward_iterator_tag> { - explicit aha_iterator() : aha_(nullptr) {} - - // Conversion ctor for interoperability between const_iterator and - // iterator. The enable_if<> magic keeps us well-behaved for - // is_convertible<> (v. the iterator_facade documentation). - template - aha_iterator( - const aha_iterator& o, - typename std::enable_if< - std::is_convertible::value>::type* = nullptr) - : aha_(o.aha_), offset_(o.offset_) {} - - explicit aha_iterator(ContT* array, size_t offset) - : aha_(array), offset_(offset) {} - - // Returns unique index that can be used with findAt(). - // WARNING: The following function will fail silently for hashtable - // with capacity > 2^32 - uint32_t getIndex() const { - return offset_; - } - - void advancePastEmpty() { - while (offset_ < aha_->capacity_ && !isValid()) { - ++offset_; - } - } - - private: - friend class AtomicHashArray; - friend class detail:: - IteratorFacade; - - void increment() { - ++offset_; - advancePastEmpty(); - } - - bool equal(const aha_iterator& o) const { - return aha_ == o.aha_ && offset_ == o.offset_; - } - - IterVal& dereference() const { - return aha_->cells_[offset_]; - } - - bool isValid() const { - KeyT key = acquireLoadKey(aha_->cells_[offset_]); - return key != aha_->kEmptyKey_ && key != aha_->kLockedKey_ && - key != aha_->kErasedKey_; - } - - private: - ContT* aha_; - size_t offset_; -}; // aha_iterator - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/AtomicHashArray.h b/ios/Pods/Flipper-Folly/folly/AtomicHashArray.h deleted file mode 100644 index cd62a23..0000000 --- a/ios/Pods/Flipper-Folly/folly/AtomicHashArray.h +++ /dev/null @@ -1,448 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * AtomicHashArray is the building block for AtomicHashMap. It provides the - * core lock-free functionality, but is limited by the fact that it cannot - * grow past its initialization size and is a little more awkward (no public - * constructor, for example). If you're confident that you won't run out of - * space, don't mind the awkardness, and really need bare-metal performance, - * feel free to use AHA directly. - * - * Check out AtomicHashMap.h for more thorough documentation on perf and - * general pros and cons relative to other hash maps. - * - * @author Spencer Ahrens - * @author Jordan DeLong - */ - -#pragma once -#define FOLLY_ATOMICHASHARRAY_H_ - -#include - -#include -#include -#include - -namespace folly { - -struct AtomicHashArrayLinearProbeFcn { - inline size_t operator()(size_t idx, size_t /* numProbes */, size_t capacity) - const { - idx += 1; // linear probing - - // Avoid modulus because it's slow - return LIKELY(idx < capacity) ? idx : (idx - capacity); - } -}; - -struct AtomicHashArrayQuadraticProbeFcn { - inline size_t operator()(size_t idx, size_t numProbes, size_t capacity) - const { - idx += numProbes; // quadratic probing - - // Avoid modulus because it's slow - return LIKELY(idx < capacity) ? idx : (idx - capacity); - } -}; - -// Enables specializing checkLegalKey without specializing its class. -namespace detail { -template -inline void checkLegalKeyIfKeyTImpl( - NotKeyT /* ignored */, - KeyT /* emptyKey */, - KeyT /* lockedKey */, - KeyT /* erasedKey */) {} - -template -inline void checkLegalKeyIfKeyTImpl( - KeyT key_in, - KeyT emptyKey, - KeyT lockedKey, - KeyT erasedKey) { - DCHECK_NE(key_in, emptyKey); - DCHECK_NE(key_in, lockedKey); - DCHECK_NE(key_in, erasedKey); -} -} // namespace detail - -template < - class KeyT, - class ValueT, - class HashFcn = std::hash, - class EqualFcn = std::equal_to, - class Allocator = std::allocator, - class ProbeFcn = AtomicHashArrayLinearProbeFcn, - class KeyConvertFcn = Identity> -class AtomicHashMap; - -template < - class KeyT, - class ValueT, - class HashFcn = std::hash, - class EqualFcn = std::equal_to, - class Allocator = std::allocator, - class ProbeFcn = AtomicHashArrayLinearProbeFcn, - class KeyConvertFcn = Identity> -class AtomicHashArray { - static_assert( - (std::is_convertible::value || - std::is_convertible::value || - std::is_convertible::value), - "You are trying to use AtomicHashArray with disallowed key " - "types. You must use atomically compare-and-swappable integer " - "keys, or a different container class."); - - public: - typedef KeyT key_type; - typedef ValueT mapped_type; - typedef HashFcn hasher; - typedef EqualFcn key_equal; - typedef KeyConvertFcn key_convert; - typedef std::pair value_type; - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - typedef value_type& reference; - typedef const value_type& const_reference; - typedef value_type* pointer; - typedef const value_type* const_pointer; - - const size_t capacity_; - const size_t maxEntries_; - const KeyT kEmptyKey_; - const KeyT kLockedKey_; - const KeyT kErasedKey_; - - template - struct aha_iterator; - - typedef aha_iterator const_iterator; - typedef aha_iterator iterator; - - // You really shouldn't need this if you use the SmartPtr provided by create, - // but if you really want to do something crazy like stick the released - // pointer into a DescriminatedPtr or something, you'll need this to clean up - // after yourself. - static void destroy(AtomicHashArray*); - - private: - const size_t kAnchorMask_; - - struct Deleter { - void operator()(AtomicHashArray* ptr) { - AtomicHashArray::destroy(ptr); - } - }; - - public: - typedef std::unique_ptr SmartPtr; - - /* - * create -- - * - * Creates AtomicHashArray objects. Use instead of constructor/destructor. - * - * We do things this way in order to avoid the perf penalty of a second - * pointer indirection when composing these into AtomicHashMap, which needs - * to store an array of pointers so that it can perform atomic operations on - * them when growing. - * - * Instead of a mess of arguments, we take a max size and a Config struct to - * simulate named ctor parameters. The Config struct has sensible defaults - * for everything, but is overloaded - if you specify a positive capacity, - * that will be used directly instead of computing it based on - * maxLoadFactor. - * - * Create returns an AHA::SmartPtr which is a unique_ptr with a custom - * deleter to make sure everything is cleaned up properly. - */ - struct Config { - KeyT emptyKey; - KeyT lockedKey; - KeyT erasedKey; - double maxLoadFactor; - double growthFactor; - uint32_t entryCountThreadCacheSize; - size_t capacity; // if positive, overrides maxLoadFactor - - // Cannot have constexpr ctor because some compilers rightly complain. - Config() - : emptyKey((KeyT)-1), - lockedKey((KeyT)-2), - erasedKey((KeyT)-3), - maxLoadFactor(0.8), - growthFactor(-1), - entryCountThreadCacheSize(1000), - capacity(0) {} - }; - - // Cannot have pre-instantiated const Config instance because of SIOF. - static SmartPtr create(size_t maxSize, const Config& c = Config()); - - /* - * find -- - * - * - * Returns the iterator to the element if found, otherwise end(). - * - * As an optional feature, the type of the key to look up (LookupKeyT) is - * allowed to be different from the type of keys actually stored (KeyT). - * - * This enables use cases where materializing the key is costly and usually - * redudant, e.g., canonicalizing/interning a set of strings and being able - * to look up by StringPiece. To use this feature, LookupHashFcn must take - * a LookupKeyT, and LookupEqualFcn must take KeyT and LookupKeyT as first - * and second parameter, respectively. - * - * See folly/test/ArrayHashArrayTest.cpp for sample usage. - */ - template < - typename LookupKeyT = key_type, - typename LookupHashFcn = hasher, - typename LookupEqualFcn = key_equal> - iterator find(LookupKeyT k) { - return iterator( - this, findInternal(k).idx); - } - - template < - typename LookupKeyT = key_type, - typename LookupHashFcn = hasher, - typename LookupEqualFcn = key_equal> - const_iterator find(LookupKeyT k) const { - return const_cast(this) - ->find(k); - } - - /* - * insert -- - * - * Returns a pair with iterator to the element at r.first and bool success. - * Retrieve the index with ret.first.getIndex(). - * - * Fails on key collision (does not overwrite) or if map becomes - * full, at which point no element is inserted, iterator is set to end(), - * and success is set false. On collisions, success is set false, but the - * iterator is set to the existing entry. - */ - std::pair insert(const value_type& r) { - return emplace(r.first, r.second); - } - std::pair insert(value_type&& r) { - return emplace(r.first, std::move(r.second)); - } - - /* - * emplace -- - * - * Same contract as insert(), but performs in-place construction - * of the value type using the specified arguments. - * - * Also, like find(), this method optionally allows 'key_in' to have a type - * different from that stored in the table; see find(). If and only if no - * equal key is already present, this method converts 'key_in' to a key of - * type KeyT using the provided LookupKeyToKeyFcn. - */ - template < - typename LookupKeyT = key_type, - typename LookupHashFcn = hasher, - typename LookupEqualFcn = key_equal, - typename LookupKeyToKeyFcn = key_convert, - typename... ArgTs> - std::pair emplace(LookupKeyT key_in, ArgTs&&... vCtorArgs) { - SimpleRetT ret = insertInternal< - LookupKeyT, - LookupHashFcn, - LookupEqualFcn, - LookupKeyToKeyFcn>(key_in, std::forward(vCtorArgs)...); - return std::make_pair(iterator(this, ret.idx), ret.success); - } - - // returns the number of elements erased - should never exceed 1 - size_t erase(KeyT k); - - // clears all keys and values in the map and resets all counters. Not thread - // safe. - void clear(); - - // Exact number of elements in the map - note that readFull() acquires a - // mutex. See folly/ThreadCachedInt.h for more details. - size_t size() const { - return numEntries_.readFull() - numErases_.load(std::memory_order_relaxed); - } - - bool empty() const { - return size() == 0; - } - - iterator begin() { - iterator it(this, 0); - it.advancePastEmpty(); - return it; - } - const_iterator begin() const { - const_iterator it(this, 0); - it.advancePastEmpty(); - return it; - } - - iterator end() { - return iterator(this, capacity_); - } - const_iterator end() const { - return const_iterator(this, capacity_); - } - - // See AtomicHashMap::findAt - access elements directly - // WARNING: The following 2 functions will fail silently for hashtable - // with capacity > 2^32 - iterator findAt(uint32_t idx) { - DCHECK_LT(idx, capacity_); - return iterator(this, idx); - } - const_iterator findAt(uint32_t idx) const { - return const_cast(this)->findAt(idx); - } - - iterator makeIter(size_t idx) { - return iterator(this, idx); - } - const_iterator makeIter(size_t idx) const { - return const_iterator(this, idx); - } - - // The max load factor allowed for this map - double maxLoadFactor() const { - return ((double)maxEntries_) / capacity_; - } - - void setEntryCountThreadCacheSize(uint32_t newSize) { - numEntries_.setCacheSize(newSize); - numPendingEntries_.setCacheSize(newSize); - } - - uint32_t getEntryCountThreadCacheSize() const { - return numEntries_.getCacheSize(); - } - - /* Private data and helper functions... */ - - private: - friend class AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn>; - - struct SimpleRetT { - size_t idx; - bool success; - SimpleRetT(size_t i, bool s) : idx(i), success(s) {} - SimpleRetT() = default; - }; - - template < - typename LookupKeyT = key_type, - typename LookupHashFcn = hasher, - typename LookupEqualFcn = key_equal, - typename LookupKeyToKeyFcn = Identity, - typename... ArgTs> - SimpleRetT insertInternal(LookupKeyT key, ArgTs&&... vCtorArgs); - - template < - typename LookupKeyT = key_type, - typename LookupHashFcn = hasher, - typename LookupEqualFcn = key_equal> - SimpleRetT findInternal(const LookupKeyT key); - - template - void checkLegalKeyIfKey(MaybeKeyT key) { - detail::checkLegalKeyIfKeyTImpl(key, kEmptyKey_, kLockedKey_, kErasedKey_); - } - - static std::atomic* cellKeyPtr(const value_type& r) { - // We need some illegal casting here in order to actually store - // our value_type as a std::pair. But a little bit of - // undefined behavior never hurt anyone ... - static_assert( - sizeof(std::atomic) == sizeof(KeyT), - "std::atomic is implemented in an unexpected way for AHM"); - return const_cast*>( - reinterpret_cast const*>(&r.first)); - } - - static KeyT relaxedLoadKey(const value_type& r) { - return cellKeyPtr(r)->load(std::memory_order_relaxed); - } - - static KeyT acquireLoadKey(const value_type& r) { - return cellKeyPtr(r)->load(std::memory_order_acquire); - } - - // Fun with thread local storage - atomic increment is expensive - // (relatively), so we accumulate in the thread cache and periodically - // flush to the actual variable, and walk through the unflushed counts when - // reading the value, so be careful of calling size() too frequently. This - // increases insertion throughput several times over while keeping the count - // accurate. - ThreadCachedInt numEntries_; // Successful key inserts - ThreadCachedInt numPendingEntries_; // Used by insertInternal - std::atomic isFull_; // Used by insertInternal - std::atomic numErases_; // Successful key erases - - value_type cells_[0]; // This must be the last field of this class - - // Force constructor/destructor private since create/destroy should be - // used externally instead - AtomicHashArray( - size_t capacity, - KeyT emptyKey, - KeyT lockedKey, - KeyT erasedKey, - double maxLoadFactor, - uint32_t cacheSize); - - AtomicHashArray(const AtomicHashArray&) = delete; - AtomicHashArray& operator=(const AtomicHashArray&) = delete; - - ~AtomicHashArray() = default; - - inline void unlockCell(value_type* const cell, KeyT newKey) { - cellKeyPtr(*cell)->store(newKey, std::memory_order_release); - } - - inline bool tryLockCell(value_type* const cell) { - KeyT expect = kEmptyKey_; - return cellKeyPtr(*cell)->compare_exchange_strong( - expect, kLockedKey_, std::memory_order_acq_rel); - } - - template - inline size_t keyToAnchorIdx(const LookupKeyT k) const { - const size_t hashVal = LookupHashFcn()(k); - const size_t probe = hashVal & kAnchorMask_; - return LIKELY(probe < capacity_) ? probe : hashVal % capacity_; - } - -}; // AtomicHashArray - -} // namespace folly - -#include diff --git a/ios/Pods/Flipper-Folly/folly/AtomicHashMap-inl.h b/ios/Pods/Flipper-Folly/folly/AtomicHashMap-inl.h deleted file mode 100644 index f15f07e..0000000 --- a/ios/Pods/Flipper-Folly/folly/AtomicHashMap-inl.h +++ /dev/null @@ -1,657 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef FOLLY_ATOMICHASHMAP_H_ -#error "This should only be included by AtomicHashMap.h" -#endif - -#include -#include - -#include - -namespace folly { - -// AtomicHashMap constructor -- Atomic wrapper that allows growth -// This class has a lot of overhead (184 Bytes) so only use for big maps -template < - typename KeyT, - typename ValueT, - typename HashFcn, - typename EqualFcn, - typename Allocator, - typename ProbeFcn, - typename KeyConvertFcn> -AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::AtomicHashMap(size_t finalSizeEst, const Config& config) - : kGrowthFrac_( - config.growthFactor < 0 ? 1.0f - config.maxLoadFactor - : config.growthFactor) { - CHECK(config.maxLoadFactor > 0.0f && config.maxLoadFactor < 1.0f); - subMaps_[0].store( - SubMap::create(finalSizeEst, config).release(), - std::memory_order_relaxed); - auto subMapCount = kNumSubMaps_; - FOR_EACH_RANGE (i, 1, subMapCount) { - subMaps_[i].store(nullptr, std::memory_order_relaxed); - } - numMapsAllocated_.store(1, std::memory_order_relaxed); -} - -// emplace -- -template < - typename KeyT, - typename ValueT, - typename HashFcn, - typename EqualFcn, - typename Allocator, - typename ProbeFcn, - typename KeyConvertFcn> -template < - typename LookupKeyT, - typename LookupHashFcn, - typename LookupEqualFcn, - typename LookupKeyToKeyFcn, - typename... ArgTs> -std::pair< - typename AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::iterator, - bool> -AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::emplace(LookupKeyT k, ArgTs&&... vCtorArgs) { - SimpleRetT ret = insertInternal< - LookupKeyT, - LookupHashFcn, - LookupEqualFcn, - LookupKeyToKeyFcn>(k, std::forward(vCtorArgs)...); - SubMap* subMap = subMaps_[ret.i].load(std::memory_order_relaxed); - return std::make_pair( - iterator(this, ret.i, subMap->makeIter(ret.j)), ret.success); -} - -// insertInternal -- Allocates new sub maps as existing ones fill up. -template < - typename KeyT, - typename ValueT, - typename HashFcn, - typename EqualFcn, - typename Allocator, - typename ProbeFcn, - typename KeyConvertFcn> -template < - typename LookupKeyT, - typename LookupHashFcn, - typename LookupEqualFcn, - typename LookupKeyToKeyFcn, - typename... ArgTs> -typename AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::SimpleRetT -AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::insertInternal(LookupKeyT key, ArgTs&&... vCtorArgs) { -beginInsertInternal: - auto nextMapIdx = // this maintains our state - numMapsAllocated_.load(std::memory_order_acquire); - typename SubMap::SimpleRetT ret; - FOR_EACH_RANGE (i, 0, nextMapIdx) { - // insert in each map successively. If one succeeds, we're done! - SubMap* subMap = subMaps_[i].load(std::memory_order_relaxed); - ret = subMap->template insertInternal< - LookupKeyT, - LookupHashFcn, - LookupEqualFcn, - LookupKeyToKeyFcn>(key, std::forward(vCtorArgs)...); - if (ret.idx == subMap->capacity_) { - continue; // map is full, so try the next one - } - // Either collision or success - insert in either case - return SimpleRetT(i, ret.idx, ret.success); - } - - // If we made it this far, all maps are full and we need to try to allocate - // the next one. - - SubMap* primarySubMap = subMaps_[0].load(std::memory_order_relaxed); - if (nextMapIdx >= kNumSubMaps_ || - primarySubMap->capacity_ * kGrowthFrac_ < 1.0) { - // Can't allocate any more sub maps. - throw AtomicHashMapFullError(); - } - - if (tryLockMap(nextMapIdx)) { - // Alloc a new map and shove it in. We can change whatever - // we want because other threads are waiting on us... - size_t numCellsAllocated = (size_t)( - primarySubMap->capacity_ * - std::pow(1.0 + kGrowthFrac_, nextMapIdx - 1)); - size_t newSize = size_t(numCellsAllocated * kGrowthFrac_); - DCHECK( - subMaps_[nextMapIdx].load(std::memory_order_relaxed) == - (SubMap*)kLockedPtr_); - // create a new map using the settings stored in the first map - - Config config; - config.emptyKey = primarySubMap->kEmptyKey_; - config.lockedKey = primarySubMap->kLockedKey_; - config.erasedKey = primarySubMap->kErasedKey_; - config.maxLoadFactor = primarySubMap->maxLoadFactor(); - config.entryCountThreadCacheSize = - primarySubMap->getEntryCountThreadCacheSize(); - subMaps_[nextMapIdx].store( - SubMap::create(newSize, config).release(), std::memory_order_relaxed); - - // Publish the map to other threads. - numMapsAllocated_.fetch_add(1, std::memory_order_release); - DCHECK_EQ( - nextMapIdx + 1, numMapsAllocated_.load(std::memory_order_relaxed)); - } else { - // If we lost the race, we'll have to wait for the next map to get - // allocated before doing any insertion here. - detail::atomic_hash_spin_wait([&] { - return nextMapIdx >= numMapsAllocated_.load(std::memory_order_acquire); - }); - } - - // Relaxed is ok here because either we just created this map, or we - // just did a spin wait with an acquire load on numMapsAllocated_. - SubMap* loadedMap = subMaps_[nextMapIdx].load(std::memory_order_relaxed); - DCHECK(loadedMap && loadedMap != (SubMap*)kLockedPtr_); - ret = loadedMap->insertInternal(key, std::forward(vCtorArgs)...); - if (ret.idx != loadedMap->capacity_) { - return SimpleRetT(nextMapIdx, ret.idx, ret.success); - } - // We took way too long and the new map is already full...try again from - // the top (this should pretty much never happen). - goto beginInsertInternal; -} - -// find -- -template < - typename KeyT, - typename ValueT, - typename HashFcn, - typename EqualFcn, - typename Allocator, - typename ProbeFcn, - typename KeyConvertFcn> -template -typename AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::iterator -AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::find(LookupKeyT k) { - SimpleRetT ret = findInternal(k); - if (!ret.success) { - return end(); - } - SubMap* subMap = subMaps_[ret.i].load(std::memory_order_relaxed); - return iterator(this, ret.i, subMap->makeIter(ret.j)); -} - -template < - typename KeyT, - typename ValueT, - typename HashFcn, - typename EqualFcn, - typename Allocator, - typename ProbeFcn, - typename KeyConvertFcn> -template -typename AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::const_iterator -AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::find(LookupKeyT k) const { - return const_cast(this) - ->find(k); -} - -// findInternal -- -template < - typename KeyT, - typename ValueT, - typename HashFcn, - typename EqualFcn, - typename Allocator, - typename ProbeFcn, - typename KeyConvertFcn> -template -typename AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::SimpleRetT -AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::findInternal(const LookupKeyT k) const { - SubMap* const primaryMap = subMaps_[0].load(std::memory_order_relaxed); - typename SubMap::SimpleRetT ret = - primaryMap - ->template findInternal(k); - if (LIKELY(ret.idx != primaryMap->capacity_)) { - return SimpleRetT(0, ret.idx, ret.success); - } - const unsigned int numMaps = - numMapsAllocated_.load(std::memory_order_acquire); - FOR_EACH_RANGE (i, 1, numMaps) { - // Check each map successively. If one succeeds, we're done! - SubMap* thisMap = subMaps_[i].load(std::memory_order_relaxed); - ret = - thisMap - ->template findInternal( - k); - if (LIKELY(ret.idx != thisMap->capacity_)) { - return SimpleRetT(i, ret.idx, ret.success); - } - } - // Didn't find our key... - return SimpleRetT(numMaps, 0, false); -} - -// findAtInternal -- see encodeIndex() for details. -template < - typename KeyT, - typename ValueT, - typename HashFcn, - typename EqualFcn, - typename Allocator, - typename ProbeFcn, - typename KeyConvertFcn> -typename AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::SimpleRetT -AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::findAtInternal(uint32_t idx) const { - uint32_t subMapIdx, subMapOffset; - if (idx & kSecondaryMapBit_) { - // idx falls in a secondary map - idx &= ~kSecondaryMapBit_; // unset secondary bit - subMapIdx = idx >> kSubMapIndexShift_; - DCHECK_LT(subMapIdx, numMapsAllocated_.load(std::memory_order_relaxed)); - subMapOffset = idx & kSubMapIndexMask_; - } else { - // idx falls in primary map - subMapIdx = 0; - subMapOffset = idx; - } - return SimpleRetT(subMapIdx, subMapOffset, true); -} - -// erase -- -template < - typename KeyT, - typename ValueT, - typename HashFcn, - typename EqualFcn, - typename Allocator, - typename ProbeFcn, - typename KeyConvertFcn> -typename AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::size_type -AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::erase(const KeyT k) { - int const numMaps = numMapsAllocated_.load(std::memory_order_acquire); - FOR_EACH_RANGE (i, 0, numMaps) { - // Check each map successively. If one succeeds, we're done! - if (subMaps_[i].load(std::memory_order_relaxed)->erase(k)) { - return 1; - } - } - // Didn't find our key... - return 0; -} - -// capacity -- summation of capacities of all submaps -template < - typename KeyT, - typename ValueT, - typename HashFcn, - typename EqualFcn, - typename Allocator, - typename ProbeFcn, - typename KeyConvertFcn> -size_t AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::capacity() const { - size_t totalCap(0); - int const numMaps = numMapsAllocated_.load(std::memory_order_acquire); - FOR_EACH_RANGE (i, 0, numMaps) { - totalCap += subMaps_[i].load(std::memory_order_relaxed)->capacity_; - } - return totalCap; -} - -// spaceRemaining -- -// number of new insertions until current submaps are all at max load -template < - typename KeyT, - typename ValueT, - typename HashFcn, - typename EqualFcn, - typename Allocator, - typename ProbeFcn, - typename KeyConvertFcn> -size_t AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::spaceRemaining() const { - size_t spaceRem(0); - int const numMaps = numMapsAllocated_.load(std::memory_order_acquire); - FOR_EACH_RANGE (i, 0, numMaps) { - SubMap* thisMap = subMaps_[i].load(std::memory_order_relaxed); - spaceRem += - std::max(0, thisMap->maxEntries_ - &thisMap->numEntries_.readFull()); - } - return spaceRem; -} - -// clear -- Wipes all keys and values from primary map and destroys -// all secondary maps. Not thread safe. -template < - typename KeyT, - typename ValueT, - typename HashFcn, - typename EqualFcn, - typename Allocator, - typename ProbeFcn, - typename KeyConvertFcn> -void AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::clear() { - subMaps_[0].load(std::memory_order_relaxed)->clear(); - int const numMaps = numMapsAllocated_.load(std::memory_order_relaxed); - FOR_EACH_RANGE (i, 1, numMaps) { - SubMap* thisMap = subMaps_[i].load(std::memory_order_relaxed); - DCHECK(thisMap); - SubMap::destroy(thisMap); - subMaps_[i].store(nullptr, std::memory_order_relaxed); - } - numMapsAllocated_.store(1, std::memory_order_relaxed); -} - -// size -- -template < - typename KeyT, - typename ValueT, - typename HashFcn, - typename EqualFcn, - typename Allocator, - typename ProbeFcn, - typename KeyConvertFcn> -size_t AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::size() const { - size_t totalSize(0); - int const numMaps = numMapsAllocated_.load(std::memory_order_acquire); - FOR_EACH_RANGE (i, 0, numMaps) { - totalSize += subMaps_[i].load(std::memory_order_relaxed)->size(); - } - return totalSize; -} - -// encodeIndex -- Encode the submap index and offset into return. -// index_ret must be pre-populated with the submap offset. -// -// We leave index_ret untouched when referring to the primary map -// so it can be as large as possible (31 data bits). Max size of -// secondary maps is limited by what can fit in the low 27 bits. -// -// Returns the following bit-encoded data in index_ret: -// if subMap == 0 (primary map) => -// bit(s) value -// 31 0 -// 0-30 submap offset (index_ret input) -// -// if subMap > 0 (secondary maps) => -// bit(s) value -// 31 1 -// 27-30 which subMap -// 0-26 subMap offset (index_ret input) -template < - typename KeyT, - typename ValueT, - typename HashFcn, - typename EqualFcn, - typename Allocator, - typename ProbeFcn, - typename KeyConvertFcn> -inline uint32_t AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::encodeIndex(uint32_t subMap, uint32_t offset) { - DCHECK_EQ(offset & kSecondaryMapBit_, 0); // offset can't be too big - if (subMap == 0) { - return offset; - } - // Make sure subMap isn't too big - DCHECK_EQ(subMap >> kNumSubMapBits_, 0); - // Make sure subMap bits of offset are clear - DCHECK_EQ(offset & (~kSubMapIndexMask_ | kSecondaryMapBit_), 0); - - // Set high-order bits to encode which submap this index belongs to - return offset | (subMap << kSubMapIndexShift_) | kSecondaryMapBit_; -} - -// Iterator implementation - -template < - typename KeyT, - typename ValueT, - typename HashFcn, - typename EqualFcn, - typename Allocator, - typename ProbeFcn, - typename KeyConvertFcn> -template -struct AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn>::ahm_iterator - : detail::IteratorFacade< - ahm_iterator, - IterVal, - std::forward_iterator_tag> { - explicit ahm_iterator() : ahm_(nullptr) {} - - // Conversion ctor for interoperability between const_iterator and - // iterator. The enable_if<> magic keeps us well-behaved for - // is_convertible<> (v. the iterator_facade documentation). - template - ahm_iterator( - const ahm_iterator& o, - typename std::enable_if< - std::is_convertible::value>::type* = nullptr) - : ahm_(o.ahm_), subMap_(o.subMap_), subIt_(o.subIt_) {} - - /* - * Returns the unique index that can be used for access directly - * into the data storage. - */ - uint32_t getIndex() const { - CHECK(!isEnd()); - return ahm_->encodeIndex(subMap_, subIt_.getIndex()); - } - - private: - friend class AtomicHashMap; - explicit ahm_iterator(ContT* ahm, uint32_t subMap, const SubIt& subIt) - : ahm_(ahm), subMap_(subMap), subIt_(subIt) {} - - friend class detail:: - IteratorFacade; - - void increment() { - CHECK(!isEnd()); - ++subIt_; - checkAdvanceToNextSubmap(); - } - - bool equal(const ahm_iterator& other) const { - if (ahm_ != other.ahm_) { - return false; - } - - if (isEnd() || other.isEnd()) { - return isEnd() == other.isEnd(); - } - - return subMap_ == other.subMap_ && subIt_ == other.subIt_; - } - - IterVal& dereference() const { - return *subIt_; - } - - bool isEnd() const { - return ahm_ == nullptr; - } - - void checkAdvanceToNextSubmap() { - if (isEnd()) { - return; - } - - SubMap* thisMap = ahm_->subMaps_[subMap_].load(std::memory_order_relaxed); - while (subIt_ == thisMap->end()) { - // This sub iterator is done, advance to next one - if (subMap_ + 1 < - ahm_->numMapsAllocated_.load(std::memory_order_acquire)) { - ++subMap_; - thisMap = ahm_->subMaps_[subMap_].load(std::memory_order_relaxed); - subIt_ = thisMap->begin(); - } else { - ahm_ = nullptr; - return; - } - } - } - - private: - ContT* ahm_; - uint32_t subMap_; - SubIt subIt_; -}; // ahm_iterator - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/AtomicHashMap.h b/ios/Pods/Flipper-Folly/folly/AtomicHashMap.h deleted file mode 100644 index e9d0e66..0000000 --- a/ios/Pods/Flipper-Folly/folly/AtomicHashMap.h +++ /dev/null @@ -1,500 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * AtomicHashMap -- - * - * A high-performance concurrent hash map with int32_t or int64_t keys. Supports - * insert, find(key), findAt(index), erase(key), size, and more. Memory cannot - * be freed or reclaimed by erase. Can grow to a maximum of about 18 times the - * initial capacity, but performance degrades linearly with growth. Can also be - * used as an object store with unique 32-bit references directly into the - * internal storage (retrieved with iterator::getIndex()). - * - * Advantages: - * - High-performance (~2-4x tbb::concurrent_hash_map in heavily - * multi-threaded environments). - * - Efficient memory usage if initial capacity is not over estimated - * (especially for small keys and values). - * - Good fragmentation properties (only allocates in large slabs which can - * be reused with clear() and never move). - * - Can generate unique, long-lived 32-bit references for efficient lookup - * (see findAt()). - * - * Disadvantages: - * - Keys must be native int32_t or int64_t, or explicitly converted. - * - Must be able to specify unique empty, locked, and erased keys - * - Performance degrades linearly as size grows beyond initialization - * capacity. - * - Max size limit of ~18x initial size (dependent on max load factor). - * - Memory is not freed or reclaimed by erase. - * - * Usage and Operation Details: - * Simple performance/memory tradeoff with maxLoadFactor. Higher load factors - * give better memory utilization but probe lengths increase, reducing - * performance. - * - * Implementation and Performance Details: - * AHArray is a fixed size contiguous block of value_type cells. When - * writing a cell, the key is locked while the rest of the record is - * written. Once done, the cell is unlocked by setting the key. find() - * is completely wait-free and doesn't require any non-relaxed atomic - * operations. AHA cannot grow beyond initialization capacity, but is - * faster because of reduced data indirection. - * - * AHMap is a wrapper around AHArray sub-maps that allows growth and provides - * an interface closer to the STL UnorderedAssociativeContainer concept. These - * sub-maps are allocated on the fly and are processed in series, so the more - * there are (from growing past initial capacity), the worse the performance. - * - * Insert returns false if there is a key collision and throws if the max size - * of the map is exceeded. - * - * Benchmark performance with 8 simultaneous threads processing 1 million - * unique entries on a 4-core, 2.5 GHz machine: - * - * Load Factor Mem Efficiency usec/Insert usec/Find - * 50% 50% 0.19 0.05 - * 85% 85% 0.20 0.06 - * 90% 90% 0.23 0.08 - * 95% 95% 0.27 0.10 - * - * See folly/tests/AtomicHashMapTest.cpp for more benchmarks. - * - * @author Spencer Ahrens - * @author Jordan DeLong - * - */ - -#pragma once -#define FOLLY_ATOMICHASHMAP_H_ - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -namespace folly { - -/* - * AtomicHashMap provides an interface somewhat similar to the - * UnorderedAssociativeContainer concept in C++. This does not - * exactly match this concept (or even the basic Container concept), - * because of some restrictions imposed by our datastructure. - * - * Specific differences (there are quite a few): - * - * - Efficiently thread safe for inserts (main point of this stuff), - * wait-free for lookups. - * - * - You can erase from this container, but the cell containing the key will - * not be free or reclaimed. - * - * - You can erase everything by calling clear() (and you must guarantee only - * one thread can be using the container to do that). - * - * - We aren't DefaultConstructible, CopyConstructible, Assignable, or - * EqualityComparable. (Most of these are probably not something - * you actually want to do with this anyway.) - * - * - We don't support the various bucket functions, rehash(), - * reserve(), or equal_range(). Also no constructors taking - * iterators, although this could change. - * - * - Several insertion functions, notably operator[], are not - * implemented. It is a little too easy to misuse these functions - * with this container, where part of the point is that when an - * insertion happens for a new key, it will atomically have the - * desired value. - * - * - The map has no templated insert() taking an iterator range, but - * we do provide an insert(key, value). The latter seems more - * frequently useful for this container (to avoid sprinkling - * make_pair everywhere), and providing both can lead to some gross - * template error messages. - * - * - The Allocator must not be stateful (a new instance will be spun up for - * each allocation), and its allocate() method must take a raw number of - * bytes. - * - * - KeyT must be a 32 bit or 64 bit atomic integer type, and you must - * define special 'locked' and 'empty' key values in the ctor - * - * - We don't take the Hash function object as an instance in the - * constructor. - * - */ - -// Thrown when insertion fails due to running out of space for -// submaps. -struct FOLLY_EXPORT AtomicHashMapFullError : std::runtime_error { - explicit AtomicHashMapFullError() - : std::runtime_error("AtomicHashMap is full") {} -}; - -template < - class KeyT, - class ValueT, - class HashFcn, - class EqualFcn, - class Allocator, - class ProbeFcn, - class KeyConvertFcn> -class AtomicHashMap { - typedef AtomicHashArray< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - ProbeFcn, - KeyConvertFcn> - SubMap; - - public: - typedef KeyT key_type; - typedef ValueT mapped_type; - typedef std::pair value_type; - typedef HashFcn hasher; - typedef EqualFcn key_equal; - typedef KeyConvertFcn key_convert; - typedef value_type* pointer; - typedef value_type& reference; - typedef const value_type& const_reference; - typedef std::ptrdiff_t difference_type; - typedef std::size_t size_type; - typedef typename SubMap::Config Config; - - template - struct ahm_iterator; - - typedef ahm_iterator< - const AtomicHashMap, - const value_type, - typename SubMap::const_iterator> - const_iterator; - typedef ahm_iterator - iterator; - - public: - const float kGrowthFrac_; // How much to grow when we run out of capacity. - - // The constructor takes a finalSizeEst which is the optimal - // number of elements to maximize space utilization and performance, - // and a Config object to specify more advanced options. - explicit AtomicHashMap(size_t finalSizeEst, const Config& c = Config()); - - AtomicHashMap(const AtomicHashMap&) = delete; - AtomicHashMap& operator=(const AtomicHashMap&) = delete; - - ~AtomicHashMap() { - const unsigned int numMaps = - numMapsAllocated_.load(std::memory_order_relaxed); - FOR_EACH_RANGE (i, 0, numMaps) { - SubMap* thisMap = subMaps_[i].load(std::memory_order_relaxed); - DCHECK(thisMap); - SubMap::destroy(thisMap); - } - } - - key_equal key_eq() const { - return key_equal(); - } - hasher hash_function() const { - return hasher(); - } - - /* - * insert -- - * - * Returns a pair with iterator to the element at r.first and - * success. Retrieve the index with ret.first.getIndex(). - * - * Does not overwrite on key collision, but returns an iterator to - * the existing element (since this could due to a race with - * another thread, it is often important to check this return - * value). - * - * Allocates new sub maps as the existing ones become full. If - * all sub maps are full, no element is inserted, and - * AtomicHashMapFullError is thrown. - */ - std::pair insert(const value_type& r) { - return emplace(r.first, r.second); - } - std::pair insert(key_type k, const mapped_type& v) { - return emplace(k, v); - } - std::pair insert(value_type&& r) { - return emplace(r.first, std::move(r.second)); - } - std::pair insert(key_type k, mapped_type&& v) { - return emplace(k, std::move(v)); - } - - /* - * emplace -- - * - * Same contract as insert(), but performs in-place construction - * of the value type using the specified arguments. - * - * Also, like find(), this method optionally allows 'key_in' to have a type - * different from that stored in the table; see find(). If and only if no - * equal key is already present, this method converts 'key_in' to a key of - * type KeyT using the provided LookupKeyToKeyFcn. - */ - template < - typename LookupKeyT = key_type, - typename LookupHashFcn = hasher, - typename LookupEqualFcn = key_equal, - typename LookupKeyToKeyFcn = key_convert, - typename... ArgTs> - std::pair emplace(LookupKeyT k, ArgTs&&... vCtorArg); - - /* - * find -- - * - * Returns the iterator to the element if found, otherwise end(). - * - * As an optional feature, the type of the key to look up (LookupKeyT) is - * allowed to be different from the type of keys actually stored (KeyT). - * - * This enables use cases where materializing the key is costly and usually - * redudant, e.g., canonicalizing/interning a set of strings and being able - * to look up by StringPiece. To use this feature, LookupHashFcn must take - * a LookupKeyT, and LookupEqualFcn must take KeyT and LookupKeyT as first - * and second parameter, respectively. - * - * See folly/test/ArrayHashMapTest.cpp for sample usage. - */ - template < - typename LookupKeyT = key_type, - typename LookupHashFcn = hasher, - typename LookupEqualFcn = key_equal> - iterator find(LookupKeyT k); - - template < - typename LookupKeyT = key_type, - typename LookupHashFcn = hasher, - typename LookupEqualFcn = key_equal> - const_iterator find(LookupKeyT k) const; - - /* - * erase -- - * - * Erases key k from the map - * - * Returns 1 iff the key is found and erased, and 0 otherwise. - */ - size_type erase(key_type k); - - /* - * clear -- - * - * Wipes all keys and values from primary map and destroys all secondary - * maps. Primary map remains allocated and thus the memory can be reused - * in place. Not thread safe. - * - */ - void clear(); - - /* - * size -- - * - * Returns the exact size of the map. Note this is not as cheap as typical - * size() implementations because, for each AtomicHashArray in this AHM, we - * need to grab a lock and accumulate the values from all the thread local - * counters. See folly/ThreadCachedInt.h for more details. - */ - size_t size() const; - - bool empty() const { - return size() == 0; - } - - size_type count(key_type k) const { - return find(k) == end() ? 0 : 1; - } - - /* - * findAt -- - * - * Returns an iterator into the map. - * - * idx should only be an unmodified value returned by calling getIndex() on - * a valid iterator returned by find() or insert(). If idx is invalid you - * have a bug and the process aborts. - */ - iterator findAt(uint32_t idx) { - SimpleRetT ret = findAtInternal(idx); - DCHECK_LT(ret.i, numSubMaps()); - return iterator( - this, - ret.i, - subMaps_[ret.i].load(std::memory_order_relaxed)->makeIter(ret.j)); - } - const_iterator findAt(uint32_t idx) const { - return const_cast(this)->findAt(idx); - } - - // Total capacity - summation of capacities of all submaps. - size_t capacity() const; - - // Number of new insertions until current submaps are all at max load factor. - size_t spaceRemaining() const; - - void setEntryCountThreadCacheSize(int32_t newSize) { - const int numMaps = numMapsAllocated_.load(std::memory_order_acquire); - for (int i = 0; i < numMaps; ++i) { - SubMap* map = subMaps_[i].load(std::memory_order_relaxed); - map->setEntryCountThreadCacheSize(newSize); - } - } - - // Number of sub maps allocated so far to implement this map. The more there - // are, the worse the performance. - int numSubMaps() const { - return numMapsAllocated_.load(std::memory_order_acquire); - } - - iterator begin() { - iterator it(this, 0, subMaps_[0].load(std::memory_order_relaxed)->begin()); - it.checkAdvanceToNextSubmap(); - return it; - } - - const_iterator begin() const { - const_iterator it( - this, 0, subMaps_[0].load(std::memory_order_relaxed)->begin()); - it.checkAdvanceToNextSubmap(); - return it; - } - - iterator end() { - return iterator(); - } - - const_iterator end() const { - return const_iterator(); - } - - /* Advanced functions for direct access: */ - - inline uint32_t recToIdx(const value_type& r, bool mayInsert = true) { - SimpleRetT ret = - mayInsert ? insertInternal(r.first, r.second) : findInternal(r.first); - return encodeIndex(ret.i, ret.j); - } - - inline uint32_t recToIdx(value_type&& r, bool mayInsert = true) { - SimpleRetT ret = mayInsert ? insertInternal(r.first, std::move(r.second)) - : findInternal(r.first); - return encodeIndex(ret.i, ret.j); - } - - inline uint32_t - recToIdx(key_type k, const mapped_type& v, bool mayInsert = true) { - SimpleRetT ret = mayInsert ? insertInternal(k, v) : findInternal(k); - return encodeIndex(ret.i, ret.j); - } - - inline uint32_t recToIdx(key_type k, mapped_type&& v, bool mayInsert = true) { - SimpleRetT ret = - mayInsert ? insertInternal(k, std::move(v)) : findInternal(k); - return encodeIndex(ret.i, ret.j); - } - - inline uint32_t keyToIdx(const KeyT k, bool mayInsert = false) { - return recToIdx(value_type(k), mayInsert); - } - - inline const value_type& idxToRec(uint32_t idx) const { - SimpleRetT ret = findAtInternal(idx); - return subMaps_[ret.i].load(std::memory_order_relaxed)->idxToRec(ret.j); - } - - /* Private data and helper functions... */ - - private: - // This limits primary submap size to 2^31 ~= 2 billion, secondary submap - // size to 2^(32 - kNumSubMapBits_ - 1) = 2^27 ~= 130 million, and num subMaps - // to 2^kNumSubMapBits_ = 16. - static const uint32_t kNumSubMapBits_ = 4; - static const uint32_t kSecondaryMapBit_ = 1u << 31; // Highest bit - static const uint32_t kSubMapIndexShift_ = 32 - kNumSubMapBits_ - 1; - static const uint32_t kSubMapIndexMask_ = (1 << kSubMapIndexShift_) - 1; - static const uint32_t kNumSubMaps_ = 1 << kNumSubMapBits_; - static const uintptr_t kLockedPtr_ = 0x88ULL << 48; // invalid pointer - - struct SimpleRetT { - uint32_t i; - size_t j; - bool success; - SimpleRetT(uint32_t ii, size_t jj, bool s) : i(ii), j(jj), success(s) {} - SimpleRetT() = default; - }; - - template < - typename LookupKeyT = key_type, - typename LookupHashFcn = hasher, - typename LookupEqualFcn = key_equal, - typename LookupKeyToKeyFcn = key_convert, - typename... ArgTs> - SimpleRetT insertInternal(LookupKeyT key, ArgTs&&... value); - - template < - typename LookupKeyT = key_type, - typename LookupHashFcn = hasher, - typename LookupEqualFcn = key_equal> - SimpleRetT findInternal(const LookupKeyT k) const; - - SimpleRetT findAtInternal(uint32_t idx) const; - - std::atomic subMaps_[kNumSubMaps_]; - std::atomic numMapsAllocated_; - - inline bool tryLockMap(unsigned int idx) { - SubMap* val = nullptr; - return subMaps_[idx].compare_exchange_strong( - val, (SubMap*)kLockedPtr_, std::memory_order_acquire); - } - - static inline uint32_t encodeIndex(uint32_t subMap, uint32_t subMapIdx); - -}; // AtomicHashMap - -template < - class KeyT, - class ValueT, - class HashFcn = std::hash, - class EqualFcn = std::equal_to, - class Allocator = std::allocator> -using QuadraticProbingAtomicHashMap = AtomicHashMap< - KeyT, - ValueT, - HashFcn, - EqualFcn, - Allocator, - AtomicHashArrayQuadraticProbeFcn>; -} // namespace folly - -#include diff --git a/ios/Pods/Flipper-Folly/folly/AtomicIntrusiveLinkedList.h b/ios/Pods/Flipper-Folly/folly/AtomicIntrusiveLinkedList.h deleted file mode 100644 index aa2a866..0000000 --- a/ios/Pods/Flipper-Folly/folly/AtomicIntrusiveLinkedList.h +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include -#include - -namespace folly { - -/** - * A very simple atomic single-linked list primitive. - * - * Usage: - * - * class MyClass { - * AtomicIntrusiveLinkedListHook hook_; - * } - * - * AtomicIntrusiveLinkedList list; - * list.insert(&a); - * list.sweep([] (MyClass* c) { doSomething(c); } - */ -template -struct AtomicIntrusiveLinkedListHook { - T* next{nullptr}; -}; - -template T::*HookMember> -class AtomicIntrusiveLinkedList { - public: - AtomicIntrusiveLinkedList() {} - AtomicIntrusiveLinkedList(const AtomicIntrusiveLinkedList&) = delete; - AtomicIntrusiveLinkedList& operator=(const AtomicIntrusiveLinkedList&) = - delete; - AtomicIntrusiveLinkedList(AtomicIntrusiveLinkedList&& other) noexcept { - auto tmp = other.head_.load(); - other.head_ = head_.load(); - head_ = tmp; - } - AtomicIntrusiveLinkedList& operator=( - AtomicIntrusiveLinkedList&& other) noexcept { - auto tmp = other.head_.load(); - other.head_ = head_.load(); - head_ = tmp; - - return *this; - } - - /** - * Note: list must be empty on destruction. - */ - ~AtomicIntrusiveLinkedList() { - assert(empty()); - } - - bool empty() const { - return head_.load() == nullptr; - } - - /** - * Atomically insert t at the head of the list. - * @return True if the inserted element is the only one in the list - * after the call. - */ - bool insertHead(T* t) { - assert(next(t) == nullptr); - - auto oldHead = head_.load(std::memory_order_relaxed); - do { - next(t) = oldHead; - /* oldHead is updated by the call below. - - NOTE: we don't use next(t) instead of oldHead directly due to - compiler bugs (GCC prior to 4.8.3 (bug 60272), clang (bug 18899), - MSVC (bug 819819); source: - http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange */ - } while (!head_.compare_exchange_weak( - oldHead, t, std::memory_order_release, std::memory_order_relaxed)); - - return oldHead == nullptr; - } - - /** - * Replaces the head with nullptr, - * and calls func() on the removed elements in the order from tail to head. - * Returns false if the list was empty. - */ - template - bool sweepOnce(F&& func) { - if (auto head = head_.exchange(nullptr)) { - auto rhead = reverse(head); - unlinkAll(rhead, std::forward(func)); - return true; - } - return false; - } - - /** - * Repeatedly replaces the head with nullptr, - * and calls func() on the removed elements in the order from tail to head. - * Stops when the list is empty. - */ - template - void sweep(F&& func) { - while (sweepOnce(func)) { - } - } - - /** - * Similar to sweep() but calls func() on elements in LIFO order. - * - * func() is called for all elements in the list at the moment - * reverseSweep() is called. Unlike sweep() it does not loop to ensure the - * list is empty at some point after the last invocation. This way callers - * can reason about the ordering: elements inserted since the last call to - * reverseSweep() will be provided in LIFO order. - * - * Example: if elements are inserted in the order 1-2-3, the callback is - * invoked 3-2-1. If the callback moves elements onto a stack, popping off - * the stack will produce the original insertion order 1-2-3. - */ - template - void reverseSweep(F&& func) { - // We don't loop like sweep() does because the overall order of callbacks - // would be strand-wise LIFO which is meaningless to callers. - auto head = head_.exchange(nullptr); - unlinkAll(head, std::forward(func)); - } - - private: - std::atomic head_{nullptr}; - - static T*& next(T* t) { - return (t->*HookMember).next; - } - - /* Reverses a linked list, returning the pointer to the new head - (old tail) */ - static T* reverse(T* head) { - T* rhead = nullptr; - while (head != nullptr) { - auto t = head; - head = next(t); - next(t) = rhead; - rhead = t; - } - return rhead; - } - - /* Unlinks all elements in the linked list fragment pointed to by `head', - * calling func() on every element */ - template - void unlinkAll(T* head, F&& func) { - while (head != nullptr) { - auto t = head; - head = next(t); - next(t) = nullptr; - func(t); - } - } -}; - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/AtomicLinkedList.h b/ios/Pods/Flipper-Folly/folly/AtomicLinkedList.h deleted file mode 100644 index ecff27a..0000000 --- a/ios/Pods/Flipper-Folly/folly/AtomicLinkedList.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include - -namespace folly { - -/** - * A very simple atomic single-linked list primitive. - * - * Usage: - * - * AtomicLinkedList list; - * list.insert(a); - * list.sweep([] (MyClass& c) { doSomething(c); } - */ - -template -class AtomicLinkedList { - public: - AtomicLinkedList() {} - AtomicLinkedList(const AtomicLinkedList&) = delete; - AtomicLinkedList& operator=(const AtomicLinkedList&) = delete; - AtomicLinkedList(AtomicLinkedList&& other) noexcept = default; - AtomicLinkedList& operator=(AtomicLinkedList&& other) = default; - - ~AtomicLinkedList() { - sweep([](T&&) {}); - } - - bool empty() const { - return list_.empty(); - } - - /** - * Atomically insert t at the head of the list. - * @return True if the inserted element is the only one in the list - * after the call. - */ - bool insertHead(T t) { - auto wrapper = std::make_unique(std::move(t)); - - return list_.insertHead(wrapper.release()); - } - - /** - * Repeatedly pops element from head, - * and calls func() on the removed elements in the order from tail to head. - * Stops when the list is empty. - */ - template - void sweep(F&& func) { - list_.sweep([&](Wrapper* wrapperPtr) mutable { - std::unique_ptr wrapper(wrapperPtr); - - func(std::move(wrapper->data)); - }); - } - - /** - * Similar to sweep() but calls func() on elements in LIFO order. - * - * func() is called for all elements in the list at the moment - * reverseSweep() is called. Unlike sweep() it does not loop to ensure the - * list is empty at some point after the last invocation. This way callers - * can reason about the ordering: elements inserted since the last call to - * reverseSweep() will be provided in LIFO order. - * - * Example: if elements are inserted in the order 1-2-3, the callback is - * invoked 3-2-1. If the callback moves elements onto a stack, popping off - * the stack will produce the original insertion order 1-2-3. - */ - template - void reverseSweep(F&& func) { - list_.reverseSweep([&](Wrapper* wrapperPtr) mutable { - std::unique_ptr wrapper(wrapperPtr); - - func(std::move(wrapper->data)); - }); - } - - private: - struct Wrapper { - explicit Wrapper(T&& t) : data(std::move(t)) {} - - AtomicIntrusiveLinkedListHook hook; - T data; - }; - AtomicIntrusiveLinkedList list_; -}; - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/AtomicUnorderedMap.h b/ios/Pods/Flipper-Folly/folly/AtomicUnorderedMap.h deleted file mode 100644 index f7e84d7..0000000 --- a/ios/Pods/Flipper-Folly/folly/AtomicUnorderedMap.h +++ /dev/null @@ -1,513 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace folly { - -/// You're probably reading this because you are looking for an -/// AtomicUnorderedMap that is fully general, highly concurrent (for -/// reads, writes, and iteration), and makes no performance compromises. -/// We haven't figured that one out yet. What you will find here is a -/// hash table implementation that sacrifices generality so that it can -/// give you all of the other things. -/// -/// LIMITATIONS: -/// -/// * Insert only (*) - the only write operation supported directly by -/// AtomicUnorderedInsertMap is findOrConstruct. There is a (*) because -/// values aren't moved, so you can roll your own concurrency control for -/// in-place updates of values (see MutableData and MutableAtom below), -/// but the hash table itself doesn't help you. -/// -/// * No resizing - you must specify the capacity up front, and once -/// the hash map gets full you won't be able to insert. Insert -/// performance will degrade once the load factor is high. Insert is -/// O(1/(1-actual_load_factor)). Note that this is a pretty strong -/// limitation, because you can't remove existing keys. -/// -/// * 2^30 maximum default capacity - by default AtomicUnorderedInsertMap -/// uses uint32_t internal indexes (and steals 2 bits), limiting you -/// to about a billion entries. If you need more you can fill in all -/// of the template params so you change IndexType to uint64_t, or you -/// can use AtomicUnorderedInsertMap64. 64-bit indexes will increase -/// the space over of the map, of course. -/// -/// WHAT YOU GET IN EXCHANGE: -/// -/// * Arbitrary key and value types - any K and V that can be used in a -/// std::unordered_map can be used here. In fact, the key and value -/// types don't even have to be copyable or moveable! -/// -/// * Keys and values in the map won't be moved - it is safe to keep -/// pointers or references to the keys and values in the map, because -/// they are never moved or destroyed (until the map itself is destroyed). -/// -/// * Iterators are never invalidated - writes don't invalidate iterators, -/// so you can scan and insert in parallel. -/// -/// * Fast wait-free reads - reads are usually only a single cache miss, -/// even when the hash table is very large. Wait-freedom means that -/// you won't see latency outliers even in the face of concurrent writes. -/// -/// * Lock-free insert - writes proceed in parallel. If a thread in the -/// middle of a write is unlucky and gets suspended, it doesn't block -/// anybody else. -/// -/// COMMENTS ON INSERT-ONLY -/// -/// This map provides wait-free linearizable reads and lock-free -/// linearizable inserts. Inserted values won't be moved, but no -/// concurrency control is provided for safely updating them. To remind -/// you of that fact they are only provided in const form. This is the -/// only simple safe thing to do while preserving something like the normal -/// std::map iteration form, which requires that iteration be exposed -/// via std::pair (and prevents encapsulation of access to the value). -/// -/// There are a couple of reasonable policies for doing in-place -/// concurrency control on the values. I am hoping that the policy can -/// be injected via the value type or an extra template param, to keep -/// the core AtomicUnorderedInsertMap insert-only: -/// -/// CONST: this is the currently implemented strategy, which is simple, -/// performant, and not that expressive. You can always put in a value -/// with a mutable field (see MutableAtom below), but that doesn't look -/// as pretty as it should. -/// -/// ATOMIC: for integers and integer-size trivially copyable structs -/// (via an adapter like tao/queues/AtomicStruct) the value can be a -/// std::atomic and read and written atomically. -/// -/// SEQ-LOCK: attach a counter incremented before and after write. -/// Writers serialize by using CAS to make an even->odd transition, -/// then odd->even after the write. Readers grab the value with memcpy, -/// checking sequence value before and after. Readers retry until they -/// see an even sequence number that doesn't change. This works for -/// larger structs, but still requires memcpy to be equivalent to copy -/// assignment, and it is no longer lock-free. It scales very well, -/// because the readers are still invisible (no cache line writes). -/// -/// LOCK: folly's SharedMutex would be a good choice here. -/// -/// MEMORY ALLOCATION -/// -/// Underlying memory is allocated as a big anonymous mmap chunk, which -/// might be cheaper than calloc() and is certainly not more expensive -/// for large maps. If the SkipKeyValueDeletion template param is true -/// then deletion of the map consists of unmapping the backing memory, -/// which is much faster than destructing all of the keys and values. -/// Feel free to override if std::is_trivial_destructor isn't recognizing -/// the triviality of your destructors. -template < - typename Key, - typename Value, - typename Hash = std::hash, - typename KeyEqual = std::equal_to, - bool SkipKeyValueDeletion = - (std::is_trivially_destructible::value && - std::is_trivially_destructible::value), - template class Atom = std::atomic, - typename IndexType = uint32_t, - typename Allocator = folly::detail::MMapAlloc> - -struct AtomicUnorderedInsertMap { - typedef Key key_type; - typedef Value mapped_type; - typedef std::pair value_type; - typedef std::size_t size_type; - typedef std::ptrdiff_t difference_type; - typedef Hash hasher; - typedef KeyEqual key_equal; - typedef const value_type& const_reference; - - typedef struct ConstIterator { - ConstIterator(const AtomicUnorderedInsertMap& owner, IndexType slot) - : owner_(owner), slot_(slot) {} - - ConstIterator(const ConstIterator&) = default; - ConstIterator& operator=(const ConstIterator&) = default; - - const value_type& operator*() const { - return owner_.slots_[slot_].keyValue(); - } - - const value_type* operator->() const { - return &owner_.slots_[slot_].keyValue(); - } - - // pre-increment - const ConstIterator& operator++() { - while (slot_ > 0) { - --slot_; - if (owner_.slots_[slot_].state() == LINKED) { - break; - } - } - return *this; - } - - // post-increment - ConstIterator operator++(int /* dummy */) { - auto prev = *this; - ++*this; - return prev; - } - - bool operator==(const ConstIterator& rhs) const { - return slot_ == rhs.slot_; - } - bool operator!=(const ConstIterator& rhs) const { - return !(*this == rhs); - } - - private: - const AtomicUnorderedInsertMap& owner_; - IndexType slot_; - } const_iterator; - - friend ConstIterator; - - /// Constructs a map that will support the insertion of maxSize key-value - /// pairs without exceeding the max load factor. Load factors of greater - /// than 1 are not supported, and once the actual load factor of the - /// map approaches 1 the insert performance will suffer. The capacity - /// is limited to 2^30 (about a billion) for the default IndexType, - /// beyond which we will throw invalid_argument. - explicit AtomicUnorderedInsertMap( - size_t maxSize, - float maxLoadFactor = 0.8f, - const Allocator& alloc = Allocator()) - : allocator_(alloc) { - size_t capacity = size_t(maxSize / std::min(1.0f, maxLoadFactor) + 128); - size_t avail = size_t{1} << (8 * sizeof(IndexType) - 2); - if (capacity > avail && maxSize < avail) { - // we'll do our best - capacity = avail; - } - if (capacity < maxSize || capacity > avail) { - throw std::invalid_argument( - "AtomicUnorderedInsertMap capacity must fit in IndexType with 2 bits " - "left over"); - } - - numSlots_ = capacity; - slotMask_ = folly::nextPowTwo(capacity * 4) - 1; - mmapRequested_ = sizeof(Slot) * capacity; - slots_ = reinterpret_cast(allocator_.allocate(mmapRequested_)); - zeroFillSlots(); - // mark the zero-th slot as in-use but not valid, since that happens - // to be our nil value - slots_[0].stateUpdate(EMPTY, CONSTRUCTING); - } - - ~AtomicUnorderedInsertMap() { - if (!SkipKeyValueDeletion) { - for (size_t i = 1; i < numSlots_; ++i) { - slots_[i].~Slot(); - } - } - allocator_.deallocate(reinterpret_cast(slots_), mmapRequested_); - } - - /// Searches for the key, returning (iter,false) if it is found. - /// If it is not found calls the functor Func with a void* argument - /// that is raw storage suitable for placement construction of a Value - /// (see raw_value_type), then returns (iter,true). May call Func and - /// then return (iter,false) if there are other concurrent writes, in - /// which case the newly constructed value will be immediately destroyed. - /// - /// This function does not block other readers or writers. If there - /// are other concurrent writes, many parallel calls to func may happen - /// and only the first one to complete will win. The values constructed - /// by the other calls to func will be destroyed. - /// - /// Usage: - /// - /// AtomicUnorderedInsertMap memo; - /// - /// auto value = memo.findOrConstruct(key, [=](void* raw) { - /// new (raw) std::string(computation(key)); - /// })->first; - template - std::pair findOrConstruct(const Key& key, Func&& func) { - auto const slot = keyToSlotIdx(key); - auto prev = slots_[slot].headAndState_.load(std::memory_order_acquire); - - auto existing = find(key, slot); - if (existing != 0) { - return std::make_pair(ConstIterator(*this, existing), false); - } - - auto idx = allocateNear(slot); - new (&slots_[idx].keyValue().first) Key(key); - func(static_cast(&slots_[idx].keyValue().second)); - - while (true) { - slots_[idx].next_ = prev >> 2; - - // we can merge the head update and the CONSTRUCTING -> LINKED update - // into a single CAS if slot == idx (which should happen often) - auto after = idx << 2; - if (slot == idx) { - after += LINKED; - } else { - after += (prev & 3); - } - - if (slots_[slot].headAndState_.compare_exchange_strong(prev, after)) { - // success - if (idx != slot) { - slots_[idx].stateUpdate(CONSTRUCTING, LINKED); - } - return std::make_pair(ConstIterator(*this, idx), true); - } - // compare_exchange_strong updates its first arg on failure, so - // there is no need to reread prev - - existing = find(key, slot); - if (existing != 0) { - // our allocated key and value are no longer needed - slots_[idx].keyValue().first.~Key(); - slots_[idx].keyValue().second.~Value(); - slots_[idx].stateUpdate(CONSTRUCTING, EMPTY); - - return std::make_pair(ConstIterator(*this, existing), false); - } - } - } - - /// This isn't really emplace, but it is what we need to test. - /// Eventually we can duplicate all of the std::pair constructor - /// forms, including a recursive tuple forwarding template - /// http://functionalcpp.wordpress.com/2013/08/28/tuple-forwarding/). - template - std::pair emplace(const K& key, V&& value) { - return findOrConstruct( - key, [&](void* raw) { new (raw) Value(std::forward(value)); }); - } - - const_iterator find(const Key& key) const { - return ConstIterator(*this, find(key, keyToSlotIdx(key))); - } - - const_iterator cbegin() const { - IndexType slot = numSlots_ - 1; - while (slot > 0 && slots_[slot].state() != LINKED) { - --slot; - } - return ConstIterator(*this, slot); - } - - const_iterator cend() const { - return ConstIterator(*this, 0); - } - - private: - enum : IndexType { - kMaxAllocationTries = 1000, // after this we throw - }; - - enum BucketState : IndexType { - EMPTY = 0, - CONSTRUCTING = 1, - LINKED = 2, - }; - - /// Lock-free insertion is easiest by prepending to collision chains. - /// A large chaining hash table takes two cache misses instead of - /// one, however. Our solution is to colocate the bucket storage and - /// the head storage, so that even though we are traversing chains we - /// are likely to stay within the same cache line. Just make sure to - /// traverse head before looking at any keys. This strategy gives us - /// 32 bit pointers and fast iteration. - struct Slot { - /// The bottom two bits are the BucketState, the rest is the index - /// of the first bucket for the chain whose keys map to this slot. - /// When things are going well the head usually links to this slot, - /// but that doesn't always have to happen. - Atom headAndState_; - - /// The next bucket in the chain - IndexType next_; - - /// Key and Value - aligned_storage_for_t raw_; - - ~Slot() { - auto s = state(); - assert(s == EMPTY || s == LINKED); - if (s == LINKED) { - keyValue().first.~Key(); - keyValue().second.~Value(); - } - } - - BucketState state() const { - return BucketState(headAndState_.load(std::memory_order_acquire) & 3); - } - - void stateUpdate(BucketState before, BucketState after) { - assert(state() == before); - headAndState_ += (after - before); - } - - value_type& keyValue() { - assert(state() != EMPTY); - return *static_cast(static_cast(&raw_)); - } - - const value_type& keyValue() const { - assert(state() != EMPTY); - return *static_cast(static_cast(&raw_)); - } - }; - - // We manually manage the slot memory so we can bypass initialization - // (by getting a zero-filled mmap chunk) and optionally destruction of - // the slots - - size_t mmapRequested_; - size_t numSlots_; - - /// tricky, see keyToSlodIdx - size_t slotMask_; - - Allocator allocator_; - Slot* slots_; - - IndexType keyToSlotIdx(const Key& key) const { - size_t h = hasher()(key); - h &= slotMask_; - while (h >= numSlots_) { - h -= numSlots_; - } - return h; - } - - IndexType find(const Key& key, IndexType slot) const { - KeyEqual ke = {}; - auto hs = slots_[slot].headAndState_.load(std::memory_order_acquire); - for (slot = hs >> 2; slot != 0; slot = slots_[slot].next_) { - if (ke(key, slots_[slot].keyValue().first)) { - return slot; - } - } - return 0; - } - - /// Allocates a slot and returns its index. Tries to put it near - /// slots_[start]. - IndexType allocateNear(IndexType start) { - for (IndexType tries = 0; tries < kMaxAllocationTries; ++tries) { - auto slot = allocationAttempt(start, tries); - auto prev = slots_[slot].headAndState_.load(std::memory_order_acquire); - if ((prev & 3) == EMPTY && - slots_[slot].headAndState_.compare_exchange_strong( - prev, prev + CONSTRUCTING - EMPTY)) { - return slot; - } - } - throw std::bad_alloc(); - } - - /// Returns the slot we should attempt to allocate after tries failed - /// tries, starting from the specified slot. This is pulled out so we - /// can specialize it differently during deterministic testing - IndexType allocationAttempt(IndexType start, IndexType tries) const { - if (LIKELY(tries < 8 && start + tries < numSlots_)) { - return IndexType(start + tries); - } else { - IndexType rv; - if (sizeof(IndexType) <= 4) { - rv = IndexType(folly::Random::rand32(numSlots_)); - } else { - rv = IndexType(folly::Random::rand64(numSlots_)); - } - assert(rv < numSlots_); - return rv; - } - } - - void zeroFillSlots() { - using folly::detail::GivesZeroFilledMemory; - if (!GivesZeroFilledMemory::value) { - memset(static_cast(slots_), 0, mmapRequested_); - } - } -}; - -/// AtomicUnorderedInsertMap64 is just a type alias that makes it easier -/// to select a 64 bit slot index type. Use this if you need a capacity -/// bigger than 2^30 (about a billion). This increases memory overheads, -/// obviously. -template < - typename Key, - typename Value, - typename Hash = std::hash, - typename KeyEqual = std::equal_to, - bool SkipKeyValueDeletion = - (std::is_trivially_destructible::value && - std::is_trivially_destructible::value), - template class Atom = std::atomic, - typename Allocator = folly::detail::MMapAlloc> -using AtomicUnorderedInsertMap64 = AtomicUnorderedInsertMap< - Key, - Value, - Hash, - KeyEqual, - SkipKeyValueDeletion, - Atom, - uint64_t, - Allocator>; - -/// MutableAtom is a tiny wrapper than gives you the option of atomically -/// updating values inserted into an AtomicUnorderedInsertMap>. This relies on AtomicUnorderedInsertMap's guarantee -/// that it doesn't move values. -template class Atom = std::atomic> -struct MutableAtom { - mutable Atom data; - - explicit MutableAtom(const T& init) : data(init) {} -}; - -/// MutableData is a tiny wrapper than gives you the option of using an -/// external concurrency control mechanism to updating values inserted -/// into an AtomicUnorderedInsertMap. -template -struct MutableData { - mutable T data; - explicit MutableData(const T& init) : data(init) {} -}; - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/Benchmark.cpp b/ios/Pods/Flipper-Folly/folly/Benchmark.cpp deleted file mode 100644 index 389ee46..0000000 --- a/ios/Pods/Flipper-Folly/folly/Benchmark.cpp +++ /dev/null @@ -1,575 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// @author Andrei Alexandrescu (andrei.alexandrescu@fb.com) - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include - -using namespace std; - -DEFINE_bool(benchmark, false, "Run benchmarks."); -DEFINE_bool(json, false, "Output in JSON format."); -DEFINE_bool(json_verbose, false, "Output in verbose JSON format."); - -DEFINE_string( - bm_regex, - "", - "Only benchmarks whose names match this regex will be run."); - -DEFINE_int64( - bm_min_usec, - 100, - "Minimum # of microseconds we'll accept for each benchmark."); - -DEFINE_int32( - bm_min_iters, - 1, - "Minimum # of iterations we'll try for each benchmark."); - -DEFINE_int64( - bm_max_iters, - 1 << 30, - "Maximum # of iterations we'll try for each benchmark."); - -DEFINE_int32( - bm_max_secs, - 1, - "Maximum # of seconds we'll spend on each benchmark."); - -namespace folly { - -std::chrono::high_resolution_clock::duration BenchmarkSuspender::timeSpent; - -typedef function BenchmarkFun; - -vector& benchmarks() { - static vector _benchmarks; - return _benchmarks; -} - -#define FB_FOLLY_GLOBAL_BENCHMARK_BASELINE fbFollyGlobalBenchmarkBaseline -#define FB_STRINGIZE_X2(x) FOLLY_PP_STRINGIZE(x) - -// Add the global baseline -BENCHMARK(FB_FOLLY_GLOBAL_BENCHMARK_BASELINE) { -#ifdef _MSC_VER - _ReadWriteBarrier(); -#else - asm volatile(""); -#endif -} - -size_t getGlobalBenchmarkBaselineIndex() { - const char* global = FB_STRINGIZE_X2(FB_FOLLY_GLOBAL_BENCHMARK_BASELINE); - auto it = std::find_if( - benchmarks().begin(), - benchmarks().end(), - [global](const detail::BenchmarkRegistration& v) { - return v.name == global; - }); - CHECK(it != benchmarks().end()); - return size_t(std::distance(benchmarks().begin(), it)); -} - -#undef FB_STRINGIZE_X2 -#undef FB_FOLLY_GLOBAL_BENCHMARK_BASELINE - -void detail::addBenchmarkImpl( - const char* file, - StringPiece name, - BenchmarkFun fun, - bool useCounter) { - benchmarks().push_back({file, name.str(), std::move(fun), useCounter}); -} - -static std::pair runBenchmarkGetNSPerIteration( - const BenchmarkFun& fun, - const double globalBaseline) { - using std::chrono::duration_cast; - using std::chrono::high_resolution_clock; - using std::chrono::microseconds; - using std::chrono::nanoseconds; - using std::chrono::seconds; - - // They key here is accuracy; too low numbers means the accuracy was - // coarse. We up the ante until we get to at least minNanoseconds - // timings. - static_assert( - std::is_same::value, - "High resolution clock must be nanosecond resolution."); - // We choose a minimum minimum (sic) of 100,000 nanoseconds, but if - // the clock resolution is worse than that, it will be larger. In - // essence we're aiming at making the quantization noise 0.01%. - static const auto minNanoseconds = std::max( - nanoseconds(100000), microseconds(FLAGS_bm_min_usec)); - - // We do measurements in several epochs and take the minimum, to - // account for jitter. - static const unsigned int epochs = 1000; - // We establish a total time budget as we don't want a measurement - // to take too long. This will curtail the number of actual epochs. - const auto timeBudget = seconds(FLAGS_bm_max_secs); - auto global = high_resolution_clock::now(); - - std::vector> epochResults(epochs); - size_t actualEpochs = 0; - - for (; actualEpochs < epochs; ++actualEpochs) { - const auto maxIters = uint32_t(FLAGS_bm_max_iters); - for (auto n = uint32_t(FLAGS_bm_min_iters); n < maxIters; n *= 2) { - detail::TimeIterData timeIterData = fun(static_cast(n)); - if (timeIterData.duration < minNanoseconds) { - continue; - } - // We got an accurate enough timing, done. But only save if - // smaller than the current result. - auto nsecs = duration_cast(timeIterData.duration); - epochResults[actualEpochs] = std::make_pair( - max(0.0, double(nsecs.count()) / timeIterData.niter - globalBaseline), - std::move(timeIterData.userCounters)); - // Done with the current epoch, we got a meaningful timing. - break; - } - auto now = high_resolution_clock::now(); - if (now - global >= timeBudget) { - // No more time budget available. - ++actualEpochs; - break; - } - } - - // Current state of the art: get the minimum. After some - // experimentation, it seems taking the minimum is the best. - auto iter = min_element( - epochResults.begin(), - epochResults.begin() + actualEpochs, - [](const auto& a, const auto& b) { return a.first < b.first; }); - - // If the benchmark was basically drowned in baseline noise, it's - // possible it became negative. - return std::make_pair(max(0.0, iter->first), iter->second); -} - -struct ScaleInfo { - double boundary; - const char* suffix; -}; - -static const ScaleInfo kTimeSuffixes[]{ - {365.25 * 24 * 3600, "years"}, - {24 * 3600, "days"}, - {3600, "hr"}, - {60, "min"}, - {1, "s"}, - {1E-3, "ms"}, - {1E-6, "us"}, - {1E-9, "ns"}, - {1E-12, "ps"}, - {1E-15, "fs"}, - {0, nullptr}, -}; - -static const ScaleInfo kMetricSuffixes[]{ - {1E24, "Y"}, // yotta - {1E21, "Z"}, // zetta - {1E18, "X"}, // "exa" written with suffix 'X' so as to not create - // confusion with scientific notation - {1E15, "P"}, // peta - {1E12, "T"}, // terra - {1E9, "G"}, // giga - {1E6, "M"}, // mega - {1E3, "K"}, // kilo - {1, ""}, - {1E-3, "m"}, // milli - {1E-6, "u"}, // micro - {1E-9, "n"}, // nano - {1E-12, "p"}, // pico - {1E-15, "f"}, // femto - {1E-18, "a"}, // atto - {1E-21, "z"}, // zepto - {1E-24, "y"}, // yocto - {0, nullptr}, -}; - -static string -humanReadable(double n, unsigned int decimals, const ScaleInfo* scales) { - if (std::isinf(n) || std::isnan(n)) { - return folly::to(n); - } - - const double absValue = fabs(n); - const ScaleInfo* scale = scales; - while (absValue < scale[0].boundary && scale[1].suffix != nullptr) { - ++scale; - } - - const double scaledValue = n / scale->boundary; - return stringPrintf("%.*f%s", decimals, scaledValue, scale->suffix); -} - -static string readableTime(double n, unsigned int decimals) { - return humanReadable(n, decimals, kTimeSuffixes); -} - -static string metricReadable(double n, unsigned int decimals) { - return humanReadable(n, decimals, kMetricSuffixes); -} - -namespace { -class BenchmarkResultsPrinter { - public: - BenchmarkResultsPrinter() = default; - explicit BenchmarkResultsPrinter(std::set counterNames) - : counterNames_(std::move(counterNames)), - namesLength_{std::accumulate( - counterNames_.begin(), - counterNames_.end(), - size_t{0}, - [](size_t acc, auto&& name) { return acc + 2 + name.length(); })} {} - - static constexpr unsigned int columns{76}; - void separator(char pad) { - puts(string(columns + namesLength_, pad).c_str()); - } - - void header(const string& file) { - separator('='); - printf("%-*srelative time/iter iters/s", columns - 28, file.c_str()); - for (auto const& name : counterNames_) { - printf(" %s", name.c_str()); - } - printf("\n"); - separator('='); - } - - void print(const vector& data) { - for (auto& datum : data) { - auto file = datum.file; - if (file != lastFile_) { - // New file starting - header(file); - lastFile_ = file; - } - - string s = datum.name; - if (s == "-") { - separator('-'); - continue; - } - bool useBaseline /* = void */; - if (s[0] == '%') { - s.erase(0, 1); - useBaseline = true; - } else { - baselineNsPerIter_ = datum.timeInNs; - useBaseline = false; - } - s.resize(columns - 29, ' '); - auto nsPerIter = datum.timeInNs; - auto secPerIter = nsPerIter / 1E9; - auto itersPerSec = (secPerIter == 0) - ? std::numeric_limits::infinity() - : (1 / secPerIter); - if (!useBaseline) { - // Print without baseline - printf( - "%*s %9s %7s", - static_cast(s.size()), - s.c_str(), - readableTime(secPerIter, 2).c_str(), - metricReadable(itersPerSec, 2).c_str()); - } else { - // Print with baseline - auto rel = baselineNsPerIter_ / nsPerIter * 100.0; - printf( - "%*s %7.2f%% %9s %7s", - static_cast(s.size()), - s.c_str(), - rel, - readableTime(secPerIter, 2).c_str(), - metricReadable(itersPerSec, 2).c_str()); - } - for (auto const& name : counterNames_) { - if (auto ptr = folly::get_ptr(datum.counters, name)) { - switch (ptr->type) { - case UserMetric::Type::TIME: - printf( - " %-*s", - int(name.length()), - readableTime(ptr->value, 2).c_str()); - break; - case UserMetric::Type::METRIC: - printf( - " %-*s", - int(name.length()), - metricReadable(ptr->value, 2).c_str()); - break; - case UserMetric::Type::CUSTOM: - default: - printf(" %-*" PRId64, int(name.length()), ptr->value); - } - } else { - printf(" %-*s", int(name.length()), "NaN"); - } - } - printf("\n"); - } - } - - private: - std::set counterNames_; - size_t namesLength_{0}; - double baselineNsPerIter_{numeric_limits::max()}; - string lastFile_; -}; -} // namespace - -static void printBenchmarkResultsAsJson( - const vector& data) { - dynamic d = dynamic::object; - for (auto& datum : data) { - d[datum.name] = datum.timeInNs * 1000.; - } - - printf("%s\n", toPrettyJson(d).c_str()); -} - -static void printBenchmarkResultsAsVerboseJson( - const vector& data) { - dynamic d; - benchmarkResultsToDynamic(data, d); - printf("%s\n", toPrettyJson(d).c_str()); -} - -static void printBenchmarkResults(const vector& data) { - if (FLAGS_json_verbose) { - printBenchmarkResultsAsVerboseJson(data); - return; - } else if (FLAGS_json) { - printBenchmarkResultsAsJson(data); - return; - } - - CHECK(FLAGS_json_verbose || FLAGS_json) << "Cannot print benchmark results"; -} - -void benchmarkResultsToDynamic( - const vector& data, - dynamic& out) { - out = dynamic::array; - for (auto& datum : data) { - if (!datum.counters.empty()) { - dynamic obj = dynamic::object; - for (auto& counter : datum.counters) { - dynamic counterInfo = dynamic::object; - counterInfo["value"] = counter.second.value; - counterInfo["type"] = static_cast(counter.second.type); - obj[counter.first] = counterInfo; - } - out.push_back( - dynamic::array(datum.file, datum.name, datum.timeInNs, obj)); - } else { - out.push_back(dynamic::array(datum.file, datum.name, datum.timeInNs)); - } - } -} - -void benchmarkResultsFromDynamic( - const dynamic& d, - vector& results) { - for (auto& datum : d) { - results.push_back({datum[0].asString(), - datum[1].asString(), - datum[2].asDouble(), - UserCounters{}}); - } -} - -static pair resultKey( - const detail::BenchmarkResult& result) { - return pair(result.file, result.name); -} - -void printResultComparison( - const vector& base, - const vector& test) { - map, double> baselines; - - for (auto& baseResult : base) { - baselines[resultKey(baseResult)] = baseResult.timeInNs; - } - // - // Width available - static const unsigned int columns = 76; - - // Compute the longest benchmark name - size_t longestName = 0; - for (auto& datum : test) { - longestName = max(longestName, datum.name.size()); - } - - // Print a horizontal rule - auto separator = [&](char pad) { puts(string(columns, pad).c_str()); }; - - // Print header for a file - auto header = [&](const string& file) { - separator('='); - printf("%-*srelative time/iter iters/s", columns - 28, file.c_str()); - separator('='); - }; - - string lastFile; - - for (auto& datum : test) { - folly::Optional baseline = - folly::get_optional(baselines, resultKey(datum)); - auto file = datum.file; - if (file != lastFile) { - // New file starting - header(file); - lastFile = file; - } - - string s = datum.name; - if (s == "-") { - separator('-'); - continue; - } - if (s[0] == '%') { - s.erase(0, 1); - } - s.resize(columns - 29, ' '); - auto nsPerIter = datum.timeInNs; - auto secPerIter = nsPerIter / 1E9; - auto itersPerSec = (secPerIter == 0) - ? std::numeric_limits::infinity() - : (1 / secPerIter); - if (!baseline) { - // Print without baseline - printf( - "%*s %9s %7s\n", - static_cast(s.size()), - s.c_str(), - readableTime(secPerIter, 2).c_str(), - metricReadable(itersPerSec, 2).c_str()); - } else { - // Print with baseline - auto rel = *baseline / nsPerIter * 100.0; - printf( - "%*s %7.2f%% %9s %7s\n", - static_cast(s.size()), - s.c_str(), - rel, - readableTime(secPerIter, 2).c_str(), - metricReadable(itersPerSec, 2).c_str()); - } - } - separator('='); -} - -void checkRunMode() { - if (folly::kIsDebug || folly::kIsSanitize) { - std::cerr << "WARNING: Benchmark running " - << (folly::kIsDebug ? "in DEBUG mode" : "with SANITIZERS") - << std::endl; - } -} - -void runBenchmarks() { - CHECK(!benchmarks().empty()); - - checkRunMode(); - - vector results; - results.reserve(benchmarks().size() - 1); - - std::unique_ptr bmRegex; - if (!FLAGS_bm_regex.empty()) { - bmRegex = std::make_unique(FLAGS_bm_regex); - } - - // PLEASE KEEP QUIET. MEASUREMENTS IN PROGRESS. - - size_t baselineIndex = getGlobalBenchmarkBaselineIndex(); - - auto const globalBaseline = - runBenchmarkGetNSPerIteration(benchmarks()[baselineIndex].func, 0); - - bool useCounter = - std::any_of(benchmarks().begin(), benchmarks().end(), [](const auto& bm) { - return bm.useCounter; - }); - BenchmarkResultsPrinter printer; - std::set counterNames; - FOR_EACH_RANGE (i, 0, benchmarks().size()) { - if (i == baselineIndex) { - continue; - } - std::pair elapsed; - auto& bm = benchmarks()[i]; - if (bm.name != "-") { // skip separators - if (bmRegex && !boost::regex_search(bm.name, *bmRegex)) { - continue; - } - elapsed = runBenchmarkGetNSPerIteration(bm.func, globalBaseline.first); - } - - // if customized user counters is used, it cannot print the result in real - // time as it needs to run all cases first to know the complete set of - // counters have been used, then the header can be printed out properly - if (!FLAGS_json_verbose && !FLAGS_json && !useCounter) { - printer.print({{bm.file, bm.name, elapsed.first, elapsed.second}}); - } else { - results.push_back({bm.file, bm.name, elapsed.first, elapsed.second}); - } - - // get all counter names - for (auto const& kv : elapsed.second) { - counterNames.insert(kv.first); - } - } - - // PLEASE MAKE NOISE. MEASUREMENTS DONE. - if (FLAGS_json_verbose || FLAGS_json) { - printBenchmarkResults(results); - } else { - printer = BenchmarkResultsPrinter{std::move(counterNames)}; - printer.print(results); - printer.separator('='); - } - - checkRunMode(); -} - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/Benchmark.h b/ios/Pods/Flipper-Folly/folly/Benchmark.h deleted file mode 100644 index bd1673a..0000000 --- a/ios/Pods/Flipper-Folly/folly/Benchmark.h +++ /dev/null @@ -1,684 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include // for FB_ANONYMOUS_VARIABLE -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include - -DECLARE_bool(benchmark); - -namespace folly { - -/** - * Runs all benchmarks defined. Usually put in main(). - */ -void runBenchmarks(); - -/** - * Runs all benchmarks defined if and only if the --benchmark flag has - * been passed to the program. Usually put in main(). - */ -inline bool runBenchmarksOnFlag() { - if (FLAGS_benchmark) { - runBenchmarks(); - } - return FLAGS_benchmark; -} - -class UserMetric { - public: - enum class Type { CUSTOM, TIME, METRIC }; - - int64_t value{}; - Type type{Type::CUSTOM}; - - UserMetric() = default; - /* implicit */ UserMetric(int64_t val, Type typ = Type::CUSTOM) - : value(val), type(typ) {} -}; - -using UserCounters = std::unordered_map; - -namespace detail { -struct TimeIterData { - std::chrono::high_resolution_clock::duration duration; - unsigned int niter; - UserCounters userCounters; -}; - -using BenchmarkFun = std::function; - -struct BenchmarkRegistration { - std::string file; - std::string name; - BenchmarkFun func; - bool useCounter = false; -}; - -struct BenchmarkResult { - std::string file; - std::string name; - double timeInNs; - UserCounters counters; -}; - -/** - * Adds a benchmark wrapped in a std::function. Only used - * internally. Pass by value is intentional. - */ -void addBenchmarkImpl( - const char* file, - StringPiece name, - BenchmarkFun, - bool useCounter); - -} // namespace detail - -/** - * Supporting type for BENCHMARK_SUSPEND defined below. - */ -struct BenchmarkSuspender { - using Clock = std::chrono::high_resolution_clock; - using TimePoint = Clock::time_point; - using Duration = Clock::duration; - - BenchmarkSuspender() { - start = Clock::now(); - } - - BenchmarkSuspender(const BenchmarkSuspender&) = delete; - BenchmarkSuspender(BenchmarkSuspender&& rhs) noexcept { - start = rhs.start; - rhs.start = {}; - } - - BenchmarkSuspender& operator=(const BenchmarkSuspender&) = delete; - BenchmarkSuspender& operator=(BenchmarkSuspender&& rhs) noexcept { - if (start != TimePoint{}) { - tally(); - } - start = rhs.start; - rhs.start = {}; - return *this; - } - - ~BenchmarkSuspender() { - if (start != TimePoint{}) { - tally(); - } - } - - void dismiss() { - assert(start != TimePoint{}); - tally(); - start = {}; - } - - void rehire() { - assert(start == TimePoint{}); - start = Clock::now(); - } - - template - auto dismissing(F f) -> invoke_result_t { - SCOPE_EXIT { - rehire(); - }; - dismiss(); - return f(); - } - - /** - * This is for use inside of if-conditions, used in BENCHMARK macros. - * If-conditions bypass the explicit on operator bool. - */ - explicit operator bool() const { - return false; - } - - /** - * Accumulates time spent outside benchmark. - */ - static Duration timeSpent; - - private: - void tally() { - auto end = Clock::now(); - timeSpent += end - start; - start = end; - } - - TimePoint start; -}; - -/** - * Adds a benchmark. Usually not called directly but instead through - * the macro BENCHMARK defined below. The lambda function involved - * must take exactly one parameter of type unsigned, and the benchmark - * uses it with counter semantics (iteration occurs inside the - * function). - */ -template -typename std::enable_if>::type -addBenchmark(const char* file, StringPiece name, Lambda&& lambda) { - auto execute = [=](unsigned int times) { - BenchmarkSuspender::timeSpent = {}; - unsigned int niter; - - // CORE MEASUREMENT STARTS - auto start = std::chrono::high_resolution_clock::now(); - niter = lambda(times); - auto end = std::chrono::high_resolution_clock::now(); - // CORE MEASUREMENT ENDS - return detail::TimeIterData{ - (end - start) - BenchmarkSuspender::timeSpent, niter, UserCounters{}}; - }; - - detail::addBenchmarkImpl(file, name, detail::BenchmarkFun(execute), false); -} - -/** - * Adds a benchmark. Usually not called directly but instead through - * the macro BENCHMARK defined below. The lambda function involved - * must take zero parameters, and the benchmark calls it repeatedly - * (iteration occurs outside the function). - */ -template -typename std::enable_if>::type -addBenchmark(const char* file, StringPiece name, Lambda&& lambda) { - addBenchmark(file, name, [=](unsigned int times) { - unsigned int niter = 0; - while (times-- > 0) { - niter += lambda(); - } - return niter; - }); -} - -/** - * similar as previous two template specialization, but lambda will also take - * customized counters in the following two cases - */ -template -typename std::enable_if< - folly::is_invocable_v>::type -addBenchmark(const char* file, StringPiece name, Lambda&& lambda) { - auto execute = [=](unsigned int times) { - BenchmarkSuspender::timeSpent = {}; - unsigned int niter; - - // CORE MEASUREMENT STARTS - auto start = std::chrono::high_resolution_clock::now(); - UserCounters counters; - niter = lambda(counters, times); - auto end = std::chrono::high_resolution_clock::now(); - // CORE MEASUREMENT ENDS - return detail::TimeIterData{ - (end - start) - BenchmarkSuspender::timeSpent, niter, counters}; - }; - - detail::addBenchmarkImpl( - file, - name, - std::function(execute), - true); -} - -template -typename std::enable_if>::type -addBenchmark(const char* file, StringPiece name, Lambda&& lambda) { - addBenchmark(file, name, [=](UserCounters& counters, unsigned int times) { - unsigned int niter = 0; - while (times-- > 0) { - niter += lambda(counters); - } - return niter; - }); -} - -/** - * Call doNotOptimizeAway(var) to ensure that var will be computed even - * post-optimization. Use it for variables that are computed during - * benchmarking but otherwise are useless. The compiler tends to do a - * good job at eliminating unused variables, and this function fools it - * into thinking var is in fact needed. - * - * Call makeUnpredictable(var) when you don't want the optimizer to use - * its knowledge of var to shape the following code. This is useful - * when constant propagation or power reduction is possible during your - * benchmark but not in real use cases. - */ - -#ifdef _MSC_VER - -#pragma optimize("", off) - -inline void doNotOptimizeDependencySink(const void*) {} - -#pragma optimize("", on) - -template -void doNotOptimizeAway(const T& datum) { - doNotOptimizeDependencySink(&datum); -} - -template -void makeUnpredictable(T& datum) { - doNotOptimizeDependencySink(&datum); -} - -#else - -namespace detail { -template -struct DoNotOptimizeAwayNeedsIndirect { - using Decayed = typename std::decay::type; - - // First two constraints ensure it can be an "r" operand. - // std::is_pointer check is because callers seem to expect that - // doNotOptimizeAway(&x) is equivalent to doNotOptimizeAway(x). - constexpr static bool value = !folly::is_trivially_copyable::value || - sizeof(Decayed) > sizeof(long) || std::is_pointer::value; -}; -} // namespace detail - -template -auto doNotOptimizeAway(const T& datum) -> typename std::enable_if< - !detail::DoNotOptimizeAwayNeedsIndirect::value>::type { - // The "r" constraint forces the compiler to make datum available - // in a register to the asm block, which means that it must have - // computed/loaded it. We use this path for things that are <= - // sizeof(long) (they have to fit), trivial (otherwise the compiler - // doesn't want to put them in a register), and not a pointer (because - // doNotOptimizeAway(&foo) would otherwise be a foot gun that didn't - // necessarily compute foo). - // - // An earlier version of this method had a more permissive input operand - // constraint, but that caused unnecessary variation between clang and - // gcc benchmarks. - asm volatile("" ::"r"(datum)); -} - -template -auto doNotOptimizeAway(const T& datum) -> typename std::enable_if< - detail::DoNotOptimizeAwayNeedsIndirect::value>::type { - // This version of doNotOptimizeAway tells the compiler that the asm - // block will read datum from memory, and that in addition it might read - // or write from any memory location. If the memory clobber could be - // separated into input and output that would be preferrable. - asm volatile("" ::"m"(datum) : "memory"); -} - -template -auto makeUnpredictable(T& datum) -> typename std::enable_if< - !detail::DoNotOptimizeAwayNeedsIndirect::value>::type { - asm volatile("" : "+r"(datum)); -} - -template -auto makeUnpredictable(T& datum) -> typename std::enable_if< - detail::DoNotOptimizeAwayNeedsIndirect::value>::type { - asm volatile("" ::"m"(datum) : "memory"); -} - -#endif - -struct dynamic; - -void benchmarkResultsToDynamic( - const std::vector& data, - dynamic&); - -void benchmarkResultsFromDynamic( - const dynamic&, - std::vector&); - -void printResultComparison( - const std::vector& base, - const std::vector& test); - -} // namespace folly - -/** - * Introduces a benchmark function. Used internally, see BENCHMARK and - * friends below. - */ - -#define BENCHMARK_IMPL(funName, stringName, rv, paramType, paramName) \ - static void funName(paramType); \ - FOLLY_MAYBE_UNUSED static bool FB_ANONYMOUS_VARIABLE(follyBenchmarkUnused) = \ - (::folly::addBenchmark( \ - __FILE__, \ - stringName, \ - [](paramType paramName) -> unsigned { \ - funName(paramName); \ - return rv; \ - }), \ - true); \ - static void funName(paramType paramName) - -#define BENCHMARK_IMPL_COUNTERS( \ - funName, stringName, counters, rv, paramType, paramName) \ - static void funName( \ - ::folly::UserCounters& FOLLY_PP_DETAIL_APPEND_VA_ARG(paramType)); \ - FOLLY_MAYBE_UNUSED static bool FB_ANONYMOUS_VARIABLE(follyBenchmarkUnused) = \ - (::folly::addBenchmark( \ - __FILE__, \ - stringName, \ - [](::folly::UserCounters& counters FOLLY_PP_DETAIL_APPEND_VA_ARG( \ - paramType paramName)) -> unsigned { \ - funName(counters FOLLY_PP_DETAIL_APPEND_VA_ARG(paramName)); \ - return rv; \ - }), \ - true); \ - static void funName(::folly::UserCounters& counters \ - FOLLY_PP_DETAIL_APPEND_VA_ARG(paramType paramName)) - -/** - * Introduces a benchmark function with support for returning the actual - * number of iterations. Used internally, see BENCHMARK_MULTI and friends - * below. - */ -#define BENCHMARK_MULTI_IMPL(funName, stringName, paramType, paramName) \ - static unsigned funName(paramType); \ - FOLLY_MAYBE_UNUSED static bool FB_ANONYMOUS_VARIABLE(follyBenchmarkUnused) = \ - (::folly::addBenchmark( \ - __FILE__, \ - stringName, \ - [](paramType paramName) { return funName(paramName); }), \ - true); \ - static unsigned funName(paramType paramName) - -/** - * Introduces a benchmark function. Use with either one or two arguments. - * The first is the name of the benchmark. Use something descriptive, such - * as insertVectorBegin. The second argument may be missing, or could be a - * symbolic counter. The counter dictates how many internal iteration the - * benchmark does. Example: - * - * BENCHMARK(vectorPushBack) { - * vector v; - * v.push_back(42); - * } - * - * BENCHMARK(insertVectorBegin, iters) { - * vector v; - * FOR_EACH_RANGE (i, 0, iters) { - * v.insert(v.begin(), 42); - * } - * } - */ -#define BENCHMARK(name, ...) \ - BENCHMARK_IMPL( \ - name, \ - FOLLY_PP_STRINGIZE(name), \ - FB_ARG_2_OR_1(1, ##__VA_ARGS__), \ - FB_ONE_OR_NONE(unsigned, ##__VA_ARGS__), \ - __VA_ARGS__) - -/** - * Allow users to record customized counter during benchmarking, - * there will be one extra column showing in the output result for each counter - * - * BENCHMARK_COUNTERS(insertVectorBegin, couters, iters) { - * vector v; - * FOR_EACH_RANGE (i, 0, iters) { - * v.insert(v.begin(), 42); - * } - * BENCHMARK_SUSPEND { - * counters["foo"] = 10; - * } - * } - */ -#define BENCHMARK_COUNTERS(name, counters, ...) \ - BENCHMARK_IMPL_COUNTERS( \ - name, \ - FOLLY_PP_STRINGIZE(name), \ - counters, \ - FB_ARG_2_OR_1(1, ##__VA_ARGS__), \ - FB_ONE_OR_NONE(unsigned, ##__VA_ARGS__), \ - __VA_ARGS__) -/** - * Like BENCHMARK above, but allows the user to return the actual - * number of iterations executed in the function body. This can be - * useful if the benchmark function doesn't know upfront how many - * iterations it's going to run or if it runs through a certain - * number of test cases, e.g.: - * - * BENCHMARK_MULTI(benchmarkSomething) { - * std::vector testCases { 0, 1, 1, 2, 3, 5 }; - * for (int c : testCases) { - * doSomething(c); - * } - * return testCases.size(); - * } - */ -#define BENCHMARK_MULTI(name, ...) \ - BENCHMARK_MULTI_IMPL( \ - name, \ - FOLLY_PP_STRINGIZE(name), \ - FB_ONE_OR_NONE(unsigned, ##__VA_ARGS__), \ - __VA_ARGS__) - -/** - * Defines a benchmark that passes a parameter to another one. This is - * common for benchmarks that need a "problem size" in addition to - * "number of iterations". Consider: - * - * void pushBack(uint32_t n, size_t initialSize) { - * vector v; - * BENCHMARK_SUSPEND { - * v.resize(initialSize); - * } - * FOR_EACH_RANGE (i, 0, n) { - * v.push_back(i); - * } - * } - * BENCHMARK_PARAM(pushBack, 0) - * BENCHMARK_PARAM(pushBack, 1000) - * BENCHMARK_PARAM(pushBack, 1000000) - * - * The benchmark above estimates the speed of push_back at different - * initial sizes of the vector. The framework will pass 0, 1000, and - * 1000000 for initialSize, and the iteration count for n. - */ -#define BENCHMARK_PARAM(name, param) BENCHMARK_NAMED_PARAM(name, param, param) - -/** - * Same as BENCHMARK_PARAM, but allows one to return the actual number of - * iterations that have been run. - */ -#define BENCHMARK_PARAM_MULTI(name, param) \ - BENCHMARK_NAMED_PARAM_MULTI(name, param, param) - -/* - * Like BENCHMARK_PARAM(), but allows a custom name to be specified for each - * parameter, rather than using the parameter value. - * - * Useful when the parameter value is not a valid token for string pasting, - * of when you want to specify multiple parameter arguments. - * - * For example: - * - * void addValue(uint32_t n, int64_t bucketSize, int64_t min, int64_t max) { - * Histogram hist(bucketSize, min, max); - * int64_t num = min; - * FOR_EACH_RANGE (i, 0, n) { - * hist.addValue(num); - * ++num; - * if (num > max) { num = min; } - * } - * } - * - * BENCHMARK_NAMED_PARAM(addValue, 0_to_100, 1, 0, 100) - * BENCHMARK_NAMED_PARAM(addValue, 0_to_1000, 10, 0, 1000) - * BENCHMARK_NAMED_PARAM(addValue, 5k_to_20k, 250, 5000, 20000) - */ -#define BENCHMARK_NAMED_PARAM(name, param_name, ...) \ - BENCHMARK_IMPL( \ - FB_CONCATENATE(name, FB_CONCATENATE(_, param_name)), \ - FOLLY_PP_STRINGIZE(name) "(" FOLLY_PP_STRINGIZE(param_name) ")", \ - iters, \ - unsigned, \ - iters) { \ - name(iters, ##__VA_ARGS__); \ - } - -/** - * Same as BENCHMARK_NAMED_PARAM, but allows one to return the actual number - * of iterations that have been run. - */ -#define BENCHMARK_NAMED_PARAM_MULTI(name, param_name, ...) \ - BENCHMARK_MULTI_IMPL( \ - FB_CONCATENATE(name, FB_CONCATENATE(_, param_name)), \ - FOLLY_PP_STRINGIZE(name) "(" FOLLY_PP_STRINGIZE(param_name) ")", \ - unsigned, \ - iters) { \ - return name(iters, ##__VA_ARGS__); \ - } - -/** - * Just like BENCHMARK, but prints the time relative to a - * baseline. The baseline is the most recent BENCHMARK() seen in - * the current scope. Example: - * - * // This is the baseline - * BENCHMARK(insertVectorBegin, n) { - * vector v; - * FOR_EACH_RANGE (i, 0, n) { - * v.insert(v.begin(), 42); - * } - * } - * - * BENCHMARK_RELATIVE(insertListBegin, n) { - * list s; - * FOR_EACH_RANGE (i, 0, n) { - * s.insert(s.begin(), 42); - * } - * } - * - * Any number of relative benchmark can be associated with a - * baseline. Another BENCHMARK() occurrence effectively establishes a - * new baseline. - */ -#define BENCHMARK_RELATIVE(name, ...) \ - BENCHMARK_IMPL( \ - name, \ - "%" FOLLY_PP_STRINGIZE(name), \ - FB_ARG_2_OR_1(1, ##__VA_ARGS__), \ - FB_ONE_OR_NONE(unsigned, ##__VA_ARGS__), \ - __VA_ARGS__) - -#define BENCHMARK_COUNTERS_RELATIVE(name, counters, ...) \ - BENCHMARK_IMPL_COUNTERS( \ - name, \ - "%" FOLLY_PP_STRINGIZE(name), \ - counters, \ - FB_ARG_2_OR_1(1, ##__VA_ARGS__), \ - FB_ONE_OR_NONE(unsigned, ##__VA_ARGS__), \ - __VA_ARGS__) -/** - * Same as BENCHMARK_RELATIVE, but allows one to return the actual number - * of iterations that have been run. - */ -#define BENCHMARK_RELATIVE_MULTI(name, ...) \ - BENCHMARK_MULTI_IMPL( \ - name, \ - "%" FOLLY_PP_STRINGIZE(name), \ - FB_ONE_OR_NONE(unsigned, ##__VA_ARGS__), \ - __VA_ARGS__) - -/** - * A combination of BENCHMARK_RELATIVE and BENCHMARK_PARAM. - */ -#define BENCHMARK_RELATIVE_PARAM(name, param) \ - BENCHMARK_RELATIVE_NAMED_PARAM(name, param, param) - -/** - * Same as BENCHMARK_RELATIVE_PARAM, but allows one to return the actual - * number of iterations that have been run. - */ -#define BENCHMARK_RELATIVE_PARAM_MULTI(name, param) \ - BENCHMARK_RELATIVE_NAMED_PARAM_MULTI(name, param, param) - -/** - * A combination of BENCHMARK_RELATIVE and BENCHMARK_NAMED_PARAM. - */ -#define BENCHMARK_RELATIVE_NAMED_PARAM(name, param_name, ...) \ - BENCHMARK_IMPL( \ - FB_CONCATENATE(name, FB_CONCATENATE(_, param_name)), \ - "%" FOLLY_PP_STRINGIZE(name) "(" FOLLY_PP_STRINGIZE(param_name) ")", \ - iters, \ - unsigned, \ - iters) { \ - name(iters, ##__VA_ARGS__); \ - } - -/** - * Same as BENCHMARK_RELATIVE_NAMED_PARAM, but allows one to return the - * actual number of iterations that have been run. - */ -#define BENCHMARK_RELATIVE_NAMED_PARAM_MULTI(name, param_name, ...) \ - BENCHMARK_MULTI_IMPL( \ - FB_CONCATENATE(name, FB_CONCATENATE(_, param_name)), \ - "%" FOLLY_PP_STRINGIZE(name) "(" FOLLY_PP_STRINGIZE(param_name) ")", \ - unsigned, \ - iters) { \ - return name(iters, ##__VA_ARGS__); \ - } - -/** - * Draws a line of dashes. - */ -#define BENCHMARK_DRAW_LINE() \ - FOLLY_MAYBE_UNUSED static bool FB_ANONYMOUS_VARIABLE(follyBenchmarkUnused) = \ - (::folly::addBenchmark(__FILE__, "-", []() -> unsigned { return 0; }), \ - true) - -/** - * Allows execution of code that doesn't count torward the benchmark's - * time budget. Example: - * - * BENCHMARK_START_GROUP(insertVectorBegin, n) { - * vector v; - * BENCHMARK_SUSPEND { - * v.reserve(n); - * } - * FOR_EACH_RANGE (i, 0, n) { - * v.insert(v.begin(), 42); - * } - * } - */ -#define BENCHMARK_SUSPEND \ - if (auto FB_ANONYMOUS_VARIABLE(BENCHMARK_SUSPEND) = \ - ::folly::BenchmarkSuspender()) { \ - } else diff --git a/ios/Pods/Flipper-Folly/folly/Bits.h b/ios/Pods/Flipper-Folly/folly/Bits.h deleted file mode 100644 index 1569d59..0000000 --- a/ios/Pods/Flipper-Folly/folly/Bits.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include // @shim diff --git a/ios/Pods/Flipper-Folly/folly/CPortability.h b/ios/Pods/Flipper-Folly/folly/CPortability.h deleted file mode 100644 index 976daf0..0000000 --- a/ios/Pods/Flipper-Folly/folly/CPortability.h +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -/* These definitions are in a separate file so that they - * may be included from C- as well as C++-based projects. */ - -#include - -/** - * Portable version check. - */ -#ifndef __GNUC_PREREQ -#if defined __GNUC__ && defined __GNUC_MINOR__ -/* nolint */ -#define __GNUC_PREREQ(maj, min) \ - ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) -#else -/* nolint */ -#define __GNUC_PREREQ(maj, min) 0 -#endif -#endif - -// portable version check for clang -#ifndef __CLANG_PREREQ -#if defined __clang__ && defined __clang_major__ && defined __clang_minor__ -/* nolint */ -#define __CLANG_PREREQ(maj, min) \ - ((__clang_major__ << 16) + __clang_minor__ >= ((maj) << 16) + (min)) -#else -/* nolint */ -#define __CLANG_PREREQ(maj, min) 0 -#endif -#endif - -#if defined(__has_builtin) -#define FOLLY_HAS_BUILTIN(...) __has_builtin(__VA_ARGS__) -#else -#define FOLLY_HAS_BUILTIN(...) 0 -#endif - -#if defined(__has_feature) -#define FOLLY_HAS_FEATURE(...) __has_feature(__VA_ARGS__) -#else -#define FOLLY_HAS_FEATURE(...) 0 -#endif - -/* FOLLY_SANITIZE_ADDRESS is defined to 1 if the current compilation unit - * is being compiled with ASAN enabled. - * - * Beware when using this macro in a header file: this macro may change values - * across compilation units if some libraries are built with ASAN enabled - * and some built with ASAN disabled. For instance, this may occur, if folly - * itself was compiled without ASAN but a downstream project that uses folly is - * compiling with ASAN enabled. - * - * Use FOLLY_LIBRARY_SANITIZE_ADDRESS (defined in folly-config.h) to check if - * folly itself was compiled with ASAN enabled. - */ -#ifndef FOLLY_SANITIZE_ADDRESS -#if FOLLY_HAS_FEATURE(address_sanitizer) || __SANITIZE_ADDRESS__ -#define FOLLY_SANITIZE_ADDRESS 1 -#endif -#endif - -/* Define attribute wrapper for function attribute used to disable - * address sanitizer instrumentation. Unfortunately, this attribute - * has issues when inlining is used, so disable that as well. */ -#ifdef FOLLY_SANITIZE_ADDRESS -#if defined(__clang__) -#if __has_attribute(__no_sanitize__) -#define FOLLY_DISABLE_ADDRESS_SANITIZER \ - __attribute__((__no_sanitize__("address"), __noinline__)) -#elif __has_attribute(__no_address_safety_analysis__) -#define FOLLY_DISABLE_ADDRESS_SANITIZER \ - __attribute__((__no_address_safety_analysis__, __noinline__)) -#elif __has_attribute(__no_sanitize_address__) -#define FOLLY_DISABLE_ADDRESS_SANITIZER \ - __attribute__((__no_sanitize_address__, __noinline__)) -#endif -#elif defined(__GNUC__) -#define FOLLY_DISABLE_ADDRESS_SANITIZER \ - __attribute__((__no_address_safety_analysis__, __noinline__)) -#endif -#endif -#ifndef FOLLY_DISABLE_ADDRESS_SANITIZER -#define FOLLY_DISABLE_ADDRESS_SANITIZER -#endif - -/* Define a convenience macro to test when thread sanitizer is being used - * across the different compilers (e.g. clang, gcc) */ -#ifndef FOLLY_SANITIZE_THREAD -#if FOLLY_HAS_FEATURE(thread_sanitizer) || __SANITIZE_THREAD__ -#define FOLLY_SANITIZE_THREAD 1 -#endif -#endif - -#if FOLLY_SANITIZE_THREAD -#define FOLLY_DISABLE_THREAD_SANITIZER \ - __attribute__((no_sanitize_thread, noinline)) -#else -#define FOLLY_DISABLE_THREAD_SANITIZER -#endif - -/** - * Define a convenience macro to test when memory sanitizer is being used - * across the different compilers (e.g. clang, gcc) - */ -#ifndef FOLLY_SANITIZE_MEMORY -#if FOLLY_HAS_FEATURE(memory_sanitizer) || __SANITIZE_MEMORY__ -#define FOLLY_SANITIZE_MEMORY 1 -#endif -#endif - -#if FOLLY_SANITIZE_MEMORY -#define FOLLY_DISABLE_MEMORY_SANITIZER \ - __attribute__((no_sanitize_memory, noinline)) -#else -#define FOLLY_DISABLE_MEMORY_SANITIZER -#endif - -/** - * Define a convenience macro to test when ASAN, UBSAN, TSAN or MSAN sanitizer - * are being used - */ -#ifndef FOLLY_SANITIZE -#if defined(FOLLY_SANITIZE_ADDRESS) || defined(FOLLY_SANITIZE_THREAD) || \ - defined(FOLLY_SANITIZE_MEMORY) -#define FOLLY_SANITIZE 1 -#endif -#endif - -#if FOLLY_SANITIZE -#define FOLLY_DISABLE_UNDEFINED_BEHAVIOR_SANITIZER(...) \ - __attribute__((no_sanitize(__VA_ARGS__))) -#else -#define FOLLY_DISABLE_UNDEFINED_BEHAVIOR_SANITIZER(...) -#endif // FOLLY_SANITIZE - -#define FOLLY_DISABLE_SANITIZERS \ - FOLLY_DISABLE_ADDRESS_SANITIZER FOLLY_DISABLE_THREAD_SANITIZER \ - FOLLY_DISABLE_UNDEFINED_BEHAVIOR_SANITIZER("undefined") - -/** - * Macro for marking functions as having public visibility. - */ -#if defined(__GNUC__) -#define FOLLY_EXPORT __attribute__((__visibility__("default"))) -#else -#define FOLLY_EXPORT -#endif - -// noinline -#ifdef _MSC_VER -#define FOLLY_NOINLINE __declspec(noinline) -#elif defined(__GNUC__) -#define FOLLY_NOINLINE __attribute__((__noinline__)) -#else -#define FOLLY_NOINLINE -#endif - -// always inline -#ifdef _MSC_VER -#define FOLLY_ALWAYS_INLINE __forceinline -#elif defined(__GNUC__) -#define FOLLY_ALWAYS_INLINE inline __attribute__((__always_inline__)) -#else -#define FOLLY_ALWAYS_INLINE inline -#endif - -// attribute hidden -#if defined(_MSC_VER) -#define FOLLY_ATTR_VISIBILITY_HIDDEN -#elif defined(__GNUC__) -#define FOLLY_ATTR_VISIBILITY_HIDDEN __attribute__((__visibility__("hidden"))) -#else -#define FOLLY_ATTR_VISIBILITY_HIDDEN -#endif - -// An attribute for marking symbols as weak, if supported -#if FOLLY_HAVE_WEAK_SYMBOLS -#define FOLLY_ATTR_WEAK __attribute__((__weak__)) -#else -#define FOLLY_ATTR_WEAK -#endif - -// Microsoft ABI version (can be overridden manually if necessary) -#ifndef FOLLY_MICROSOFT_ABI_VER -#ifdef _MSC_VER -#define FOLLY_MICROSOFT_ABI_VER _MSC_VER -#endif -#endif - -// FOLLY_ERASE -// -// A conceptual attribute/syntax combo for erasing a function from the build -// artifacts and forcing all call-sites to inline the callee, at least as far -// as each compiler supports. -// -// Semantically includes the inline specifier. -#define FOLLY_ERASE FOLLY_ALWAYS_INLINE FOLLY_ATTR_VISIBILITY_HIDDEN - -// FOLLY_ERASE_HACK_GCC -// -// Equivalent to FOLLY_ERASE, but without hiding under gcc. Useful when applied -// to a function which may sometimes be hidden separately, for example by being -// declared in an anonymous namespace, since in such cases with -Wattributes -// enabled, gcc would emit: 'visibility' attribute ignored. -// -// Semantically includes the inline specifier. -#if defined(__GNUC__) && !defined(__clang__) -#define FOLLY_ERASE_HACK_GCC FOLLY_ALWAYS_INLINE -#else -#define FOLLY_ERASE_HACK_GCC FOLLY_ERASE -#endif - -// FOLLY_ERASE_TRYCATCH -// -// Equivalent to FOLLY_ERASE, but for code which might contain explicit -// exception handling. Has the effect of FOLLY_ERASE, except under MSVC which -// warns about __forceinline when functions contain exception handling. -// -// Semantically includes the inline specifier. -#ifdef _MSC_VER -#define FOLLY_ERASE_TRYCATCH inline -#else -#define FOLLY_ERASE_TRYCATCH FOLLY_ERASE -#endif diff --git a/ios/Pods/Flipper-Folly/folly/CancellationToken-inl.h b/ios/Pods/Flipper-Folly/folly/CancellationToken-inl.h deleted file mode 100644 index 8ce5c5c..0000000 --- a/ios/Pods/Flipper-Folly/folly/CancellationToken-inl.h +++ /dev/null @@ -1,351 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include - -#include - -namespace folly { - -namespace detail { - -// Internal cancellation state object. -class CancellationState { - public: - FOLLY_NODISCARD static CancellationStateSourcePtr create(); - - private: - // Constructed initially with a CancellationSource reference count of 1. - CancellationState() noexcept; - - ~CancellationState(); - - friend struct CancellationStateTokenDeleter; - friend struct CancellationStateSourceDeleter; - - void removeTokenReference() noexcept; - void removeSourceReference() noexcept; - - public: - FOLLY_NODISCARD CancellationStateTokenPtr addTokenReference() noexcept; - - FOLLY_NODISCARD CancellationStateSourcePtr addSourceReference() noexcept; - - bool tryAddCallback( - CancellationCallback* callback, - bool incrementRefCountIfSuccessful) noexcept; - - void removeCallback(CancellationCallback* callback) noexcept; - - bool isCancellationRequested() const noexcept; - bool canBeCancelled() const noexcept; - - // Request cancellation. - // Return 'true' if cancellation had already been requested. - // Return 'false' if this was the first thread to request - // cancellation. - bool requestCancellation() noexcept; - - private: - void lock() noexcept; - void unlock() noexcept; - void unlockAndIncrementTokenCount() noexcept; - void unlockAndDecrementTokenCount() noexcept; - bool tryLockAndCancelUnlessCancelled() noexcept; - - template - bool tryLock(Predicate predicate) noexcept; - - static bool canBeCancelled(std::uint64_t state) noexcept; - static bool isCancellationRequested(std::uint64_t state) noexcept; - static bool isLocked(std::uint64_t state) noexcept; - - static constexpr std::uint64_t kCancellationRequestedFlag = 1; - static constexpr std::uint64_t kLockedFlag = 2; - static constexpr std::uint64_t kTokenReferenceCountIncrement = 4; - static constexpr std::uint64_t kSourceReferenceCountIncrement = - std::uint64_t(1) << 33u; - static constexpr std::uint64_t kTokenReferenceCountMask = - (kSourceReferenceCountIncrement - 1u) - - (kTokenReferenceCountIncrement - 1u); - static constexpr std::uint64_t kSourceReferenceCountMask = - std::numeric_limits::max() - - (kSourceReferenceCountIncrement - 1u); - - // Bit 0 - Cancellation Requested - // Bit 1 - Locked Flag - // Bits 2-32 - Token reference count (max ~2 billion) - // Bits 33-63 - Source reference count (max ~2 billion) - std::atomic state_; - CancellationCallback* head_; - std::thread::id signallingThreadId_; -}; - -inline void CancellationStateTokenDeleter::operator()( - CancellationState* state) noexcept { - state->removeTokenReference(); -} - -inline void CancellationStateSourceDeleter::operator()( - CancellationState* state) noexcept { - state->removeSourceReference(); -} - -} // namespace detail - -inline CancellationToken::CancellationToken( - const CancellationToken& other) noexcept - : state_() { - if (other.state_) { - state_ = other.state_->addTokenReference(); - } -} - -inline CancellationToken::CancellationToken(CancellationToken&& other) noexcept - : state_(std::move(other.state_)) {} - -inline CancellationToken& CancellationToken::operator=( - const CancellationToken& other) noexcept { - if (state_ != other.state_) { - CancellationToken temp{other}; - swap(temp); - } - return *this; -} - -inline CancellationToken& CancellationToken::operator=( - CancellationToken&& other) noexcept { - state_ = std::move(other.state_); - return *this; -} - -inline bool CancellationToken::isCancellationRequested() const noexcept { - return state_ != nullptr && state_->isCancellationRequested(); -} - -inline bool CancellationToken::canBeCancelled() const noexcept { - return state_ != nullptr && state_->canBeCancelled(); -} - -inline void CancellationToken::swap(CancellationToken& other) noexcept { - std::swap(state_, other.state_); -} - -inline CancellationToken::CancellationToken( - detail::CancellationStateTokenPtr state) noexcept - : state_(std::move(state)) {} - -inline bool operator==( - const CancellationToken& a, - const CancellationToken& b) noexcept { - return a.state_ == b.state_; -} - -inline bool operator!=( - const CancellationToken& a, - const CancellationToken& b) noexcept { - return !(a == b); -} - -inline CancellationSource::CancellationSource() - : state_(detail::CancellationState::create()) {} - -inline CancellationSource::CancellationSource( - const CancellationSource& other) noexcept - : state_() { - if (other.state_) { - state_ = other.state_->addSourceReference(); - } -} - -inline CancellationSource::CancellationSource( - CancellationSource&& other) noexcept - : state_(std::move(other.state_)) {} - -inline CancellationSource& CancellationSource::operator=( - const CancellationSource& other) noexcept { - if (state_ != other.state_) { - CancellationSource temp{other}; - swap(temp); - } - return *this; -} - -inline CancellationSource& CancellationSource::operator=( - CancellationSource&& other) noexcept { - state_ = std::move(other.state_); - return *this; -} - -inline CancellationSource CancellationSource::invalid() noexcept { - return CancellationSource{detail::CancellationStateSourcePtr{}}; -} - -inline bool CancellationSource::isCancellationRequested() const noexcept { - return state_ != nullptr && state_->isCancellationRequested(); -} - -inline bool CancellationSource::canBeCancelled() const noexcept { - return state_ != nullptr; -} - -inline CancellationToken CancellationSource::getToken() const noexcept { - if (state_ != nullptr) { - return CancellationToken{state_->addTokenReference()}; - } - return CancellationToken{}; -} - -inline bool CancellationSource::requestCancellation() const noexcept { - if (state_ != nullptr) { - return state_->requestCancellation(); - } - return false; -} - -inline void CancellationSource::swap(CancellationSource& other) noexcept { - std::swap(state_, other.state_); -} - -inline CancellationSource::CancellationSource( - detail::CancellationStateSourcePtr&& state) noexcept - : state_(std::move(state)) {} - -template < - typename Callable, - std::enable_if_t< - std::is_constructible:: - value, - int>> -inline CancellationCallback::CancellationCallback( - CancellationToken&& ct, - Callable&& callable) - : next_(nullptr), - prevNext_(nullptr), - state_(nullptr), - callback_(static_cast(callable)), - destructorHasRunInsideCallback_(nullptr), - callbackCompleted_(false) { - if (ct.state_ != nullptr && ct.state_->tryAddCallback(this, false)) { - state_ = ct.state_.release(); - } -} - -template < - typename Callable, - std::enable_if_t< - std::is_constructible:: - value, - int>> -inline CancellationCallback::CancellationCallback( - const CancellationToken& ct, - Callable&& callable) - : next_(nullptr), - prevNext_(nullptr), - state_(nullptr), - callback_(static_cast(callable)), - destructorHasRunInsideCallback_(nullptr), - callbackCompleted_(false) { - if (ct.state_ != nullptr && ct.state_->tryAddCallback(this, true)) { - state_ = ct.state_.get(); - } -} - -inline CancellationCallback::~CancellationCallback() { - if (state_ != nullptr) { - state_->removeCallback(this); - } -} - -inline void CancellationCallback::invokeCallback() noexcept { - // Invoke within a noexcept context so that we std::terminate() if it throws. - callback_(); -} - -namespace detail { - -inline CancellationStateSourcePtr CancellationState::create() { - return CancellationStateSourcePtr{new CancellationState()}; -} - -inline CancellationState::CancellationState() noexcept - : state_(kSourceReferenceCountIncrement), - head_(nullptr), - signallingThreadId_() {} - -inline CancellationStateTokenPtr -CancellationState::addTokenReference() noexcept { - state_.fetch_add(kTokenReferenceCountIncrement, std::memory_order_relaxed); - return CancellationStateTokenPtr{this}; -} - -inline void CancellationState::removeTokenReference() noexcept { - const auto oldState = state_.fetch_sub( - kTokenReferenceCountIncrement, std::memory_order_acq_rel); - DCHECK( - (oldState & kTokenReferenceCountMask) >= kTokenReferenceCountIncrement); - if (oldState < (2 * kTokenReferenceCountIncrement)) { - delete this; - } -} - -inline CancellationStateSourcePtr -CancellationState::addSourceReference() noexcept { - state_.fetch_add(kSourceReferenceCountIncrement, std::memory_order_relaxed); - return CancellationStateSourcePtr{this}; -} - -inline void CancellationState::removeSourceReference() noexcept { - const auto oldState = state_.fetch_sub( - kSourceReferenceCountIncrement, std::memory_order_acq_rel); - DCHECK( - (oldState & kSourceReferenceCountMask) >= kSourceReferenceCountIncrement); - if (oldState < - (kSourceReferenceCountIncrement + kTokenReferenceCountIncrement)) { - delete this; - } -} - -inline bool CancellationState::isCancellationRequested() const noexcept { - return isCancellationRequested(state_.load(std::memory_order_acquire)); -} - -inline bool CancellationState::canBeCancelled() const noexcept { - return canBeCancelled(state_.load(std::memory_order_acquire)); -} - -inline bool CancellationState::canBeCancelled(std::uint64_t state) noexcept { - // Can be cancelled if there is at least one CancellationSource ref-count - // or if cancellation has been requested. - return (state >= kSourceReferenceCountIncrement) || - isCancellationRequested(state); -} - -inline bool CancellationState::isCancellationRequested( - std::uint64_t state) noexcept { - return (state & kCancellationRequestedFlag) != 0; -} - -inline bool CancellationState::isLocked(std::uint64_t state) noexcept { - return (state & kLockedFlag) != 0; -} - -} // namespace detail - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/CancellationToken.cpp b/ios/Pods/Flipper-Folly/folly/CancellationToken.cpp deleted file mode 100644 index 0577799..0000000 --- a/ios/Pods/Flipper-Folly/folly/CancellationToken.cpp +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include - -#include - -#include -#include -#include -#include - -namespace folly { -namespace detail { - -CancellationState::~CancellationState() { - DCHECK(head_ == nullptr); - DCHECK(!isLocked(state_.load(std::memory_order_relaxed))); - DCHECK( - state_.load(std::memory_order_relaxed) < kTokenReferenceCountIncrement); -} - -bool CancellationState::tryAddCallback( - CancellationCallback* callback, - bool incrementRefCountIfSuccessful) noexcept { - // Try to acquire the lock, but abandon trying to acquire the lock if - // cancellation has already been requested (we can just immediately invoke - // the callback) or if cancellation can never be requested (we can just - // skip registration). - if (!tryLock([callback](std::uint64_t oldState) noexcept { - if (isCancellationRequested(oldState)) { - callback->invokeCallback(); - return false; - } - return canBeCancelled(oldState); - })) { - return false; - } - - // We've acquired the lock and cancellation has not yet been requested. - // Push this callback onto the head of the list. - if (head_ != nullptr) { - head_->prevNext_ = &callback->next_; - } - callback->next_ = head_; - callback->prevNext_ = &head_; - head_ = callback; - - if (incrementRefCountIfSuccessful) { - // Combine multiple atomic operations into a single atomic operation. - unlockAndIncrementTokenCount(); - } else { - unlock(); - } - - // Successfully added the callback. - return true; -} - -void CancellationState::removeCallback( - CancellationCallback* callback) noexcept { - DCHECK(callback != nullptr); - - lock(); - - if (callback->prevNext_ != nullptr) { - // Still registered in the list => not yet executed. - // Just remove it from the list. - *callback->prevNext_ = callback->next_; - if (callback->next_ != nullptr) { - callback->next_->prevNext_ = callback->prevNext_; - } - - unlockAndDecrementTokenCount(); - return; - } - - unlock(); - - // Callback has either already executed or is executing concurrently on - // another thread. - - if (signallingThreadId_ == std::this_thread::get_id()) { - // Callback executed on this thread or is still currently executing - // and is deregistering itself from within the callback. - if (callback->destructorHasRunInsideCallback_ != nullptr) { - // Currently inside the callback, let the requestCancellation() method - // know the object is about to be destructed and that it should - // not try to access the object when the callback returns. - *callback->destructorHasRunInsideCallback_ = true; - } - } else { - // Callback is currently executing on another thread, block until it - // finishes executing. - folly::detail::Sleeper sleeper; - while (!callback->callbackCompleted_.load(std::memory_order_acquire)) { - sleeper.wait(); - } - } - - removeTokenReference(); -} - -bool CancellationState::requestCancellation() noexcept { - if (!tryLockAndCancelUnlessCancelled()) { - // Was already marked as cancelled - return true; - } - - // This thread marked as cancelled and acquired the lock - - signallingThreadId_ = std::this_thread::get_id(); - - while (head_ != nullptr) { - // Dequeue the first item on the queue. - CancellationCallback* callback = head_; - head_ = callback->next_; - const bool anyMore = head_ != nullptr; - if (anyMore) { - head_->prevNext_ = &head_; - } - // Mark this item as removed from the list. - callback->prevNext_ = nullptr; - - // Don't hold the lock while executing the callback - // as we don't want to block other threads from - // deregistering callbacks. - unlock(); - - // TRICKY: Need to store a flag on the stack here that the callback - // can use to signal that the destructor was executed inline - // during the call. - // If the destructor was executed inline then it's not safe to - // dereference 'callback' after 'invokeCallback()' returns. - // If the destructor runs on some other thread then the other - // thread will block waiting for this thread to signal that the - // callback has finished executing. - bool destructorHasRunInsideCallback = false; - callback->destructorHasRunInsideCallback_ = &destructorHasRunInsideCallback; - - callback->invokeCallback(); - - if (!destructorHasRunInsideCallback) { - callback->destructorHasRunInsideCallback_ = nullptr; - callback->callbackCompleted_.store(true, std::memory_order_release); - } - - if (!anyMore) { - // This was the last item in the queue when we dequeued it. - // No more items should be added to the queue after we have - // marked the state as cancelled, only removed from the queue. - // Avoid acquring/releasing the lock in this case. - return false; - } - - lock(); - } - - unlock(); - - return false; -} - -void CancellationState::lock() noexcept { - folly::detail::Sleeper sleeper; - std::uint64_t oldState = state_.load(std::memory_order_relaxed); - do { - while (isLocked(oldState)) { - sleeper.wait(); - oldState = state_.load(std::memory_order_relaxed); - } - } while (!state_.compare_exchange_weak( - oldState, - oldState | kLockedFlag, - std::memory_order_acquire, - std::memory_order_relaxed)); -} - -void CancellationState::unlock() noexcept { - state_.fetch_sub(kLockedFlag, std::memory_order_release); -} - -void CancellationState::unlockAndIncrementTokenCount() noexcept { - state_.fetch_sub( - kLockedFlag - kTokenReferenceCountIncrement, std::memory_order_release); -} - -void CancellationState::unlockAndDecrementTokenCount() noexcept { - auto oldState = state_.fetch_sub( - kLockedFlag + kTokenReferenceCountIncrement, std::memory_order_acq_rel); - if (oldState < (kLockedFlag + 2 * kTokenReferenceCountIncrement)) { - delete this; - } -} - -bool CancellationState::tryLockAndCancelUnlessCancelled() noexcept { - folly::detail::Sleeper sleeper; - std::uint64_t oldState = state_.load(std::memory_order_acquire); - while (true) { - if (isCancellationRequested(oldState)) { - return false; - } else if (isLocked(oldState)) { - sleeper.wait(); - oldState = state_.load(std::memory_order_acquire); - } else if (state_.compare_exchange_weak( - oldState, - oldState | kLockedFlag | kCancellationRequestedFlag, - std::memory_order_acq_rel, - std::memory_order_acquire)) { - return true; - } - } -} - -template -bool CancellationState::tryLock(Predicate predicate) noexcept { - folly::detail::Sleeper sleeper; - std::uint64_t oldState = state_.load(std::memory_order_acquire); - while (true) { - if (!predicate(oldState)) { - return false; - } else if (isLocked(oldState)) { - sleeper.wait(); - oldState = state_.load(std::memory_order_acquire); - } else if (state_.compare_exchange_weak( - oldState, - oldState | kLockedFlag, - std::memory_order_acquire)) { - return true; - } - } -} - -} // namespace detail -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/CancellationToken.h b/ios/Pods/Flipper-Folly/folly/CancellationToken.h deleted file mode 100644 index bdda121..0000000 --- a/ios/Pods/Flipper-Folly/folly/CancellationToken.h +++ /dev/null @@ -1,298 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include - -#include -#include -#include -#include - -namespace folly { - -class CancellationCallback; -class CancellationSource; -struct OperationCancelled : public std::exception { - const char* what() const noexcept override { - return "coroutine operation cancelled"; - } -}; - -namespace detail { -class CancellationState; -struct CancellationStateTokenDeleter { - void operator()(CancellationState*) noexcept; -}; -struct CancellationStateSourceDeleter { - void operator()(CancellationState*) noexcept; -}; -using CancellationStateTokenPtr = - std::unique_ptr; -using CancellationStateSourcePtr = - std::unique_ptr; -} // namespace detail - -// A CancellationToken is an object that can be passed into an function or -// operation that allows the caller to later request that the operation be -// cancelled. -// -// A CancellationToken object can be obtained by calling the .getToken() -// method on a CancellationSource or by copying another CancellationToken -// object. All CancellationToken objects obtained from the same original -// CancellationSource object all reference the same underlying cancellation -// state and will all be cancelled together. -// -// If your function needs to be cancellable but does not need to request -// cancellation then you should take a CancellationToken as a parameter. -// If your function needs to be able to request cancellation then you -// should instead take a CancellationSource as a parameter. -class CancellationToken { - public: - // Constructs to a token that can never be cancelled. - // - // Pass a default-constructed CancellationToken into an operation that - // you never intend to cancel. These objects are very cheap to create. - CancellationToken() noexcept = default; - - // Construct a copy of the token that shares the same underlying state. - CancellationToken(const CancellationToken& other) noexcept; - CancellationToken(CancellationToken&& other) noexcept; - - CancellationToken& operator=(const CancellationToken& other) noexcept; - CancellationToken& operator=(CancellationToken&& other) noexcept; - - // Query whether someone has called .requestCancellation() on an instance - // of CancellationSource object associated with this CancellationToken. - bool isCancellationRequested() const noexcept; - - // Query whether this CancellationToken can ever have cancellation requested - // on it. - // - // This will return false if the CancellationToken is not associated with a - // CancellationSource object. eg. because the CancellationToken was - // default-constructed, has been moved-from or because the last - // CancellationSource object associated with the underlying cancellation state - // has been destroyed and the operation has not yet been cancelled and so - // never will be. - // - // Implementations of operations may be able to take more efficient code-paths - // if they know they can never be cancelled. - bool canBeCancelled() const noexcept; - - void swap(CancellationToken& other) noexcept; - - friend bool operator==( - const CancellationToken& a, - const CancellationToken& b) noexcept; - - private: - friend class CancellationCallback; - friend class CancellationSource; - - explicit CancellationToken(detail::CancellationStateTokenPtr state) noexcept; - - detail::CancellationStateTokenPtr state_; -}; - -bool operator==( - const CancellationToken& a, - const CancellationToken& b) noexcept; -bool operator!=( - const CancellationToken& a, - const CancellationToken& b) noexcept; - -// A CancellationSource object provides the ability to request cancellation of -// operations that an associated CancellationToken was passed to. -// -// Example usage: -// CancellationSource cs; -// Future f = startSomeOperation(cs.getToken()); -// -// // Later... -// cs.requestCancellation(); -class CancellationSource { - public: - // Construct to a new, independent cancellation source. - CancellationSource(); - - // Construct a new reference to the same underlying cancellation state. - // - // Either the original or the new copy can be used to request cancellation - // of associated work. - CancellationSource(const CancellationSource& other) noexcept; - - // This leaves 'other' in an empty state where 'requestCancellation()' is a - // no-op and 'canBeCancelled()' returns false. - CancellationSource(CancellationSource&& other) noexcept; - - CancellationSource& operator=(const CancellationSource& other) noexcept; - CancellationSource& operator=(CancellationSource&& other) noexcept; - - // Construct a CancellationSource that cannot be cancelled. - // - // This factory function can be used to obtain a CancellationSource that - // is equivalent to a moved-from CancellationSource object without needing - // to allocate any shared-state. - static CancellationSource invalid() noexcept; - - // Query if cancellation has already been requested on this CancellationSource - // or any other CancellationSource object copied from the same original - // CancellationSource object. - bool isCancellationRequested() const noexcept; - - // Query if cancellation can be requested through this CancellationSource - // object. This will only return false if the CancellationSource object has - // been moved-from. - bool canBeCancelled() const noexcept; - - // Obtain a CancellationToken linked to this CancellationSource. - // - // This token can be passed into cancellable operations to allow the caller - // to later request cancellation of that operation. - CancellationToken getToken() const noexcept; - - // Request cancellation of work associated with this CancellationSource. - // - // This will ensure subsequent calls to isCancellationRequested() on any - // CancellationSource or CancellationToken object associated with the same - // underlying cancellation state to return true. - // - // If this is the first call to requestCancellation() on any - // CancellationSource object with the same underlying state then this call - // will also execute the callbacks associated with any CancellationCallback - // objects that were constructed with an associated CancellationToken. - // - // Note that it is possible that another thread may be concurrently - // registering a callback with CancellationCallback. This method guarantees - // that either this thread will see the callback registration and will - // ensure that the callback is called, or the CancellationCallback constructor - // will see the cancellation-requested signal and will execute the callback - // inline inside the constructor. - // - // Returns the previous state of 'isCancellationRequested()'. i.e. - // - 'true' if cancellation had previously been requested. - // - 'false' if this was the first call to request cancellation. - bool requestCancellation() const noexcept; - - void swap(CancellationSource& other) noexcept; - - friend bool operator==( - const CancellationSource& a, - const CancellationSource& b) noexcept; - - private: - explicit CancellationSource( - detail::CancellationStateSourcePtr&& state) noexcept; - - detail::CancellationStateSourcePtr state_; -}; - -bool operator==( - const CancellationSource& a, - const CancellationSource& b) noexcept; -bool operator!=( - const CancellationSource& a, - const CancellationSource& b) noexcept; - -class CancellationCallback { - using VoidFunction = folly::Function; - - public: - // Constructing a CancellationCallback object registers the callback - // with the specified CancellationToken such that the callback will be - // executed if the corresponding CancellationSource object has the - // requestCancellation() method called on it. - // - // If the CancellationToken object already had cancellation requested - // then the callback will be executed inline on the current thread before - // the constructor returns. Otherwise, the callback will be executed on - // in the execution context of the first thread to call requestCancellation() - // on a corresponding CancellationSource. - // - // The callback object must not throw any unhandled exceptions. Doing so - // will result in the program terminating via std::terminate(). - template < - typename Callable, - std::enable_if_t< - std::is_constructible::value, - int> = 0> - CancellationCallback(CancellationToken&& ct, Callable&& callable); - template < - typename Callable, - std::enable_if_t< - std::is_constructible::value, - int> = 0> - CancellationCallback(const CancellationToken& ct, Callable&& callable); - - // Deregisters the callback from the CancellationToken. - // - // If cancellation has been requested concurrently on another thread and the - // callback is currently executing then the destructor will block until after - // the callback has returned (otherwise it might be left with a dangling - // reference). - // - // You should generally try to implement your callback functions to be lock - // free to avoid deadlocks between the callback executing and the - // CancellationCallback destructor trying to deregister the callback. - // - // If the callback has not started executing yet then the callback will be - // deregistered from the CancellationToken before the destructor completes. - // - // Once the destructor returns you can be guaranteed that the callback will - // not be called by a subsequent call to 'requestCancellation()' on a - // CancellationSource associated with the CancellationToken passed to the - // constructor. - ~CancellationCallback(); - - // Not copyable/movable - CancellationCallback(const CancellationCallback&) = delete; - CancellationCallback(CancellationCallback&&) = delete; - CancellationCallback& operator=(const CancellationCallback&) = delete; - CancellationCallback& operator=(CancellationCallback&&) = delete; - - private: - friend class detail::CancellationState; - - void invokeCallback() noexcept; - - CancellationCallback* next_; - - // Pointer to the pointer that points to this node in the linked list. - // This could be the 'next_' of a previous CancellationCallback or could - // be the 'head_' pointer of the CancellationState. - // If this node is inserted in the list then this will be non-null. - CancellationCallback** prevNext_; - - detail::CancellationState* state_; - VoidFunction callback_; - - // Pointer to a flag stored on the stack of the caller to invokeCallback() - // that is used to indicate to the caller of invokeCallback() that the - // destructor has run and it is no longer valid to access the callback - // object. - bool* destructorHasRunInsideCallback_; - - // Flag used to signal that the callback has completed executing on another - // thread and it is now safe to exit the destructor. - std::atomic callbackCompleted_; -}; - -} // namespace folly - -#include diff --git a/ios/Pods/Flipper-Folly/folly/Chrono.h b/ios/Pods/Flipper-Folly/folly/Chrono.h deleted file mode 100644 index 3b3838b..0000000 --- a/ios/Pods/Flipper-Folly/folly/Chrono.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include -#include - -#include -#include -#include - -/*** - * include or backport: - * * std::chrono::ceil - * * std::chrono::floor - * * std::chrono::round - */ - -#if __cpp_lib_chrono >= 201510 || _LIBCPP_STD_VER > 14 || _MSC_VER - -namespace folly { -namespace chrono { - -/* using override */ using std::chrono::abs; -/* using override */ using std::chrono::ceil; -/* using override */ using std::chrono::floor; -/* using override */ using std::chrono::round; -} // namespace chrono -} // namespace folly - -#else - -namespace folly { -namespace chrono { - -namespace detail { - -// from: http://en.cppreference.com/w/cpp/chrono/duration/ceil, CC-BY-SA -template -struct is_duration : std::false_type {}; -template -struct is_duration> : std::true_type {}; - -template -constexpr To ceil_impl(Duration const& d, To const& t) { - return t < d ? t + To{1} : t; -} - -template -constexpr To floor_impl(Duration const& d, To const& t) { - return t > d ? t - To{1} : t; -} - -template -constexpr To round_impl(To const& t0, To const& t1, Diff diff0, Diff diff1) { - return diff0 < diff1 ? t0 : diff1 < diff0 ? t1 : t0.count() & 1 ? t1 : t0; -} - -template -constexpr To round_impl(Duration const& d, To const& t0, To const& t1) { - return round_impl(t0, t1, d - t0, t1 - d); -} - -template -constexpr To round_impl(Duration const& d, To const& t0) { - return round_impl(d, t0, t0 + To{1}); -} -} // namespace detail - -// mimic: std::chrono::abs, C++17 -template < - typename Rep, - typename Period, - typename = typename std::enable_if< - std::chrono::duration::min() < - std::chrono::duration::zero()>::type> -constexpr std::chrono::duration abs( - std::chrono::duration const& d) { - return d < std::chrono::duration::zero() ? -d : d; -} - -// mimic: std::chrono::ceil, C++17 -// from: http://en.cppreference.com/w/cpp/chrono/duration/ceil, CC-BY-SA -template < - typename To, - typename Rep, - typename Period, - typename = typename std::enable_if::value>::type> -constexpr To ceil(std::chrono::duration const& d) { - return detail::ceil_impl(d, std::chrono::duration_cast(d)); -} - -// mimic: std::chrono::ceil, C++17 -// from: http://en.cppreference.com/w/cpp/chrono/time_point/ceil, CC-BY-SA -template < - typename To, - typename Clock, - typename Duration, - typename = typename std::enable_if::value>::type> -constexpr std::chrono::time_point ceil( - std::chrono::time_point const& tp) { - return std::chrono::time_point{ceil(tp.time_since_epoch())}; -} - -// mimic: std::chrono::floor, C++17 -// from: http://en.cppreference.com/w/cpp/chrono/duration/floor, CC-BY-SA -template < - typename To, - typename Rep, - typename Period, - typename = typename std::enable_if::value>::type> -constexpr To floor(std::chrono::duration const& d) { - return detail::floor_impl(d, std::chrono::duration_cast(d)); -} - -// mimic: std::chrono::floor, C++17 -// from: http://en.cppreference.com/w/cpp/chrono/time_point/floor, CC-BY-SA -template < - typename To, - typename Clock, - typename Duration, - typename = typename std::enable_if::value>::type> -constexpr std::chrono::time_point floor( - std::chrono::time_point const& tp) { - return std::chrono::time_point{floor(tp.time_since_epoch())}; -} - -// mimic: std::chrono::round, C++17 -// from: http://en.cppreference.com/w/cpp/chrono/duration/round, CC-BY-SA -template < - typename To, - typename Rep, - typename Period, - typename = typename std::enable_if< - detail::is_duration::value && - !std::chrono::treat_as_floating_point::value>::type> -constexpr To round(std::chrono::duration const& d) { - return detail::round_impl(d, floor(d)); -} - -// mimic: std::chrono::round, C++17 -// from: http://en.cppreference.com/w/cpp/chrono/time_point/round, CC-BY-SA -template < - typename To, - typename Clock, - typename Duration, - typename = typename std::enable_if< - detail::is_duration::value && - !std::chrono::treat_as_floating_point::value>::type> -constexpr std::chrono::time_point round( - std::chrono::time_point const& tp) { - return std::chrono::time_point{round(tp.time_since_epoch())}; -} -} // namespace chrono -} // namespace folly - -#endif - -namespace folly { -namespace chrono { - -struct coarse_steady_clock { - using rep = std::chrono::milliseconds::rep; - using period = std::chrono::milliseconds::period; - using duration = std::chrono::duration; - using time_point = std::chrono::time_point; - constexpr static bool is_steady = true; - - static time_point now() noexcept { -#ifndef CLOCK_MONOTONIC_COARSE - return time_point(std::chrono::duration_cast( - std::chrono::steady_clock::now().time_since_epoch())); -#else - timespec ts; - auto ret = clock_gettime(CLOCK_MONOTONIC_COARSE, &ts); - if (kIsDebug && (ret != 0)) { - throw_exception( - "Error using CLOCK_MONOTONIC_COARSE."); - } - - return time_point(std::chrono::duration_cast( - std::chrono::seconds(ts.tv_sec) + - std::chrono::nanoseconds(ts.tv_nsec))); -#endif - } -}; - -} // namespace chrono -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/ClockGettimeWrappers.cpp b/ios/Pods/Flipper-Folly/folly/ClockGettimeWrappers.cpp deleted file mode 100644 index 9cdf6d4..0000000 --- a/ios/Pods/Flipper-Folly/folly/ClockGettimeWrappers.cpp +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include -#include -#include - -#include - -#include - -#ifndef _WIN32 -#define _GNU_SOURCE 1 -#include -#endif - -namespace folly { -namespace chrono { - -static int64_t clock_gettime_ns_fallback(clockid_t clock) { - struct timespec ts; - int r = clock_gettime(clock, &ts); - if (UNLIKELY(r != 0)) { - // Mimic what __clock_gettime_ns does (even though this can be a legit - // value). - return -1; - } - std::chrono::nanoseconds result = - std::chrono::seconds(ts.tv_sec) + std::chrono::nanoseconds(ts.tv_nsec); - return result.count(); -} - -// Initialize with default behavior, which we might override on Linux hosts -// with VDSO support. -int (*clock_gettime)(clockid_t, timespec* ts) = &::clock_gettime; -int64_t (*clock_gettime_ns)(clockid_t) = &clock_gettime_ns_fallback; - -// In MSAN mode use glibc's versions as they are intercepted by the MSAN -// runtime which properly tracks memory initialization. -#if defined(FOLLY_HAVE_LINUX_VDSO) && !defined(FOLLY_SANITIZE_MEMORY) - -namespace { - -struct VdsoInitializer { - VdsoInitializer() { - m_handle = dlopen("linux-vdso.so.1", RTLD_LAZY | RTLD_LOCAL | RTLD_NOLOAD); - if (!m_handle) { - return; - } - - void* p = dlsym(m_handle, "__vdso_clock_gettime"); - if (p) { - folly::chrono::clock_gettime = (int (*)(clockid_t, timespec*))p; - } - p = dlsym(m_handle, "__vdso_clock_gettime_ns"); - if (p) { - folly::chrono::clock_gettime_ns = (int64_t(*)(clockid_t))p; - } - } - - ~VdsoInitializer() { - if (m_handle) { - clock_gettime = &::clock_gettime; - clock_gettime_ns = &clock_gettime_ns_fallback; - dlclose(m_handle); - } - } - - private: - void* m_handle; -}; - -const VdsoInitializer vdso_initializer; -} // namespace - -#endif -} // namespace chrono -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/ClockGettimeWrappers.h b/ios/Pods/Flipper-Folly/folly/ClockGettimeWrappers.h deleted file mode 100644 index 8c40319..0000000 --- a/ios/Pods/Flipper-Folly/folly/ClockGettimeWrappers.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include - -#include - -namespace folly { -namespace chrono { - -extern int (*clock_gettime)(clockid_t, timespec* ts); -extern int64_t (*clock_gettime_ns)(clockid_t); -} // namespace chrono -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/ConcurrentBitSet.h b/ios/Pods/Flipper-Folly/folly/ConcurrentBitSet.h deleted file mode 100644 index 2be6e21..0000000 --- a/ios/Pods/Flipper-Folly/folly/ConcurrentBitSet.h +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include -#include -#include -#include - -#include - -namespace folly { - -/** - * An atomic bitset of fixed size (specified at compile time). - * - * Formerly known as AtomicBitSet. It was renamed while fixing a bug - * to avoid any silent breakages during run time. - */ -template -class ConcurrentBitSet { - public: - /** - * Construct a ConcurrentBitSet; all bits are initially false. - */ - ConcurrentBitSet(); - - ConcurrentBitSet(const ConcurrentBitSet&) = delete; - ConcurrentBitSet& operator=(const ConcurrentBitSet&) = delete; - - /** - * Set bit idx to true, using the given memory order. Returns the - * previous value of the bit. - * - * Note that the operation is a read-modify-write operation due to the use - * of fetch_or. - */ - bool set(size_t idx, std::memory_order order = std::memory_order_seq_cst); - - /** - * Set bit idx to false, using the given memory order. Returns the - * previous value of the bit. - * - * Note that the operation is a read-modify-write operation due to the use - * of fetch_and. - */ - bool reset(size_t idx, std::memory_order order = std::memory_order_seq_cst); - - /** - * Set bit idx to the given value, using the given memory order. Returns - * the previous value of the bit. - * - * Note that the operation is a read-modify-write operation due to the use - * of fetch_and or fetch_or. - * - * Yes, this is an overload of set(), to keep as close to std::bitset's - * interface as possible. - */ - bool set( - size_t idx, - bool value, - std::memory_order order = std::memory_order_seq_cst); - - /** - * Read bit idx. - */ - bool test(size_t idx, std::memory_order order = std::memory_order_seq_cst) - const; - - /** - * Same as test() with the default memory order. - */ - bool operator[](size_t idx) const; - - /** - * Return the size of the bitset. - */ - constexpr size_t size() const { - return N; - } - - private: - // Pick the largest lock-free type available -#if (ATOMIC_LLONG_LOCK_FREE == 2) - typedef unsigned long long BlockType; -#elif (ATOMIC_LONG_LOCK_FREE == 2) - typedef unsigned long BlockType; -#else - // Even if not lock free, what can we do? - typedef unsigned int BlockType; -#endif - typedef std::atomic AtomicBlockType; - - static constexpr size_t kBitsPerBlock = - std::numeric_limits::digits; - - static constexpr size_t blockIndex(size_t bit) { - return bit / kBitsPerBlock; - } - - static constexpr size_t bitOffset(size_t bit) { - return bit % kBitsPerBlock; - } - - // avoid casts - static constexpr BlockType kOne = 1; - static constexpr size_t kNumBlocks = (N + kBitsPerBlock - 1) / kBitsPerBlock; - std::array data_; -}; - -// value-initialize to zero -template -inline ConcurrentBitSet::ConcurrentBitSet() : data_() {} - -template -inline bool ConcurrentBitSet::set(size_t idx, std::memory_order order) { - assert(idx < N); - BlockType mask = kOne << bitOffset(idx); - return data_[blockIndex(idx)].fetch_or(mask, order) & mask; -} - -template -inline bool ConcurrentBitSet::reset(size_t idx, std::memory_order order) { - assert(idx < N); - BlockType mask = kOne << bitOffset(idx); - return data_[blockIndex(idx)].fetch_and(~mask, order) & mask; -} - -template -inline bool -ConcurrentBitSet::set(size_t idx, bool value, std::memory_order order) { - return value ? set(idx, order) : reset(idx, order); -} - -template -inline bool ConcurrentBitSet::test(size_t idx, std::memory_order order) - const { - assert(idx < N); - BlockType mask = kOne << bitOffset(idx); - return data_[blockIndex(idx)].load(order) & mask; -} - -template -inline bool ConcurrentBitSet::operator[](size_t idx) const { - return test(idx); -} - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/ConcurrentSkipList-inl.h b/ios/Pods/Flipper-Folly/folly/ConcurrentSkipList-inl.h deleted file mode 100644 index a0eec30..0000000 --- a/ios/Pods/Flipper-Folly/folly/ConcurrentSkipList-inl.h +++ /dev/null @@ -1,377 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// @author: Xin Liu - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -namespace folly { -namespace detail { - -template -class csl_iterator; - -template -class SkipListNode { - enum : uint16_t { - IS_HEAD_NODE = 1, - MARKED_FOR_REMOVAL = (1 << 1), - FULLY_LINKED = (1 << 2), - }; - - public: - typedef T value_type; - - SkipListNode(const SkipListNode&) = delete; - SkipListNode& operator=(const SkipListNode&) = delete; - - template < - typename NodeAlloc, - typename U, - typename = - typename std::enable_if::value>::type> - static SkipListNode* - create(NodeAlloc& alloc, int height, U&& data, bool isHead = false) { - DCHECK(height >= 1 && height < 64) << height; - - size_t size = - sizeof(SkipListNode) + height * sizeof(std::atomic); - auto storage = std::allocator_traits::allocate(alloc, size); - // do placement new - return new (storage) - SkipListNode(uint8_t(height), std::forward(data), isHead); - } - - template - static void destroy(NodeAlloc& alloc, SkipListNode* node) { - size_t size = sizeof(SkipListNode) + - node->height_ * sizeof(std::atomic); - node->~SkipListNode(); - std::allocator_traits::deallocate(alloc, node, size); - } - - template - struct DestroyIsNoOp : StrictConjunction< - AllocatorHasTrivialDeallocate, - std::is_trivially_destructible> {}; - - // copy the head node to a new head node assuming lock acquired - SkipListNode* copyHead(SkipListNode* node) { - DCHECK(node != nullptr && height_ > node->height_); - setFlags(node->getFlags()); - for (uint8_t i = 0; i < node->height_; ++i) { - setSkip(i, node->skip(i)); - } - return this; - } - - inline SkipListNode* skip(int layer) const { - DCHECK_LT(layer, height_); - return skip_[layer].load(std::memory_order_consume); - } - - // next valid node as in the linked list - SkipListNode* next() { - SkipListNode* node; - for (node = skip(0); (node != nullptr && node->markedForRemoval()); - node = node->skip(0)) { - } - return node; - } - - void setSkip(uint8_t h, SkipListNode* next) { - DCHECK_LT(h, height_); - skip_[h].store(next, std::memory_order_release); - } - - value_type& data() { - return data_; - } - const value_type& data() const { - return data_; - } - int maxLayer() const { - return height_ - 1; - } - int height() const { - return height_; - } - - std::unique_lock acquireGuard() { - return std::unique_lock(spinLock_); - } - - bool fullyLinked() const { - return getFlags() & FULLY_LINKED; - } - bool markedForRemoval() const { - return getFlags() & MARKED_FOR_REMOVAL; - } - bool isHeadNode() const { - return getFlags() & IS_HEAD_NODE; - } - - void setIsHeadNode() { - setFlags(uint16_t(getFlags() | IS_HEAD_NODE)); - } - void setFullyLinked() { - setFlags(uint16_t(getFlags() | FULLY_LINKED)); - } - void setMarkedForRemoval() { - setFlags(uint16_t(getFlags() | MARKED_FOR_REMOVAL)); - } - - private: - // Note! this can only be called from create() as a placement new. - template - SkipListNode(uint8_t height, U&& data, bool isHead) - : height_(height), data_(std::forward(data)) { - spinLock_.init(); - setFlags(0); - if (isHead) { - setIsHeadNode(); - } - // need to explicitly init the dynamic atomic pointer array - for (uint8_t i = 0; i < height_; ++i) { - new (&skip_[i]) std::atomic(nullptr); - } - } - - ~SkipListNode() { - for (uint8_t i = 0; i < height_; ++i) { - skip_[i].~atomic(); - } - } - - uint16_t getFlags() const { - return flags_.load(std::memory_order_consume); - } - void setFlags(uint16_t flags) { - flags_.store(flags, std::memory_order_release); - } - - // TODO(xliu): on x86_64, it's possible to squeeze these into - // skip_[0] to maybe save 8 bytes depending on the data alignments. - // NOTE: currently this is x86_64 only anyway, due to the - // MicroSpinLock. - std::atomic flags_; - const uint8_t height_; - MicroSpinLock spinLock_; - - value_type data_; - - std::atomic skip_[0]; -}; - -class SkipListRandomHeight { - enum { kMaxHeight = 64 }; - - public: - // make it a singleton. - static SkipListRandomHeight* instance() { - static SkipListRandomHeight instance_; - return &instance_; - } - - int getHeight(int maxHeight) const { - DCHECK_LE(maxHeight, kMaxHeight) << "max height too big!"; - double p = randomProb(); - for (int i = 0; i < maxHeight; ++i) { - if (p < lookupTable_[i]) { - return i + 1; - } - } - return maxHeight; - } - - size_t getSizeLimit(int height) const { - DCHECK_LT(height, kMaxHeight); - return sizeLimitTable_[height]; - } - - private: - SkipListRandomHeight() { - initLookupTable(); - } - - void initLookupTable() { - // set skip prob = 1/E - static const double kProbInv = exp(1); - static const double kProb = 1.0 / kProbInv; - static const size_t kMaxSizeLimit = std::numeric_limits::max(); - - double sizeLimit = 1; - double p = lookupTable_[0] = (1 - kProb); - sizeLimitTable_[0] = 1; - for (int i = 1; i < kMaxHeight - 1; ++i) { - p *= kProb; - sizeLimit *= kProbInv; - lookupTable_[i] = lookupTable_[i - 1] + p; - sizeLimitTable_[i] = sizeLimit > kMaxSizeLimit - ? kMaxSizeLimit - : static_cast(sizeLimit); - } - lookupTable_[kMaxHeight - 1] = 1; - sizeLimitTable_[kMaxHeight - 1] = kMaxSizeLimit; - } - - static double randomProb() { - static ThreadLocal rng_; - return (*rng_)(); - } - - double lookupTable_[kMaxHeight]; - size_t sizeLimitTable_[kMaxHeight]; -}; - -template -class NodeRecycler; - -template -class NodeRecycler< - NodeType, - NodeAlloc, - typename std::enable_if< - !NodeType::template DestroyIsNoOp::value>::type> { - public: - explicit NodeRecycler(const NodeAlloc& alloc) - : refs_(0), dirty_(false), alloc_(alloc) { - lock_.init(); - } - - explicit NodeRecycler() : refs_(0), dirty_(false) { - lock_.init(); - } - - ~NodeRecycler() { - CHECK_EQ(refs(), 0); - if (nodes_) { - for (auto& node : *nodes_) { - NodeType::destroy(alloc_, node); - } - } - } - - void add(NodeType* node) { - std::lock_guard g(lock_); - if (nodes_.get() == nullptr) { - nodes_ = std::make_unique>(1, node); - } else { - nodes_->push_back(node); - } - DCHECK_GT(refs(), 0); - dirty_.store(true, std::memory_order_relaxed); - } - - int addRef() { - return refs_.fetch_add(1, std::memory_order_relaxed); - } - - int releaseRef() { - // We don't expect to clean the recycler immediately everytime it is OK - // to do so. Here, it is possible that multiple accessors all release at - // the same time but nobody would clean the recycler here. If this - // happens, the recycler will usually still get cleaned when - // such a race doesn't happen. The worst case is the recycler will - // eventually get deleted along with the skiplist. - if (LIKELY(!dirty_.load(std::memory_order_relaxed) || refs() > 1)) { - return refs_.fetch_add(-1, std::memory_order_relaxed); - } - - std::unique_ptr> newNodes; - { - std::lock_guard g(lock_); - if (nodes_.get() == nullptr || refs() > 1) { - return refs_.fetch_add(-1, std::memory_order_relaxed); - } - // once refs_ reaches 1 and there is no other accessor, it is safe to - // remove all the current nodes in the recycler, as we already acquired - // the lock here so no more new nodes can be added, even though new - // accessors may be added after that. - newNodes.swap(nodes_); - dirty_.store(false, std::memory_order_relaxed); - } - - // TODO(xliu) should we spawn a thread to do this when there are large - // number of nodes in the recycler? - for (auto& node : *newNodes) { - NodeType::destroy(alloc_, node); - } - - // decrease the ref count at the very end, to minimize the - // chance of other threads acquiring lock_ to clear the deleted - // nodes again. - return refs_.fetch_add(-1, std::memory_order_relaxed); - } - - NodeAlloc& alloc() { - return alloc_; - } - - private: - int refs() const { - return refs_.load(std::memory_order_relaxed); - } - - std::unique_ptr> nodes_; - std::atomic refs_; // current number of visitors to the list - std::atomic dirty_; // whether *nodes_ is non-empty - MicroSpinLock lock_; // protects access to *nodes_ - NodeAlloc alloc_; -}; - -// In case of arena allocator, no recycling is necessary, and it's possible -// to save on ConcurrentSkipList size. -template -class NodeRecycler< - NodeType, - NodeAlloc, - typename std::enable_if< - NodeType::template DestroyIsNoOp::value>::type> { - public: - explicit NodeRecycler(const NodeAlloc& alloc) : alloc_(alloc) {} - - void addRef() {} - void releaseRef() {} - - void add(NodeType* /* node */) {} - - NodeAlloc& alloc() { - return alloc_; - } - - private: - NodeAlloc alloc_; -}; - -} // namespace detail -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/ConcurrentSkipList.h b/ios/Pods/Flipper-Folly/folly/ConcurrentSkipList.h deleted file mode 100644 index ab75ce3..0000000 --- a/ios/Pods/Flipper-Folly/folly/ConcurrentSkipList.h +++ /dev/null @@ -1,878 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// @author: Xin Liu -// -// A concurrent skip list (CSL) implementation. -// Ref: http://www.cs.tau.ac.il/~shanir/nir-pubs-web/Papers/OPODIS2006-BA.pdf - -/* - -This implements a sorted associative container that supports only -unique keys. (Similar to std::set.) - -Features: - - 1. Small memory overhead: ~40% less memory overhead compared with - std::set (1.6 words per node versus 3). It has an minimum of 4 - words (7 words if there nodes got deleted) per-list overhead - though. - - 2. Read accesses (count, find iterator, skipper) are lock-free and - mostly wait-free (the only wait a reader may need to do is when - the node it is visiting is in a pending stage, i.e. deleting, - adding and not fully linked). Write accesses (remove, add) need - to acquire locks, but locks are local to the predecessor nodes - and/or successor nodes. - - 3. Good high contention performance, comparable single-thread - performance. In the multithreaded case (12 workers), CSL tested - 10x faster than a RWSpinLocked std::set for an averaged sized - list (1K - 1M nodes). - - Comparable read performance to std::set when single threaded, - especially when the list size is large, and scales better to - larger lists: when the size is small, CSL can be 20-50% slower on - find()/contains(). As the size gets large (> 1M elements), - find()/contains() can be 30% faster. - - Iterating through a skiplist is similar to iterating through a - linked list, thus is much (2-6x) faster than on a std::set - (tree-based). This is especially true for short lists due to - better cache locality. Based on that, it's also faster to - intersect two skiplists. - - 4. Lazy removal with GC support. The removed nodes get deleted when - the last Accessor to the skiplist is destroyed. - -Caveats: - - 1. Write operations are usually 30% slower than std::set in a single - threaded environment. - - 2. Need to have a head node for each list, which has a 4 word - overhead. - - 3. When the list is quite small (< 1000 elements), single threaded - benchmarks show CSL can be 10x slower than std:set. - - 4. The interface requires using an Accessor to access the skiplist. - (See below.) - - 5. Currently x64 only, due to use of MicroSpinLock. - - 6. Freed nodes will not be reclaimed as long as there are ongoing - uses of the list. - -Sample usage: - - typedef ConcurrentSkipList SkipListT; - shared_ptr sl(SkipListT::createInstance(init_head_height); - { - // It's usually good practice to hold an accessor only during - // its necessary life cycle (but not in a tight loop as - // Accessor creation incurs ref-counting overhead). - // - // Holding it longer delays garbage-collecting the deleted - // nodes in the list. - SkipListT::Accessor accessor(sl); - accessor.insert(23); - accessor.erase(2); - for (auto &elem : accessor) { - // use elem to access data - } - ... ... - } - - Another useful type is the Skipper accessor. This is useful if you - want to skip to locations in the way std::lower_bound() works, - i.e. it can be used for going through the list by skipping to the - node no less than a specified key. The Skipper keeps its location as - state, which makes it convenient for things like implementing - intersection of two sets efficiently, as it can start from the last - visited position. - - { - SkipListT::Accessor accessor(sl); - SkipListT::Skipper skipper(accessor); - skipper.to(30); - if (skipper) { - CHECK_LE(30, *skipper); - } - ... ... - // GC may happen when the accessor gets destructed. - } -*/ - -#pragma once - -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -namespace folly { - -template < - typename T, - typename Comp = std::less, - // All nodes are allocated using provided SysAllocator, - // it should be thread-safe. - typename NodeAlloc = SysAllocator, - int MAX_HEIGHT = 24> -class ConcurrentSkipList { - // MAX_HEIGHT needs to be at least 2 to suppress compiler - // warnings/errors (Werror=uninitialized tiggered due to preds_[1] - // being treated as a scalar in the compiler). - static_assert( - MAX_HEIGHT >= 2 && MAX_HEIGHT < 64, - "MAX_HEIGHT can only be in the range of [2, 64)"); - typedef std::unique_lock ScopedLocker; - typedef ConcurrentSkipList SkipListType; - - public: - typedef detail::SkipListNode NodeType; - typedef T value_type; - typedef T key_type; - - typedef detail::csl_iterator iterator; - typedef detail::csl_iterator const_iterator; - - class Accessor; - class Skipper; - - explicit ConcurrentSkipList(int height, const NodeAlloc& alloc) - : recycler_(alloc), - head_(NodeType::create(recycler_.alloc(), height, value_type(), true)), - size_(0) {} - - explicit ConcurrentSkipList(int height) - : recycler_(), - head_(NodeType::create(recycler_.alloc(), height, value_type(), true)), - size_(0) {} - - // Convenient function to get an Accessor to a new instance. - static Accessor create(int height, const NodeAlloc& alloc) { - return Accessor(createInstance(height, alloc)); - } - - static Accessor create(int height = 1) { - return Accessor(createInstance(height)); - } - - // Create a shared_ptr skiplist object with initial head height. - static std::shared_ptr createInstance( - int height, - const NodeAlloc& alloc) { - return std::make_shared(height, alloc); - } - - static std::shared_ptr createInstance(int height = 1) { - return std::make_shared(height); - } - - //=================================================================== - // Below are implementation details. - // Please see ConcurrentSkipList::Accessor for stdlib-like APIs. - //=================================================================== - - ~ConcurrentSkipList() { - if /* constexpr */ (NodeType::template DestroyIsNoOp::value) { - // Avoid traversing the list if using arena allocator. - return; - } - for (NodeType* current = head_.load(std::memory_order_relaxed); current;) { - NodeType* tmp = current->skip(0); - NodeType::destroy(recycler_.alloc(), current); - current = tmp; - } - } - - private: - static bool greater(const value_type& data, const NodeType* node) { - return node && Comp()(node->data(), data); - } - - static bool less(const value_type& data, const NodeType* node) { - return (node == nullptr) || Comp()(data, node->data()); - } - - static int findInsertionPoint( - NodeType* cur, - int cur_layer, - const value_type& data, - NodeType* preds[], - NodeType* succs[]) { - int foundLayer = -1; - NodeType* pred = cur; - NodeType* foundNode = nullptr; - for (int layer = cur_layer; layer >= 0; --layer) { - NodeType* node = pred->skip(layer); - while (greater(data, node)) { - pred = node; - node = node->skip(layer); - } - if (foundLayer == -1 && !less(data, node)) { // the two keys equal - foundLayer = layer; - foundNode = node; - } - preds[layer] = pred; - - // if found, succs[0..foundLayer] need to point to the cached foundNode, - // as foundNode might be deleted at the same time thus pred->skip() can - // return nullptr or another node. - succs[layer] = foundNode ? foundNode : node; - } - return foundLayer; - } - - size_t size() const { - return size_.load(std::memory_order_relaxed); - } - - int height() const { - return head_.load(std::memory_order_consume)->height(); - } - - int maxLayer() const { - return height() - 1; - } - - size_t incrementSize(int delta) { - return size_.fetch_add(delta, std::memory_order_relaxed) + delta; - } - - // Returns the node if found, nullptr otherwise. - NodeType* find(const value_type& data) { - auto ret = findNode(data); - if (ret.second && !ret.first->markedForRemoval()) { - return ret.first; - } - return nullptr; - } - - // lock all the necessary nodes for changing (adding or removing) the list. - // returns true if all the lock acquried successfully and the related nodes - // are all validate (not in certain pending states), false otherwise. - bool lockNodesForChange( - int nodeHeight, - ScopedLocker guards[MAX_HEIGHT], - NodeType* preds[MAX_HEIGHT], - NodeType* succs[MAX_HEIGHT], - bool adding = true) { - NodeType *pred, *succ, *prevPred = nullptr; - bool valid = true; - for (int layer = 0; valid && layer < nodeHeight; ++layer) { - pred = preds[layer]; - DCHECK(pred != nullptr) << "layer=" << layer << " height=" << height() - << " nodeheight=" << nodeHeight; - succ = succs[layer]; - if (pred != prevPred) { - guards[layer] = pred->acquireGuard(); - prevPred = pred; - } - valid = !pred->markedForRemoval() && - pred->skip(layer) == succ; // check again after locking - - if (adding) { // when adding a node, the succ shouldn't be going away - valid = valid && (succ == nullptr || !succ->markedForRemoval()); - } - } - - return valid; - } - - // Returns a paired value: - // pair.first always stores the pointer to the node with the same input key. - // It could be either the newly added data, or the existed data in the - // list with the same key. - // pair.second stores whether the data is added successfully: - // 0 means not added, otherwise reutrns the new size. - template - std::pair addOrGetData(U&& data) { - NodeType *preds[MAX_HEIGHT], *succs[MAX_HEIGHT]; - NodeType* newNode; - size_t newSize; - while (true) { - int max_layer = 0; - int layer = findInsertionPointGetMaxLayer(data, preds, succs, &max_layer); - - if (layer >= 0) { - NodeType* nodeFound = succs[layer]; - DCHECK(nodeFound != nullptr); - if (nodeFound->markedForRemoval()) { - continue; // if it's getting deleted retry finding node. - } - // wait until fully linked. - while (UNLIKELY(!nodeFound->fullyLinked())) { - } - return std::make_pair(nodeFound, 0); - } - - // need to capped at the original height -- the real height may have grown - int nodeHeight = - detail::SkipListRandomHeight::instance()->getHeight(max_layer + 1); - - ScopedLocker guards[MAX_HEIGHT]; - if (!lockNodesForChange(nodeHeight, guards, preds, succs)) { - continue; // give up the locks and retry until all valid - } - - // locks acquired and all valid, need to modify the links under the locks. - newNode = NodeType::create( - recycler_.alloc(), nodeHeight, std::forward(data)); - for (int k = 0; k < nodeHeight; ++k) { - newNode->setSkip(k, succs[k]); - preds[k]->setSkip(k, newNode); - } - - newNode->setFullyLinked(); - newSize = incrementSize(1); - break; - } - - int hgt = height(); - size_t sizeLimit = - detail::SkipListRandomHeight::instance()->getSizeLimit(hgt); - - if (hgt < MAX_HEIGHT && newSize > sizeLimit) { - growHeight(hgt + 1); - } - CHECK_GT(newSize, 0); - return std::make_pair(newNode, newSize); - } - - bool remove(const value_type& data) { - NodeType* nodeToDelete = nullptr; - ScopedLocker nodeGuard; - bool isMarked = false; - int nodeHeight = 0; - NodeType *preds[MAX_HEIGHT], *succs[MAX_HEIGHT]; - - while (true) { - int max_layer = 0; - int layer = findInsertionPointGetMaxLayer(data, preds, succs, &max_layer); - if (!isMarked && (layer < 0 || !okToDelete(succs[layer], layer))) { - return false; - } - - if (!isMarked) { - nodeToDelete = succs[layer]; - nodeHeight = nodeToDelete->height(); - nodeGuard = nodeToDelete->acquireGuard(); - if (nodeToDelete->markedForRemoval()) { - return false; - } - nodeToDelete->setMarkedForRemoval(); - isMarked = true; - } - - // acquire pred locks from bottom layer up - ScopedLocker guards[MAX_HEIGHT]; - if (!lockNodesForChange(nodeHeight, guards, preds, succs, false)) { - continue; // this will unlock all the locks - } - - for (int k = nodeHeight - 1; k >= 0; --k) { - preds[k]->setSkip(k, nodeToDelete->skip(k)); - } - - incrementSize(-1); - break; - } - recycle(nodeToDelete); - return true; - } - - const value_type* first() const { - auto node = head_.load(std::memory_order_consume)->skip(0); - return node ? &node->data() : nullptr; - } - - const value_type* last() const { - NodeType* pred = head_.load(std::memory_order_consume); - NodeType* node = nullptr; - for (int layer = maxLayer(); layer >= 0; --layer) { - do { - node = pred->skip(layer); - if (node) { - pred = node; - } - } while (node != nullptr); - } - return pred == head_.load(std::memory_order_relaxed) ? nullptr - : &pred->data(); - } - - static bool okToDelete(NodeType* candidate, int layer) { - DCHECK(candidate != nullptr); - return candidate->fullyLinked() && candidate->maxLayer() == layer && - !candidate->markedForRemoval(); - } - - // find node for insertion/deleting - int findInsertionPointGetMaxLayer( - const value_type& data, - NodeType* preds[], - NodeType* succs[], - int* max_layer) const { - *max_layer = maxLayer(); - return findInsertionPoint( - head_.load(std::memory_order_consume), *max_layer, data, preds, succs); - } - - // Find node for access. Returns a paired values: - // pair.first = the first node that no-less than data value - // pair.second = 1 when the data value is founded, or 0 otherwise. - // This is like lower_bound, but not exact: we could have the node marked for - // removal so still need to check that. - std::pair findNode(const value_type& data) const { - return findNodeDownRight(data); - } - - // Find node by first stepping down then stepping right. Based on benchmark - // results, this is slightly faster than findNodeRightDown for better - // localality on the skipping pointers. - std::pair findNodeDownRight(const value_type& data) const { - NodeType* pred = head_.load(std::memory_order_consume); - int ht = pred->height(); - NodeType* node = nullptr; - - bool found = false; - while (!found) { - // stepping down - for (; ht > 0 && less(data, node = pred->skip(ht - 1)); --ht) { - } - if (ht == 0) { - return std::make_pair(node, 0); // not found - } - // node <= data now, but we need to fix up ht - --ht; - - // stepping right - while (greater(data, node)) { - pred = node; - node = node->skip(ht); - } - found = !less(data, node); - } - return std::make_pair(node, found); - } - - // find node by first stepping right then stepping down. - // We still keep this for reference purposes. - std::pair findNodeRightDown(const value_type& data) const { - NodeType* pred = head_.load(std::memory_order_consume); - NodeType* node = nullptr; - auto top = maxLayer(); - int found = 0; - for (int layer = top; !found && layer >= 0; --layer) { - node = pred->skip(layer); - while (greater(data, node)) { - pred = node; - node = node->skip(layer); - } - found = !less(data, node); - } - return std::make_pair(node, found); - } - - NodeType* lower_bound(const value_type& data) const { - auto node = findNode(data).first; - while (node != nullptr && node->markedForRemoval()) { - node = node->skip(0); - } - return node; - } - - void growHeight(int height) { - NodeType* oldHead = head_.load(std::memory_order_consume); - if (oldHead->height() >= height) { // someone else already did this - return; - } - - NodeType* newHead = - NodeType::create(recycler_.alloc(), height, value_type(), true); - - { // need to guard the head node in case others are adding/removing - // nodes linked to the head. - ScopedLocker g = oldHead->acquireGuard(); - newHead->copyHead(oldHead); - NodeType* expected = oldHead; - if (!head_.compare_exchange_strong( - expected, newHead, std::memory_order_release)) { - // if someone has already done the swap, just return. - NodeType::destroy(recycler_.alloc(), newHead); - return; - } - oldHead->setMarkedForRemoval(); - } - recycle(oldHead); - } - - void recycle(NodeType* node) { - recycler_.add(node); - } - - detail::NodeRecycler recycler_; - std::atomic head_; - std::atomic size_; -}; - -template -class ConcurrentSkipList::Accessor { - typedef detail::SkipListNode NodeType; - typedef ConcurrentSkipList SkipListType; - - public: - typedef T value_type; - typedef T key_type; - typedef T& reference; - typedef T* pointer; - typedef const T& const_reference; - typedef const T* const_pointer; - typedef size_t size_type; - typedef Comp key_compare; - typedef Comp value_compare; - - typedef typename SkipListType::iterator iterator; - typedef typename SkipListType::const_iterator const_iterator; - typedef typename SkipListType::Skipper Skipper; - - explicit Accessor(std::shared_ptr skip_list) - : slHolder_(std::move(skip_list)) { - sl_ = slHolder_.get(); - DCHECK(sl_ != nullptr); - sl_->recycler_.addRef(); - } - - // Unsafe initializer: the caller assumes the responsibility to keep - // skip_list valid during the whole life cycle of the Acessor. - explicit Accessor(ConcurrentSkipList* skip_list) : sl_(skip_list) { - DCHECK(sl_ != nullptr); - sl_->recycler_.addRef(); - } - - Accessor(const Accessor& accessor) - : sl_(accessor.sl_), slHolder_(accessor.slHolder_) { - sl_->recycler_.addRef(); - } - - Accessor& operator=(const Accessor& accessor) { - if (this != &accessor) { - slHolder_ = accessor.slHolder_; - sl_->recycler_.releaseRef(); - sl_ = accessor.sl_; - sl_->recycler_.addRef(); - } - return *this; - } - - ~Accessor() { - sl_->recycler_.releaseRef(); - } - - bool empty() const { - return sl_->size() == 0; - } - size_t size() const { - return sl_->size(); - } - size_type max_size() const { - return std::numeric_limits::max(); - } - - // returns end() if the value is not in the list, otherwise returns an - // iterator pointing to the data, and it's guaranteed that the data is valid - // as far as the Accessor is hold. - iterator find(const key_type& value) { - return iterator(sl_->find(value)); - } - const_iterator find(const key_type& value) const { - return iterator(sl_->find(value)); - } - size_type count(const key_type& data) const { - return contains(data); - } - - iterator begin() const { - NodeType* head = sl_->head_.load(std::memory_order_consume); - return iterator(head->next()); - } - iterator end() const { - return iterator(nullptr); - } - const_iterator cbegin() const { - return begin(); - } - const_iterator cend() const { - return end(); - } - - template < - typename U, - typename = - typename std::enable_if::value>::type> - std::pair insert(U&& data) { - auto ret = sl_->addOrGetData(std::forward(data)); - return std::make_pair(iterator(ret.first), ret.second); - } - size_t erase(const key_type& data) { - return remove(data); - } - - iterator lower_bound(const key_type& data) const { - return iterator(sl_->lower_bound(data)); - } - - size_t height() const { - return sl_->height(); - } - - // first() returns pointer to the first element in the skiplist, or - // nullptr if empty. - // - // last() returns the pointer to the last element in the skiplist, - // nullptr if list is empty. - // - // Note: As concurrent writing can happen, first() is not - // guaranteed to be the min_element() in the list. Similarly - // last() is not guaranteed to be the max_element(), and both of them can - // be invalid (i.e. nullptr), so we name them differently from front() and - // tail() here. - const key_type* first() const { - return sl_->first(); - } - const key_type* last() const { - return sl_->last(); - } - - // Try to remove the last element in the skip list. - // - // Returns true if we removed it, false if either the list is empty - // or a race condition happened (i.e. the used-to-be last element - // was already removed by another thread). - bool pop_back() { - auto last = sl_->last(); - return last ? sl_->remove(*last) : false; - } - - std::pair addOrGetData(const key_type& data) { - auto ret = sl_->addOrGetData(data); - return std::make_pair(&ret.first->data(), ret.second); - } - - SkipListType* skiplist() const { - return sl_; - } - - // legacy interfaces - // TODO:(xliu) remove these. - // Returns true if the node is added successfully, false if not, i.e. the - // node with the same key already existed in the list. - bool contains(const key_type& data) const { - return sl_->find(data); - } - bool add(const key_type& data) { - return sl_->addOrGetData(data).second; - } - bool remove(const key_type& data) { - return sl_->remove(data); - } - - private: - SkipListType* sl_; - std::shared_ptr slHolder_; -}; - -// implements forward iterator concept. -template -class detail::csl_iterator : public detail::IteratorFacade< - csl_iterator, - ValT, - std::forward_iterator_tag> { - public: - typedef ValT value_type; - typedef value_type& reference; - typedef value_type* pointer; - typedef ptrdiff_t difference_type; - - explicit csl_iterator(NodeT* node = nullptr) : node_(node) {} - - template - csl_iterator( - const csl_iterator& other, - typename std::enable_if< - std::is_convertible::value>::type* = nullptr) - : node_(other.node_) {} - - size_t nodeSize() const { - return node_ == nullptr ? 0 - : node_->height() * sizeof(NodeT*) + sizeof(*this); - } - - bool good() const { - return node_ != nullptr; - } - - private: - template - friend class csl_iterator; - friend class detail:: - IteratorFacade; - - void increment() { - node_ = node_->next(); - } - bool equal(const csl_iterator& other) const { - return node_ == other.node_; - } - value_type& dereference() const { - return node_->data(); - } - - NodeT* node_; -}; - -// Skipper interface -template -class ConcurrentSkipList::Skipper { - typedef detail::SkipListNode NodeType; - typedef ConcurrentSkipList SkipListType; - typedef typename SkipListType::Accessor Accessor; - - public: - typedef T value_type; - typedef T& reference; - typedef T* pointer; - typedef ptrdiff_t difference_type; - - Skipper(const std::shared_ptr& skipList) : accessor_(skipList) { - init(); - } - - Skipper(const Accessor& accessor) : accessor_(accessor) { - init(); - } - - void init() { - // need to cache the head node - NodeType* head_node = head(); - headHeight_ = head_node->height(); - for (int i = 0; i < headHeight_; ++i) { - preds_[i] = head_node; - succs_[i] = head_node->skip(i); - } - int max_layer = maxLayer(); - for (int i = 0; i < max_layer; ++i) { - hints_[i] = uint8_t(i + 1); - } - hints_[max_layer] = max_layer; - } - - // advance to the next node in the list. - Skipper& operator++() { - preds_[0] = succs_[0]; - succs_[0] = preds_[0]->skip(0); - int height = curHeight(); - for (int i = 1; i < height && preds_[0] == succs_[i]; ++i) { - preds_[i] = succs_[i]; - succs_[i] = preds_[i]->skip(i); - } - return *this; - } - - bool good() const { - return succs_[0] != nullptr; - } - - int maxLayer() const { - return headHeight_ - 1; - } - - int curHeight() const { - // need to cap the height to the cached head height, as the current node - // might be some newly inserted node and also during the time period the - // head height may have grown. - return succs_[0] ? std::min(headHeight_, succs_[0]->height()) : 0; - } - - const value_type& data() const { - DCHECK(succs_[0] != nullptr); - return succs_[0]->data(); - } - - value_type& operator*() const { - DCHECK(succs_[0] != nullptr); - return succs_[0]->data(); - } - - value_type* operator->() { - DCHECK(succs_[0] != nullptr); - return &succs_[0]->data(); - } - - /* - * Skip to the position whose data is no less than the parameter. - * (I.e. the lower_bound). - * - * Returns true if the data is found, false otherwise. - */ - bool to(const value_type& data) { - int layer = curHeight() - 1; - if (layer < 0) { - return false; // reaches the end of the list - } - - int lyr = hints_[layer]; - int max_layer = maxLayer(); - while (SkipListType::greater(data, succs_[lyr]) && lyr < max_layer) { - ++lyr; - } - hints_[layer] = lyr; // update the hint - - int foundLayer = SkipListType::findInsertionPoint( - preds_[lyr], lyr, data, preds_, succs_); - if (foundLayer < 0) { - return false; - } - - DCHECK(succs_[0] != nullptr) - << "lyr=" << lyr << "; max_layer=" << max_layer; - return !succs_[0]->markedForRemoval(); - } - - private: - NodeType* head() const { - return accessor_.skiplist()->head_.load(std::memory_order_consume); - } - - Accessor accessor_; - int headHeight_; - NodeType *succs_[MAX_HEIGHT], *preds_[MAX_HEIGHT]; - uint8_t hints_[MAX_HEIGHT]; -}; - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/ConstexprMath.h b/ios/Pods/Flipper-Folly/folly/ConstexprMath.h deleted file mode 100644 index 4a70ff6..0000000 --- a/ios/Pods/Flipper-Folly/folly/ConstexprMath.h +++ /dev/null @@ -1,383 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include -#include -#include - -namespace folly { -// TLDR: Prefer using operator< for ordering. And when -// a and b are equivalent objects, we return b to make -// sorting stable. -// See http://stepanovpapers.com/notes.pdf for details. -template -constexpr T constexpr_max(T a) { - return a; -} -template -constexpr T constexpr_max(T a, T b, Ts... ts) { - return b < a ? constexpr_max(a, ts...) : constexpr_max(b, ts...); -} - -// When a and b are equivalent objects, we return a to -// make sorting stable. -template -constexpr T constexpr_min(T a) { - return a; -} -template -constexpr T constexpr_min(T a, T b, Ts... ts) { - return b < a ? constexpr_min(b, ts...) : constexpr_min(a, ts...); -} - -template -constexpr T const& -constexpr_clamp(T const& v, T const& lo, T const& hi, Less less) { - return less(v, lo) ? lo : less(hi, v) ? hi : v; -} -template -constexpr T const& constexpr_clamp(T const& v, T const& lo, T const& hi) { - return constexpr_clamp(v, lo, hi, std::less{}); -} - -namespace detail { - -template -struct constexpr_abs_helper {}; - -template -struct constexpr_abs_helper< - T, - typename std::enable_if::value>::type> { - static constexpr T go(T t) { - return t < static_cast(0) ? -t : t; - } -}; - -template -struct constexpr_abs_helper< - T, - typename std::enable_if< - std::is_integral::value && !std::is_same::value && - std::is_unsigned::value>::type> { - static constexpr T go(T t) { - return t; - } -}; - -template -struct constexpr_abs_helper< - T, - typename std::enable_if< - std::is_integral::value && !std::is_same::value && - std::is_signed::value>::type> { - static constexpr typename std::make_unsigned::type go(T t) { - return typename std::make_unsigned::type(t < static_cast(0) ? -t : t); - } -}; -} // namespace detail - -template -constexpr auto constexpr_abs(T t) - -> decltype(detail::constexpr_abs_helper::go(t)) { - return detail::constexpr_abs_helper::go(t); -} - -namespace detail { -template -constexpr T constexpr_log2_(T a, T e) { - return e == T(1) ? a : constexpr_log2_(a + T(1), e / T(2)); -} - -template -constexpr T constexpr_log2_ceil_(T l2, T t) { - return l2 + T(T(1) << l2 < t ? 1 : 0); -} - -template -constexpr T constexpr_square_(T t) { - return t * t; -} -} // namespace detail - -template -constexpr T constexpr_log2(T t) { - return detail::constexpr_log2_(T(0), t); -} - -template -constexpr T constexpr_log2_ceil(T t) { - return detail::constexpr_log2_ceil_(constexpr_log2(t), t); -} - -template -constexpr T constexpr_ceil(T t, T round) { - return round == T(0) - ? t - : ((t + (t < T(0) ? T(0) : round - T(1))) / round) * round; -} - -template -constexpr T constexpr_pow(T base, std::size_t exp) { - return exp == 0 - ? T(1) - : exp == 1 ? base - : detail::constexpr_square_(constexpr_pow(base, exp / 2)) * - (exp % 2 ? base : T(1)); -} - -/// constexpr_find_last_set -/// -/// Return the 1-based index of the most significant bit which is set. -/// For x > 0, constexpr_find_last_set(x) == 1 + floor(log2(x)). -template -constexpr std::size_t constexpr_find_last_set(T const t) { - using U = std::make_unsigned_t; - return t == T(0) ? 0 : 1 + constexpr_log2(static_cast(t)); -} - -namespace detail { -template -constexpr std::size_t -constexpr_find_first_set_(std::size_t s, std::size_t a, U const u) { - return s == 0 ? a - : constexpr_find_first_set_( - s / 2, a + s * bool((u >> a) % (U(1) << s) == U(0)), u); -} -} // namespace detail - -/// constexpr_find_first_set -/// -/// Return the 1-based index of the least significant bit which is set. -/// For x > 0, the exponent in the largest power of two which does not divide x. -template -constexpr std::size_t constexpr_find_first_set(T t) { - using U = std::make_unsigned_t; - using size = std::integral_constant; - return t == T(0) - ? 0 - : 1 + detail::constexpr_find_first_set_(size{}, 0, static_cast(t)); -} - -template -constexpr T constexpr_add_overflow_clamped(T a, T b) { - using L = std::numeric_limits; - using M = std::intmax_t; - static_assert( - !std::is_integral::value || sizeof(T) <= sizeof(M), - "Integral type too large!"); - // clang-format off - return - // don't do anything special for non-integral types. - !std::is_integral::value ? a + b : - // for narrow integral types, just convert to intmax_t. - sizeof(T) < sizeof(M) - ? T(constexpr_clamp(M(a) + M(b), M(L::min()), M(L::max()))) : - // when a >= 0, cannot add more than `MAX - a` onto a. - !(a < 0) ? a + constexpr_min(b, T(L::max() - a)) : - // a < 0 && b >= 0, `a + b` will always be in valid range of type T. - !(b < 0) ? a + b : - // a < 0 && b < 0, keep the result >= MIN. - a + constexpr_max(b, T(L::min() - a)); - // clang-format on -} - -template -constexpr T constexpr_sub_overflow_clamped(T a, T b) { - using L = std::numeric_limits; - using M = std::intmax_t; - static_assert( - !std::is_integral::value || sizeof(T) <= sizeof(M), - "Integral type too large!"); - // clang-format off - return - // don't do anything special for non-integral types. - !std::is_integral::value ? a - b : - // for unsigned type, keep result >= 0. - std::is_unsigned::value ? (a < b ? 0 : a - b) : - // for narrow signed integral types, just convert to intmax_t. - sizeof(T) < sizeof(M) - ? T(constexpr_clamp(M(a) - M(b), M(L::min()), M(L::max()))) : - // (a >= 0 && b >= 0) || (a < 0 && b < 0), `a - b` will always be valid. - (a < 0) == (b < 0) ? a - b : - // MIN < b, so `-b` should be in valid range (-MAX <= -b <= MAX), - // convert subtraction to addition. - L::min() < b ? constexpr_add_overflow_clamped(a, T(-b)) : - // -b = -MIN = (MAX + 1) and a <= -1, result is in valid range. - a < 0 ? a - b : - // -b = -MIN = (MAX + 1) and a >= 0, result > MAX. - L::max(); - // clang-format on -} - -// clamp_cast<> provides sane numeric conversions from float point numbers to -// integral numbers, and between different types of integral numbers. It helps -// to avoid unexpected bugs introduced by bad conversion, and undefined behavior -// like overflow when casting float point numbers to integral numbers. -// -// When doing clamp_cast(value), if `value` is in valid range of Dst, -// it will give correct result in Dst, equal to `value`. -// -// If `value` is outside the representable range of Dst, it will be clamped to -// MAX or MIN in Dst, instead of being undefined behavior. -// -// Float NaNs are converted to 0 in integral type. -// -// Here's some comparision with static_cast<>: -// (with FB-internal gcc-5-glibc-2.23 toolchain) -// -// static_cast(NaN) = 6 -// clamp_cast(NaN) = 0 -// -// static_cast(9999999999.0f) = -348639895 -// clamp_cast(9999999999.0f) = 2147483647 -// -// static_cast(2147483647.0f) = -348639895 -// clamp_cast(2147483647.0f) = 2147483647 -// -// static_cast(4294967295.0f) = 0 -// clamp_cast(4294967295.0f) = 4294967295 -// -// static_cast(-1) = 4294967295 -// clamp_cast(-1) = 0 -// -// static_cast(32768u) = -32768 -// clamp_cast(32768u) = 32767 - -template -constexpr typename std::enable_if::value, Dst>::type -constexpr_clamp_cast(Src src) { - static_assert( - std::is_integral::value && sizeof(Dst) <= sizeof(int64_t), - "constexpr_clamp_cast can only cast into integral type (up to 64bit)"); - - using L = std::numeric_limits; - // clang-format off - return - // Check if Src and Dst have same signedness. - std::is_signed::value == std::is_signed::value - ? ( - // Src and Dst have same signedness. If sizeof(Src) <= sizeof(Dst), - // we can safely convert Src to Dst without any loss of accuracy. - sizeof(Src) <= sizeof(Dst) ? Dst(src) : - // If Src is larger in size, we need to clamp it to valid range in Dst. - Dst(constexpr_clamp(src, Src(L::min()), Src(L::max())))) - // Src and Dst have different signedness. - // Check if it's signed -> unsigend cast. - : std::is_signed::value && std::is_unsigned::value - ? ( - // If src < 0, the result should be 0. - src < 0 ? Dst(0) : - // Otherwise, src >= 0. If src can fit into Dst, we can safely cast it - // without loss of accuracy. - sizeof(Src) <= sizeof(Dst) ? Dst(src) : - // If Src is larger in size than Dst, we need to ensure the result is - // at most Dst MAX. - Dst(constexpr_min(src, Src(L::max())))) - // It's unsigned -> signed cast. - : ( - // Since Src is unsigned, and Dst is signed, Src can fit into Dst only - // when sizeof(Src) < sizeof(Dst). - sizeof(Src) < sizeof(Dst) ? Dst(src) : - // If Src does not fit into Dst, we need to ensure the result is at most - // Dst MAX. - Dst(constexpr_min(src, Src(L::max())))); - // clang-format on -} - -namespace detail { -// Upper/lower bound values that could be accurately represented in both -// integral and float point types. -constexpr double kClampCastLowerBoundDoubleToInt64F = -9223372036854774784.0; -constexpr double kClampCastUpperBoundDoubleToInt64F = 9223372036854774784.0; -constexpr double kClampCastUpperBoundDoubleToUInt64F = 18446744073709549568.0; - -constexpr float kClampCastLowerBoundFloatToInt32F = -2147483520.0f; -constexpr float kClampCastUpperBoundFloatToInt32F = 2147483520.0f; -constexpr float kClampCastUpperBoundFloatToUInt32F = 4294967040.0f; - -// This works the same as constexpr_clamp, but the comparision are done in Src -// to prevent any implicit promotions. -template -constexpr D constexpr_clamp_cast_helper(S src, S sl, S su, D dl, D du) { - return src < sl ? dl : (src > su ? du : D(src)); -} -} // namespace detail - -template -constexpr typename std::enable_if::value, Dst>::type -constexpr_clamp_cast(Src src) { - static_assert( - std::is_integral::value && sizeof(Dst) <= sizeof(int64_t), - "constexpr_clamp_cast can only cast into integral type (up to 64bit)"); - - using L = std::numeric_limits; - // clang-format off - return - // Special case: cast NaN into 0. - // Using a trick here to portably check for NaN: f != f only if f is NaN. - // see: https://stackoverflow.com/a/570694 - (src != src) ? Dst(0) : - // using `sizeof(Src) > sizeof(Dst)` as a heuristic that Dst can be - // represented in Src without loss of accuracy. - // see: https://en.wikipedia.org/wiki/Floating-point_arithmetic - sizeof(Src) > sizeof(Dst) ? - detail::constexpr_clamp_cast_helper( - src, Src(L::min()), Src(L::max()), L::min(), L::max()) : - // sizeof(Src) < sizeof(Dst) only happens when doing cast of - // 32bit float -> u/int64_t. - // Losslessly promote float into double, change into double -> u/int64_t. - sizeof(Src) < sizeof(Dst) ? ( - src >= 0.0 - ? constexpr_clamp_cast( - constexpr_clamp_cast(double(src))) - : constexpr_clamp_cast( - constexpr_clamp_cast(double(src)))) : - // The following are for sizeof(Src) == sizeof(Dst). - std::is_same::value && std::is_same::value ? - detail::constexpr_clamp_cast_helper( - double(src), - detail::kClampCastLowerBoundDoubleToInt64F, - detail::kClampCastUpperBoundDoubleToInt64F, - L::min(), - L::max()) : - std::is_same::value && std::is_same::value ? - detail::constexpr_clamp_cast_helper( - double(src), - 0.0, - detail::kClampCastUpperBoundDoubleToUInt64F, - L::min(), - L::max()) : - std::is_same::value && std::is_same::value ? - detail::constexpr_clamp_cast_helper( - float(src), - detail::kClampCastLowerBoundFloatToInt32F, - detail::kClampCastUpperBoundFloatToInt32F, - L::min(), - L::max()) : - detail::constexpr_clamp_cast_helper( - float(src), - 0.0f, - detail::kClampCastUpperBoundFloatToUInt32F, - L::min(), - L::max()); - // clang-format on -} - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/Conv.cpp b/ios/Pods/Flipper-Folly/folly/Conv.cpp deleted file mode 100644 index b6aba93..0000000 --- a/ios/Pods/Flipper-Folly/folly/Conv.cpp +++ /dev/null @@ -1,797 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include -#include - -namespace folly { -namespace detail { - -namespace { - -/** - * Finds the first non-digit in a string. The number of digits - * searched depends on the precision of the Tgt integral. Assumes the - * string starts with NO whitespace and NO sign. - * - * The semantics of the routine is: - * for (;; ++b) { - * if (b >= e || !isdigit(*b)) return b; - * } - * - * Complete unrolling marks bottom-line (i.e. entire conversion) - * improvements of 20%. - */ -inline const char* findFirstNonDigit(const char* b, const char* e) { - for (; b < e; ++b) { - auto const c = static_cast(*b) - '0'; - if (c >= 10) { - break; - } - } - return b; -} - -// Maximum value of number when represented as a string -template -struct MaxString { - static const char* const value; -}; - -template <> -const char* const MaxString::value = "255"; -template <> -const char* const MaxString::value = "65535"; -template <> -const char* const MaxString::value = "4294967295"; -#if __SIZEOF_LONG__ == 4 -template <> -const char* const MaxString::value = "4294967295"; -#else -template <> -const char* const MaxString::value = "18446744073709551615"; -#endif -static_assert( - sizeof(unsigned long) >= 4, - "Wrong value for MaxString::value," - " please update."); -template <> -const char* const MaxString::value = "18446744073709551615"; -static_assert( - sizeof(unsigned long long) >= 8, - "Wrong value for MaxString::value" - ", please update."); - -#if FOLLY_HAVE_INT128_T -template <> -const char* const MaxString<__uint128_t>::value = - "340282366920938463463374607431768211455"; -#endif - -/* - * Lookup tables that converts from a decimal character value to an integral - * binary value, shifted by a decimal "shift" multiplier. - * For all character values in the range '0'..'9', the table at those - * index locations returns the actual decimal value shifted by the multiplier. - * For all other values, the lookup table returns an invalid OOR value. - */ -// Out-of-range flag value, larger than the largest value that can fit in -// four decimal bytes (9999), but four of these added up together should -// still not overflow uint16_t. -constexpr int32_t OOR = 10000; - -alignas(16) constexpr uint16_t shift1[] = { - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 0-9 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 10 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 20 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 30 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, 0, 1, // 40 - 2, 3, 4, 5, 6, 7, 8, 9, OOR, OOR, - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 60 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 70 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 80 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 90 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 100 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 110 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 120 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 130 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 140 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 150 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 160 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 170 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 180 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 190 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 200 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 210 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 220 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 230 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 240 - OOR, OOR, OOR, OOR, OOR, OOR // 250 -}; - -alignas(16) constexpr uint16_t shift10[] = { - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 0-9 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 10 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 20 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 30 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, 0, 10, // 40 - 20, 30, 40, 50, 60, 70, 80, 90, OOR, OOR, - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 60 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 70 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 80 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 90 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 100 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 110 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 120 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 130 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 140 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 150 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 160 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 170 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 180 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 190 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 200 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 210 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 220 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 230 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 240 - OOR, OOR, OOR, OOR, OOR, OOR // 250 -}; - -alignas(16) constexpr uint16_t shift100[] = { - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 0-9 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 10 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 20 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 30 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, 0, 100, // 40 - 200, 300, 400, 500, 600, 700, 800, 900, OOR, OOR, - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 60 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 70 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 80 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 90 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 100 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 110 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 120 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 130 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 140 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 150 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 160 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 170 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 180 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 190 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 200 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 210 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 220 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 230 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 240 - OOR, OOR, OOR, OOR, OOR, OOR // 250 -}; - -alignas(16) constexpr uint16_t shift1000[] = { - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 0-9 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 10 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 20 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 30 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, 0, 1000, // 40 - 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, OOR, OOR, - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 60 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 70 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 80 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 90 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 100 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 110 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 120 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 130 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 140 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 150 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 160 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 170 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 180 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 190 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 200 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 210 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 220 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 230 - OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, OOR, // 240 - OOR, OOR, OOR, OOR, OOR, OOR // 250 -}; - -struct ErrorString { - const char* string; - bool quote; -}; - -// Keep this in sync with ConversionCode in Conv.h -constexpr const std::array< - ErrorString, - static_cast(ConversionCode::NUM_ERROR_CODES)> - kErrorStrings{{ - {"Success", true}, - {"Empty input string", true}, - {"No digits found in input string", true}, - {"Integer overflow when parsing bool (must be 0 or 1)", true}, - {"Invalid value for bool", true}, - {"Non-digit character found", true}, - {"Invalid leading character", true}, - {"Overflow during conversion", true}, - {"Negative overflow during conversion", true}, - {"Unable to convert string to floating point value", true}, - {"Non-whitespace character found after end of conversion", true}, - {"Overflow during arithmetic conversion", false}, - {"Negative overflow during arithmetic conversion", false}, - {"Loss of precision during arithmetic conversion", false}, - }}; - -// Check if ASCII is really ASCII -using IsAscii = - bool_constant<'A' == 65 && 'Z' == 90 && 'a' == 97 && 'z' == 122>; - -// The code in this file that uses tolower() really only cares about -// 7-bit ASCII characters, so we can take a nice shortcut here. -inline char tolower_ascii(char in) { - return IsAscii::value ? in | 0x20 : char(std::tolower(in)); -} - -inline bool bool_str_cmp(const char** b, size_t len, const char* value) { - // Can't use strncasecmp, since we want to ensure that the full value matches - const char* p = *b; - const char* e = *b + len; - const char* v = value; - while (*v != '\0') { - if (p == e || tolower_ascii(*p) != *v) { // value is already lowercase - return false; - } - ++p; - ++v; - } - - *b = p; - return true; -} - -} // namespace - -Expected str_to_bool(StringPiece* src) noexcept { - auto b = src->begin(), e = src->end(); - for (;; ++b) { - if (b >= e) { - return makeUnexpected(ConversionCode::EMPTY_INPUT_STRING); - } - if (!std::isspace(*b)) { - break; - } - } - - bool result; - auto len = size_t(e - b); - switch (*b) { - case '0': - case '1': { - result = false; - for (; b < e && isdigit(*b); ++b) { - if (result || (*b != '0' && *b != '1')) { - return makeUnexpected(ConversionCode::BOOL_OVERFLOW); - } - result = (*b == '1'); - } - break; - } - case 'y': - case 'Y': - result = true; - if (!bool_str_cmp(&b, len, "yes")) { - ++b; // accept the single 'y' character - } - break; - case 'n': - case 'N': - result = false; - if (!bool_str_cmp(&b, len, "no")) { - ++b; - } - break; - case 't': - case 'T': - result = true; - if (!bool_str_cmp(&b, len, "true")) { - ++b; - } - break; - case 'f': - case 'F': - result = false; - if (!bool_str_cmp(&b, len, "false")) { - ++b; - } - break; - case 'o': - case 'O': - if (bool_str_cmp(&b, len, "on")) { - result = true; - } else if (bool_str_cmp(&b, len, "off")) { - result = false; - } else { - return makeUnexpected(ConversionCode::BOOL_INVALID_VALUE); - } - break; - default: - return makeUnexpected(ConversionCode::BOOL_INVALID_VALUE); - } - - src->assign(b, e); - - return result; -} - -/** - * StringPiece to double, with progress information. Alters the - * StringPiece parameter to munch the already-parsed characters. - */ -template -Expected str_to_floating(StringPiece* src) noexcept { - using namespace double_conversion; - static StringToDoubleConverter conv( - StringToDoubleConverter::ALLOW_TRAILING_JUNK | - StringToDoubleConverter::ALLOW_LEADING_SPACES, - 0.0, - // return this for junk input string - std::numeric_limits::quiet_NaN(), - nullptr, - nullptr); - - if (src->empty()) { - return makeUnexpected(ConversionCode::EMPTY_INPUT_STRING); - } - - int length; - auto result = conv.StringToDouble( - src->data(), - static_cast(src->size()), - &length); // processed char count - - if (!std::isnan(result)) { - // If we get here with length = 0, the input string is empty. - // If we get here with result = 0.0, it's either because the string - // contained only whitespace, or because we had an actual zero value - // (with potential trailing junk). If it was only whitespace, we - // want to raise an error; length will point past the last character - // that was processed, so we need to check if that character was - // whitespace or not. - if (length == 0 || - (result == 0.0 && std::isspace((*src)[size_t(length) - 1]))) { - return makeUnexpected(ConversionCode::EMPTY_INPUT_STRING); - } - if (length >= 2) { - const char* suffix = src->data() + length - 1; - // double_conversion doesn't update length correctly when there is an - // incomplete exponent specifier. Converting "12e-f-g" shouldn't consume - // any more than "12", but it will consume "12e-". - - // "123-" should only parse "123" - if (*suffix == '-' || *suffix == '+') { - --suffix; - --length; - } - // "12e-f-g" or "12euro" should only parse "12" - if (*suffix == 'e' || *suffix == 'E') { - --length; - } - } - src->advance(size_t(length)); - return Tgt(result); - } - - auto* e = src->end(); - auto* b = - std::find_if_not(src->begin(), e, [](char c) { return std::isspace(c); }); - - // There must be non-whitespace, otherwise we would have caught this above - assert(b < e); - auto size = size_t(e - b); - - bool negative = false; - if (*b == '-') { - negative = true; - ++b; - --size; - } - - result = 0.0; - - switch (tolower_ascii(*b)) { - case 'i': - if (size >= 3 && tolower_ascii(b[1]) == 'n' && - tolower_ascii(b[2]) == 'f') { - if (size >= 8 && tolower_ascii(b[3]) == 'i' && - tolower_ascii(b[4]) == 'n' && tolower_ascii(b[5]) == 'i' && - tolower_ascii(b[6]) == 't' && tolower_ascii(b[7]) == 'y') { - b += 8; - } else { - b += 3; - } - result = std::numeric_limits::infinity(); - } - break; - - case 'n': - if (size >= 3 && tolower_ascii(b[1]) == 'a' && - tolower_ascii(b[2]) == 'n') { - b += 3; - result = std::numeric_limits::quiet_NaN(); - } - break; - - default: - break; - } - - if (result == 0.0) { - // All bets are off - return makeUnexpected(ConversionCode::STRING_TO_FLOAT_ERROR); - } - - if (negative) { - result = -result; - } - - src->assign(b, e); - - return Tgt(result); -} - -template Expected str_to_floating( - StringPiece* src) noexcept; -template Expected str_to_floating( - StringPiece* src) noexcept; - -/** - * This class takes care of additional processing needed for signed values, - * like leading sign character and overflow checks. - */ -template ::value> -class SignedValueHandler; - -template -class SignedValueHandler { - public: - ConversionCode init(const char*& b) { - negative_ = false; - if (!std::isdigit(*b)) { - if (*b == '-') { - negative_ = true; - } else if (UNLIKELY(*b != '+')) { - return ConversionCode::INVALID_LEADING_CHAR; - } - ++b; - } - return ConversionCode::SUCCESS; - } - - ConversionCode overflow() { - return negative_ ? ConversionCode::NEGATIVE_OVERFLOW - : ConversionCode::POSITIVE_OVERFLOW; - } - - template - Expected finalize(U value) { - T rv; - if (negative_) { - FOLLY_PUSH_WARNING - FOLLY_MSVC_DISABLE_WARNING(4146) - - // unary minus operator applied to unsigned type, result still unsigned - rv = T(-value); - - FOLLY_POP_WARNING - - if (UNLIKELY(rv > 0)) { - return makeUnexpected(ConversionCode::NEGATIVE_OVERFLOW); - } - } else { - rv = T(value); - if (UNLIKELY(rv < 0)) { - return makeUnexpected(ConversionCode::POSITIVE_OVERFLOW); - } - } - return rv; - } - - private: - bool negative_; -}; - -// For unsigned types, we don't need any extra processing -template -class SignedValueHandler { - public: - ConversionCode init(const char*&) { - return ConversionCode::SUCCESS; - } - - ConversionCode overflow() { - return ConversionCode::POSITIVE_OVERFLOW; - } - - Expected finalize(T value) { - return value; - } -}; - -/** - * String represented as a pair of pointers to char to signed/unsigned - * integrals. Assumes NO whitespace before or after, and also that the - * string is composed entirely of digits (and an optional sign only for - * signed types). String may be empty, in which case digits_to returns - * an appropriate error. - */ -template -inline Expected digits_to( - const char* b, - const char* const e) noexcept { - using UT = typename std::make_unsigned::type; - assert(b <= e); - - SignedValueHandler sgn; - - auto err = sgn.init(b); - if (UNLIKELY(err != ConversionCode::SUCCESS)) { - return makeUnexpected(err); - } - - auto size = size_t(e - b); - - /* Although the string is entirely made of digits, we still need to - * check for overflow. - */ - if (size > std::numeric_limits::digits10) { - // Leading zeros? - if (b < e && *b == '0') { - for (++b;; ++b) { - if (b == e) { - return Tgt(0); // just zeros, e.g. "0000" - } - if (*b != '0') { - size = size_t(e - b); - break; - } - } - } - if (size > std::numeric_limits::digits10 && - (size != std::numeric_limits::digits10 + 1 || - strncmp(b, MaxString::value, size) > 0)) { - return makeUnexpected(sgn.overflow()); - } - } - - // Here we know that the number won't overflow when - // converted. Proceed without checks. - - UT result = 0; - - for (; e - b >= 4; b += 4) { - result *= UT(10000); - const int32_t r0 = shift1000[static_cast(b[0])]; - const int32_t r1 = shift100[static_cast(b[1])]; - const int32_t r2 = shift10[static_cast(b[2])]; - const int32_t r3 = shift1[static_cast(b[3])]; - const auto sum = r0 + r1 + r2 + r3; - if (sum >= OOR) { - goto outOfRange; - } - result += UT(sum); - } - - switch (e - b) { - case 3: { - const int32_t r0 = shift100[static_cast(b[0])]; - const int32_t r1 = shift10[static_cast(b[1])]; - const int32_t r2 = shift1[static_cast(b[2])]; - const auto sum = r0 + r1 + r2; - if (sum >= OOR) { - goto outOfRange; - } - result = UT(1000 * result + sum); - break; - } - case 2: { - const int32_t r0 = shift10[static_cast(b[0])]; - const int32_t r1 = shift1[static_cast(b[1])]; - const auto sum = r0 + r1; - if (sum >= OOR) { - goto outOfRange; - } - result = UT(100 * result + sum); - break; - } - case 1: { - const int32_t sum = shift1[static_cast(b[0])]; - if (sum >= OOR) { - goto outOfRange; - } - result = UT(10 * result + sum); - break; - } - default: - assert(b == e); - if (size == 0) { - return makeUnexpected(ConversionCode::NO_DIGITS); - } - break; - } - - return sgn.finalize(result); - -outOfRange: - return makeUnexpected(ConversionCode::NON_DIGIT_CHAR); -} - -template Expected digits_to( - const char*, - const char*) noexcept; -template Expected digits_to( - const char*, - const char*) noexcept; -template Expected digits_to( - const char*, - const char*) noexcept; - -template Expected digits_to( - const char*, - const char*) noexcept; -template Expected digits_to( - const char*, - const char*) noexcept; - -template Expected digits_to( - const char*, - const char*) noexcept; -template Expected digits_to( - const char*, - const char*) noexcept; - -template Expected digits_to( - const char*, - const char*) noexcept; -template Expected digits_to( - const char*, - const char*) noexcept; - -template Expected digits_to( - const char*, - const char*) noexcept; -template Expected -digits_to(const char*, const char*) noexcept; - -#if FOLLY_HAVE_INT128_T -template Expected<__int128, ConversionCode> digits_to<__int128>( - const char*, - const char*) noexcept; -template Expected -digits_to(const char*, const char*) noexcept; -#endif - -/** - * StringPiece to integrals, with progress information. Alters the - * StringPiece parameter to munch the already-parsed characters. - */ -template -Expected str_to_integral(StringPiece* src) noexcept { - using UT = typename std::make_unsigned::type; - - auto b = src->data(), past = src->data() + src->size(); - - for (;; ++b) { - if (UNLIKELY(b >= past)) { - return makeUnexpected(ConversionCode::EMPTY_INPUT_STRING); - } - if (!std::isspace(*b)) { - break; - } - } - - SignedValueHandler sgn; - auto err = sgn.init(b); - - if (UNLIKELY(err != ConversionCode::SUCCESS)) { - return makeUnexpected(err); - } - if (std::is_signed::value && UNLIKELY(b >= past)) { - return makeUnexpected(ConversionCode::NO_DIGITS); - } - if (UNLIKELY(!isdigit(*b))) { - return makeUnexpected(ConversionCode::NON_DIGIT_CHAR); - } - - auto m = findFirstNonDigit(b + 1, past); - - auto tmp = digits_to(b, m); - - if (UNLIKELY(!tmp.hasValue())) { - return makeUnexpected( - tmp.error() == ConversionCode::POSITIVE_OVERFLOW ? sgn.overflow() - : tmp.error()); - } - - auto res = sgn.finalize(tmp.value()); - - if (res.hasValue()) { - src->advance(size_t(m - src->data())); - } - - return res; -} - -template Expected str_to_integral( - StringPiece* src) noexcept; -template Expected str_to_integral( - StringPiece* src) noexcept; -template Expected str_to_integral( - StringPiece* src) noexcept; - -template Expected str_to_integral( - StringPiece* src) noexcept; -template Expected -str_to_integral(StringPiece* src) noexcept; - -template Expected str_to_integral( - StringPiece* src) noexcept; -template Expected str_to_integral( - StringPiece* src) noexcept; - -template Expected str_to_integral( - StringPiece* src) noexcept; -template Expected str_to_integral( - StringPiece* src) noexcept; - -template Expected str_to_integral( - StringPiece* src) noexcept; -template Expected -str_to_integral(StringPiece* src) noexcept; - -#if FOLLY_HAVE_INT128_T -template Expected<__int128, ConversionCode> str_to_integral<__int128>( - StringPiece* src) noexcept; -template Expected -str_to_integral(StringPiece* src) noexcept; -#endif - -} // namespace detail - -ConversionError makeConversionError(ConversionCode code, StringPiece input) { - using namespace detail; - static_assert( - std::is_unsigned::type>::value, - "ConversionCode should be unsigned"); - assert((std::size_t)code < kErrorStrings.size()); - const ErrorString& err = kErrorStrings[(std::size_t)code]; - if (code == ConversionCode::EMPTY_INPUT_STRING && input.empty()) { - return {err.string, code}; - } - std::string tmp(err.string); - tmp.append(": "); - if (err.quote) { - tmp.append(1, '"'); - } - if (!input.empty()) { - tmp.append(input.data(), input.size()); - } - if (err.quote) { - tmp.append(1, '"'); - } - return {tmp, code}; -} - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/Conv.h b/ios/Pods/Flipper-Folly/folly/Conv.h deleted file mode 100644 index c3ff645..0000000 --- a/ios/Pods/Flipper-Folly/folly/Conv.h +++ /dev/null @@ -1,1663 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * - * This file provides a generic interface for converting objects to and from - * string-like types (std::string, fbstring, StringPiece), as well as - * range-checked conversions between numeric and enum types. The mechanisms are - * extensible, so that user-specified types can add folly::to support. - * - ******************************************************************************* - * TYPE -> STRING CONVERSIONS - ******************************************************************************* - * You can call the to or to. These are variadic - * functions that convert their arguments to strings, and concatenate them to - * form a result. So, for example, - * - * auto str = to(123, "456", 789); - * - * Sets str to "123456789". - * - * In addition to just concatenating the arguments, related functions can - * delimit them with some string: toDelim(",", "123", 456, "789") - * will return the string "123,456,789". - * - * toAppend does not return a string; instead, it takes a pointer to a string as - * its last argument, and appends the result of the concatenation into it: - * std::string str = "123"; - * toAppend(456, "789", &str); // Now str is "123456789". - * - * The toAppendFit function acts like toAppend, but it precalculates the size - * required to perform the append operation, and reserves that space in the - * output string before actually inserting its arguments. This can sometimes - * save on string expansion, but beware: appending to the same string many times - * with toAppendFit is likely a pessimization, since it will resize the string - * once per append. - * - * The combination of the append and delim variants also exist: toAppendDelim - * and toAppendDelimFit are defined, with the obvious semantics. - * - ******************************************************************************* - * STRING -> TYPE CONVERSIONS - ******************************************************************************* - * Going in the other direction, and parsing a string into a C++ type, is also - * supported: - * to("123"); // Returns 123. - * - * Out of range (e.g. to("1000")), or invalidly formatted (e.g. - * to("four")) inputs will throw. If throw-on-error is undesirable (for - * instance: you're dealing with untrusted input, and want to protect yourself - * from users sending you down a very slow exception-throwing path), you can use - * tryTo, which will return an Expected. - * - * There are overloads of to() and tryTo() that take a StringPiece*. These parse - * out a type from the beginning of a string, and modify the passed-in - * StringPiece to indicate the portion of the string not consumed. - * - ******************************************************************************* - * NUMERIC / ENUM CONVERSIONS - ******************************************************************************* - * Conv also supports a to(S) overload, where T and S are numeric or enum - * types, that checks to see that the target type can represent its argument, - * and will throw if it cannot. This includes cases where a floating point -> - * integral conversion is attempted on a value with a non-zero fractional - * component, and integral -> floating point conversions that would lose - * precision. Enum conversions are range-checked for the underlying type of the - * enum, but there is no check that the input value is a valid choice of enum - * value. - * - ******************************************************************************* - * CUSTOM TYPE CONVERSIONS - ******************************************************************************* - * Users may customize the string conversion functionality for their own data - * types, . The key functions you should implement are: - * // Two functions to allow conversion to your type from a string. - * Expected parseTo(folly::StringPiece in, - * YourType& out); - * YourErrorType makeConversionError(YourErrorType in, StringPiece in); - * // Two functions to allow conversion from your type to a string. - * template - * void toAppend(const YourType& in, String* out); - * size_t estimateSpaceNeeded(const YourType& in); - * - * These are documented below, inline. - */ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include // V8 JavaScript implementation - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace folly { - -// Keep this in sync with kErrorStrings in Conv.cpp -enum class ConversionCode : unsigned char { - SUCCESS, - EMPTY_INPUT_STRING, - NO_DIGITS, - BOOL_OVERFLOW, - BOOL_INVALID_VALUE, - NON_DIGIT_CHAR, - INVALID_LEADING_CHAR, - POSITIVE_OVERFLOW, - NEGATIVE_OVERFLOW, - STRING_TO_FLOAT_ERROR, - NON_WHITESPACE_AFTER_END, - ARITH_POSITIVE_OVERFLOW, - ARITH_NEGATIVE_OVERFLOW, - ARITH_LOSS_OF_PRECISION, - NUM_ERROR_CODES, // has to be the last entry -}; - -struct ConversionErrorBase : std::range_error { - using std::range_error::range_error; -}; - -class ConversionError : public ConversionErrorBase { - public: - ConversionError(const std::string& str, ConversionCode code) - : ConversionErrorBase(str), code_(code) {} - - ConversionError(const char* str, ConversionCode code) - : ConversionErrorBase(str), code_(code) {} - - ConversionCode errorCode() const { - return code_; - } - - private: - ConversionCode code_; -}; - -/******************************************************************************* - * Custom Error Translation - * - * Your overloaded parseTo() function can return a custom error code on failure. - * ::folly::to() will call makeConversionError to translate that error code into - * an object to throw. makeConversionError is found by argument-dependent - * lookup. It should have this signature: - * - * namespace other_namespace { - * enum YourErrorCode { BAD_ERROR, WORSE_ERROR }; - * - * struct YourConversionError : ConversionErrorBase { - * YourConversionError(const char* what) : ConversionErrorBase(what) {} - * }; - * - * YourConversionError - * makeConversionError(YourErrorCode code, ::folly::StringPiece sp) { - * ... - * return YourConversionError(messageString); - * } - ******************************************************************************/ -ConversionError makeConversionError(ConversionCode code, StringPiece input); - -namespace detail { -/** - * Enforce that the suffix following a number is made up only of whitespace. - */ -inline ConversionCode enforceWhitespaceErr(StringPiece sp) { - for (auto c : sp) { - if (UNLIKELY(!std::isspace(c))) { - return ConversionCode::NON_WHITESPACE_AFTER_END; - } - } - return ConversionCode::SUCCESS; -} - -/** - * Keep this implementation around for prettyToDouble(). - */ -inline void enforceWhitespace(StringPiece sp) { - auto err = enforceWhitespaceErr(sp); - if (err != ConversionCode::SUCCESS) { - throw_exception(makeConversionError(err, sp)); - } -} -} // namespace detail - -/** - * The identity conversion function. - * tryTo(T) returns itself for all types T. - */ -template -typename std::enable_if< - std::is_same::type>::value, - Expected>::type -tryTo(Src&& value) { - return std::forward(value); -} - -template -typename std::enable_if< - std::is_same::type>::value, - Tgt>::type -to(Src&& value) { - return std::forward(value); -} - -/******************************************************************************* - * Arithmetic to boolean - ******************************************************************************/ - -/** - * Unchecked conversion from arithmetic to boolean. This is different from the - * other arithmetic conversions because we use the C convention of treating any - * non-zero value as true, instead of range checking. - */ -template -typename std::enable_if< - std::is_arithmetic::value && !std::is_same::value && - std::is_same::value, - Expected>::type -tryTo(const Src& value) { - return value != Src(); -} - -template -typename std::enable_if< - std::is_arithmetic::value && !std::is_same::value && - std::is_same::value, - Tgt>::type -to(const Src& value) { - return value != Src(); -} - -/******************************************************************************* - * Anything to string - ******************************************************************************/ - -namespace detail { - -#ifdef _MSC_VER -// MSVC can't quite figure out the LastElementImpl::call() stuff -// in the base implementation, so we have to use tuples instead, -// which result in significantly more templates being compiled, -// though the runtime performance is the same. - -template -auto getLastElement(Ts&&... ts) -> decltype(std::get( - std::forward_as_tuple(std::forward(ts)...))) { - return std::get( - std::forward_as_tuple(std::forward(ts)...)); -} - -inline void getLastElement() {} - -template -struct LastElementType : std::tuple_element> {}; - -template <> -struct LastElementType<0> { - using type = void; -}; - -template -struct LastElement - : std::decay::type> {}; -#else -template -struct LastElementImpl { - static void call(Ignored...) {} -}; - -template -struct LastElementImpl { - template - static Last call(Ignored..., Last&& last) { - return std::forward(last); - } -}; - -template -auto getLastElement(const Ts&... ts) - -> decltype(LastElementImpl::call(ts...)) { - return LastElementImpl::call(ts...); -} - -template -struct LastElement : std::decay::call(std::declval()...))> { -}; -#endif - -} // namespace detail - -/******************************************************************************* - * Conversions from integral types to string types. - ******************************************************************************/ - -#if FOLLY_HAVE_INT128_T -namespace detail { - -template -constexpr unsigned int digitsEnough() { - // digits10 returns the number of decimal digits that this type can represent, - // not the number of characters required for the max value, so we need to add - // one. ex: char digits10 returns 2, because 256-999 cannot be represented, - // but we need 3. - auto const digits10 = std::numeric_limits::digits10; - return static_cast(digits10) + 1; -} - -inline size_t -unsafeTelescope128(char* buffer, size_t room, unsigned __int128 x) { - typedef unsigned __int128 Usrc; - size_t p = room - 1; - - while (x >= (Usrc(1) << 64)) { // Using 128-bit division while needed - const auto y = x / 10; - const auto digit = x % 10; - - buffer[p--] = static_cast('0' + digit); - x = y; - } - - uint64_t xx = static_cast(x); // Rest uses faster 64-bit division - - while (xx >= 10) { - const auto y = xx / 10ULL; - const auto digit = xx % 10ULL; - - buffer[p--] = static_cast('0' + digit); - xx = y; - } - - buffer[p] = static_cast('0' + xx); - - return p; -} - -} // namespace detail -#endif - -/** - * Returns the number of digits in the base 10 representation of an - * uint64_t. Useful for preallocating buffers and such. It's also used - * internally, see below. Measurements suggest that defining a - * separate overload for 32-bit integers is not worthwhile. - */ - -inline uint32_t digits10(uint64_t v) { -#ifdef __x86_64__ - - // For this arch we can get a little help from specialized CPU instructions - // which can count leading zeroes; 64 minus that is appx. log (base 2). - // Use that to approximate base-10 digits (log_10) and then adjust if needed. - - // 10^i, defined for i 0 through 19. - // This is 20 * 8 == 160 bytes, which fits neatly into 5 cache lines - // (assuming a cache line size of 64). - alignas(64) static const uint64_t powersOf10[20] = { - 1, - 10, - 100, - 1000, - 10000, - 100000, - 1000000, - 10000000, - 100000000, - 1000000000, - 10000000000, - 100000000000, - 1000000000000, - 10000000000000, - 100000000000000, - 1000000000000000, - 10000000000000000, - 100000000000000000, - 1000000000000000000, - 10000000000000000000UL, - }; - - // "count leading zeroes" operation not valid; for 0; special case this. - if (UNLIKELY(!v)) { - return 1; - } - - // bits is in the ballpark of log_2(v). - const uint32_t leadingZeroes = __builtin_clzll(v); - const auto bits = 63 - leadingZeroes; - - // approximate log_10(v) == log_10(2) * bits. - // Integer magic below: 77/256 is appx. 0.3010 (log_10(2)). - // The +1 is to make this the ceiling of the log_10 estimate. - const uint32_t minLength = 1 + ((bits * 77) >> 8); - - // return that log_10 lower bound, plus adjust if input >= 10^(that bound) - // in case there's a small error and we misjudged length. - return minLength + uint32_t(v >= powersOf10[minLength]); - -#else - - uint32_t result = 1; - while (true) { - if (LIKELY(v < 10)) { - return result; - } - if (LIKELY(v < 100)) { - return result + 1; - } - if (LIKELY(v < 1000)) { - return result + 2; - } - if (LIKELY(v < 10000)) { - return result + 3; - } - // Skip ahead by 4 orders of magnitude - v /= 10000U; - result += 4; - } - -#endif -} - -/** - * Copies the ASCII base 10 representation of v into buffer and - * returns the number of bytes written. Does NOT append a \0. Assumes - * the buffer points to digits10(v) bytes of valid memory. Note that - * uint64_t needs at most 20 bytes, uint32_t needs at most 10 bytes, - * uint16_t needs at most 5 bytes, and so on. Measurements suggest - * that defining a separate overload for 32-bit integers is not - * worthwhile. - * - * This primitive is unsafe because it makes the size assumption and - * because it does not add a terminating \0. - */ - -inline uint32_t uint64ToBufferUnsafe(uint64_t v, char* const buffer) { - auto const result = digits10(v); - // WARNING: using size_t or pointer arithmetic for pos slows down - // the loop below 20x. This is because several 32-bit ops can be - // done in parallel, but only fewer 64-bit ones. - uint32_t pos = result - 1; - while (v >= 10) { - // Keep these together so a peephole optimization "sees" them and - // computes them in one shot. - auto const q = v / 10; - auto const r = v % 10; - buffer[pos--] = static_cast('0' + r); - v = q; - } - // Last digit is trivial to handle - buffer[pos] = static_cast(v + '0'); - return result; -} - -/** - * A single char gets appended. - */ -template -void toAppend(char value, Tgt* result) { - *result += value; -} - -template -constexpr typename std::enable_if::value, size_t>::type -estimateSpaceNeeded(T) { - return 1; -} - -template -constexpr size_t estimateSpaceNeeded(const char (&)[N]) { - return N; -} - -/** - * Everything implicitly convertible to const char* gets appended. - */ -template -typename std::enable_if< - std::is_convertible::value && - IsSomeString::value>::type -toAppend(Src value, Tgt* result) { - // Treat null pointers like an empty string, as in: - // operator<<(std::ostream&, const char*). - const char* c = value; - if (c) { - result->append(value); - } -} - -template -typename std::enable_if::value, size_t>:: - type - estimateSpaceNeeded(Src value) { - const char* c = value; - if (c) { - return folly::StringPiece(value).size(); - }; - return 0; -} - -template -typename std::enable_if::value, size_t>::type -estimateSpaceNeeded(Src const& value) { - return value.size(); -} - -template -typename std::enable_if< - std::is_convertible::value && - !IsSomeString::value && - !std::is_convertible::value, - size_t>::type -estimateSpaceNeeded(Src value) { - return folly::StringPiece(value).size(); -} - -template <> -inline size_t estimateSpaceNeeded(std::nullptr_t /* value */) { - return 0; -} - -template -typename std::enable_if< - std::is_pointer::value && - IsSomeString>::value, - size_t>::type -estimateSpaceNeeded(Src value) { - return value->size(); -} - -/** - * Strings get appended, too. - */ -template -typename std::enable_if< - IsSomeString::value && IsSomeString::value>::type -toAppend(const Src& value, Tgt* result) { - result->append(value); -} - -/** - * and StringPiece objects too - */ -template -typename std::enable_if::value>::type toAppend( - StringPiece value, - Tgt* result) { - result->append(value.data(), value.size()); -} - -/** - * There's no implicit conversion from fbstring to other string types, - * so make a specialization. - */ -template -typename std::enable_if::value>::type toAppend( - const fbstring& value, - Tgt* result) { - result->append(value.data(), value.size()); -} - -#if FOLLY_HAVE_INT128_T -/** - * Special handling for 128 bit integers. - */ - -template -void toAppend(__int128 value, Tgt* result) { - typedef unsigned __int128 Usrc; - char buffer[detail::digitsEnough() + 1]; - size_t p; - - if (value < 0) { - p = detail::unsafeTelescope128(buffer, sizeof(buffer), -Usrc(value)); - buffer[--p] = '-'; - } else { - p = detail::unsafeTelescope128(buffer, sizeof(buffer), value); - } - - result->append(buffer + p, buffer + sizeof(buffer)); -} - -template -void toAppend(unsigned __int128 value, Tgt* result) { - char buffer[detail::digitsEnough()]; - size_t p; - - p = detail::unsafeTelescope128(buffer, sizeof(buffer), value); - - result->append(buffer + p, buffer + sizeof(buffer)); -} - -template -constexpr - typename std::enable_if::value, size_t>::type - estimateSpaceNeeded(T) { - return detail::digitsEnough<__int128>(); -} - -template -constexpr typename std:: - enable_if::value, size_t>::type - estimateSpaceNeeded(T) { - return detail::digitsEnough(); -} - -#endif - -/** - * int32_t and int64_t to string (by appending) go through here. The - * result is APPENDED to a preexisting string passed as the second - * parameter. This should be efficient with fbstring because fbstring - * incurs no dynamic allocation below 23 bytes and no number has more - * than 22 bytes in its textual representation (20 for digits, one for - * sign, one for the terminating 0). - */ -template -typename std::enable_if< - std::is_integral::value && std::is_signed::value && - IsSomeString::value && sizeof(Src) >= 4>::type -toAppend(Src value, Tgt* result) { - char buffer[20]; - if (value < 0) { - result->push_back('-'); - result->append( - buffer, - uint64ToBufferUnsafe(~static_cast(value) + 1, buffer)); - } else { - result->append(buffer, uint64ToBufferUnsafe(uint64_t(value), buffer)); - } -} - -template -typename std::enable_if< - std::is_integral::value && std::is_signed::value && - sizeof(Src) >= 4 && sizeof(Src) < 16, - size_t>::type -estimateSpaceNeeded(Src value) { - if (value < 0) { - // When "value" is the smallest negative, negating it would evoke - // undefined behavior, so, instead of writing "-value" below, we write - // "~static_cast(value) + 1" - return 1 + digits10(~static_cast(value) + 1); - } - - return digits10(static_cast(value)); -} - -/** - * As above, but for uint32_t and uint64_t. - */ -template -typename std::enable_if< - std::is_integral::value && !std::is_signed::value && - IsSomeString::value && sizeof(Src) >= 4>::type -toAppend(Src value, Tgt* result) { - char buffer[20]; - result->append(buffer, uint64ToBufferUnsafe(value, buffer)); -} - -template -typename std::enable_if< - std::is_integral::value && !std::is_signed::value && - sizeof(Src) >= 4 && sizeof(Src) < 16, - size_t>::type -estimateSpaceNeeded(Src value) { - return digits10(value); -} - -/** - * All small signed and unsigned integers to string go through 32-bit - * types int32_t and uint32_t, respectively. - */ -template -typename std::enable_if< - std::is_integral::value && IsSomeString::value && - sizeof(Src) < 4>::type -toAppend(Src value, Tgt* result) { - typedef - typename std::conditional::value, int64_t, uint64_t>:: - type Intermediate; - toAppend(static_cast(value), result); -} - -template -typename std::enable_if< - std::is_integral::value && sizeof(Src) < 4 && - !std::is_same::value, - size_t>::type -estimateSpaceNeeded(Src value) { - typedef - typename std::conditional::value, int64_t, uint64_t>:: - type Intermediate; - return estimateSpaceNeeded(static_cast(value)); -} - -/** - * Enumerated values get appended as integers. - */ -template -typename std::enable_if< - std::is_enum::value && IsSomeString::value>::type -toAppend(Src value, Tgt* result) { - toAppend(to_underlying(value), result); -} - -template -typename std::enable_if::value, size_t>::type -estimateSpaceNeeded(Src value) { - return estimateSpaceNeeded(to_underlying(value)); -} - -/******************************************************************************* - * Conversions from floating-point types to string types. - ******************************************************************************/ - -namespace detail { -constexpr int kConvMaxDecimalInShortestLow = -6; -constexpr int kConvMaxDecimalInShortestHigh = 21; -} // namespace detail - -/** Wrapper around DoubleToStringConverter **/ -template -typename std::enable_if< - std::is_floating_point::value && IsSomeString::value>::type -toAppend( - Src value, - Tgt* result, - double_conversion::DoubleToStringConverter::DtoaMode mode, - unsigned int numDigits) { - using namespace double_conversion; - DoubleToStringConverter conv( - DoubleToStringConverter::NO_FLAGS, - "Infinity", - "NaN", - 'E', - detail::kConvMaxDecimalInShortestLow, - detail::kConvMaxDecimalInShortestHigh, - 6, // max leading padding zeros - 1); // max trailing padding zeros - char buffer[256]; - StringBuilder builder(buffer, sizeof(buffer)); - switch (mode) { - case DoubleToStringConverter::SHORTEST: - conv.ToShortest(value, &builder); - break; - case DoubleToStringConverter::SHORTEST_SINGLE: - conv.ToShortestSingle(static_cast(value), &builder); - break; - case DoubleToStringConverter::FIXED: - conv.ToFixed(value, int(numDigits), &builder); - break; - case DoubleToStringConverter::PRECISION: - default: - assert(mode == DoubleToStringConverter::PRECISION); - conv.ToPrecision(value, int(numDigits), &builder); - break; - } - const size_t length = size_t(builder.position()); - builder.Finalize(); - result->append(buffer, length); -} - -/** - * As above, but for floating point - */ -template -typename std::enable_if< - std::is_floating_point::value && IsSomeString::value>::type -toAppend(Src value, Tgt* result) { - toAppend( - value, result, double_conversion::DoubleToStringConverter::SHORTEST, 0); -} - -/** - * Upper bound of the length of the output from - * DoubleToStringConverter::ToShortest(double, StringBuilder*), - * as used in toAppend(double, string*). - */ -template -typename std::enable_if::value, size_t>::type -estimateSpaceNeeded(Src value) { - // kBase10MaximalLength is 17. We add 1 for decimal point, - // e.g. 10.0/9 is 17 digits and 18 characters, including the decimal point. - constexpr int kMaxMantissaSpace = - double_conversion::DoubleToStringConverter::kBase10MaximalLength + 1; - // strlen("E-") + digits10(numeric_limits::max_exponent10) - constexpr int kMaxExponentSpace = 2 + 3; - static const int kMaxPositiveSpace = std::max({ - // E.g. 1.1111111111111111E-100. - kMaxMantissaSpace + kMaxExponentSpace, - // E.g. 0.000001.1111111111111111, if kConvMaxDecimalInShortestLow is -6. - kMaxMantissaSpace - detail::kConvMaxDecimalInShortestLow, - // If kConvMaxDecimalInShortestHigh is 21, then 1e21 is the smallest - // number > 1 which ToShortest outputs in exponential notation, - // so 21 is the longest non-exponential number > 1. - detail::kConvMaxDecimalInShortestHigh, - }); - return size_t( - kMaxPositiveSpace + - (value < 0 ? 1 : 0)); // +1 for minus sign, if negative -} - -/** - * This can be specialized, together with adding specialization - * for estimateSpaceNeed for your type, so that we allocate - * as much as you need instead of the default - */ -template -struct HasLengthEstimator : std::false_type {}; - -template -constexpr typename std::enable_if< - !std::is_fundamental::value && -#if FOLLY_HAVE_INT128_T - // On OSX 10.10, is_fundamental<__int128> is false :-O - !std::is_same<__int128, Src>::value && - !std::is_same::value && -#endif - !IsSomeString::value && - !std::is_convertible::value && - !std::is_convertible::value && - !std::is_enum::value && !HasLengthEstimator::value, - size_t>::type -estimateSpaceNeeded(const Src&) { - return sizeof(Src) + 1; // dumbest best effort ever? -} - -namespace detail { - -template -typename std::enable_if::value, size_t>::type -estimateSpaceToReserve(size_t sofar, Tgt*) { - return sofar; -} - -template -size_t estimateSpaceToReserve(size_t sofar, const T& v, const Ts&... vs) { - return estimateSpaceToReserve(sofar + estimateSpaceNeeded(v), vs...); -} - -template -void reserveInTarget(const Ts&... vs) { - getLastElement(vs...)->reserve(estimateSpaceToReserve(0, vs...)); -} - -template -void reserveInTargetDelim(const Delimiter& d, const Ts&... vs) { - static_assert(sizeof...(vs) >= 2, "Needs at least 2 args"); - size_t fordelim = (sizeof...(vs) - 2) * - estimateSpaceToReserve(0, d, static_cast(nullptr)); - getLastElement(vs...)->reserve(estimateSpaceToReserve(fordelim, vs...)); -} - -/** - * Variadic base case: append one element - */ -template -typename std::enable_if< - IsSomeString::type>::value>::type -toAppendStrImpl(const T& v, Tgt result) { - toAppend(v, result); -} - -template -typename std::enable_if< - sizeof...(Ts) >= 2 && - IsSomeString::type>::type>::value>::type -toAppendStrImpl(const T& v, const Ts&... vs) { - toAppend(v, getLastElement(vs...)); - toAppendStrImpl(vs...); -} - -template -typename std::enable_if< - IsSomeString::type>::value>::type -toAppendDelimStrImpl(const Delimiter& /* delim */, const T& v, Tgt result) { - toAppend(v, result); -} - -template -typename std::enable_if< - sizeof...(Ts) >= 2 && - IsSomeString::type>::type>::value>::type -toAppendDelimStrImpl(const Delimiter& delim, const T& v, const Ts&... vs) { - // we are really careful here, calling toAppend with just one element does - // not try to estimate space needed (as we already did that). If we call - // toAppend(v, delim, ....) we would do unnecesary size calculation - toAppend(v, detail::getLastElement(vs...)); - toAppend(delim, detail::getLastElement(vs...)); - toAppendDelimStrImpl(delim, vs...); -} -} // namespace detail - -/** - * Variadic conversion to string. Appends each element in turn. - * If we have two or more things to append, we will not reserve - * the space for them and will depend on strings exponential growth. - * If you just append once consider using toAppendFit which reserves - * the space needed (but does not have exponential as a result). - * - * Custom implementations of toAppend() can be provided in the same namespace as - * the type to customize printing. estimateSpaceNeed() may also be provided to - * avoid reallocations in toAppendFit(): - * - * namespace other_namespace { - * - * template - * void toAppend(const OtherType&, String* out); - * - * // optional - * size_t estimateSpaceNeeded(const OtherType&); - * - * } - */ -template -typename std::enable_if< - sizeof...(Ts) >= 3 && - IsSomeString::type>::type>::value>::type -toAppend(const Ts&... vs) { - ::folly::detail::toAppendStrImpl(vs...); -} - -#ifdef _MSC_VER -// Special case pid_t on MSVC, because it's a void* rather than an -// integral type. We can't do a global special case because this is already -// dangerous enough (as most pointers will implicitly convert to a void*) -// just doing it for MSVC. -template -void toAppend(const pid_t a, Tgt* res) { - toAppend(uint64_t(a), res); -} -#endif - -/** - * Special version of the call that preallocates exaclty as much memory - * as need for arguments to be stored in target. This means we are - * not doing exponential growth when we append. If you are using it - * in a loop you are aiming at your foot with a big perf-destroying - * bazooka. - * On the other hand if you are appending to a string once, this - * will probably save a few calls to malloc. - */ -template -typename std::enable_if::type>::type>::value>::type -toAppendFit(const Ts&... vs) { - ::folly::detail::reserveInTarget(vs...); - toAppend(vs...); -} - -template -void toAppendFit(const Ts&) {} - -/** - * Variadic base case: do nothing. - */ -template -typename std::enable_if::value>::type toAppend( - Tgt* /* result */) {} - -/** - * Variadic base case: do nothing. - */ -template -typename std::enable_if::value>::type toAppendDelim( - const Delimiter& /* delim */, - Tgt* /* result */) {} - -/** - * 1 element: same as toAppend. - */ -template -typename std::enable_if::value>::type -toAppendDelim(const Delimiter& /* delim */, const T& v, Tgt* tgt) { - toAppend(v, tgt); -} - -/** - * Append to string with a delimiter in between elements. Check out - * comments for toAppend for details about memory allocation. - */ -template -typename std::enable_if< - sizeof...(Ts) >= 3 && - IsSomeString::type>::type>::value>::type -toAppendDelim(const Delimiter& delim, const Ts&... vs) { - detail::toAppendDelimStrImpl(delim, vs...); -} - -/** - * Detail in comment for toAppendFit - */ -template -typename std::enable_if::type>::type>::value>::type -toAppendDelimFit(const Delimiter& delim, const Ts&... vs) { - detail::reserveInTargetDelim(delim, vs...); - toAppendDelim(delim, vs...); -} - -template -void toAppendDelimFit(const De&, const Ts&) {} - -/** - * to(v1, v2, ...) uses toAppend() (see below) as back-end - * for all types. - */ -template -typename std::enable_if< - IsSomeString::value && - (sizeof...(Ts) != 1 || - !std::is_same::type>:: - value), - Tgt>::type -to(const Ts&... vs) { - Tgt result; - toAppendFit(vs..., &result); - return result; -} - -/** - * Special version of to for floating point. When calling - * folly::to(double), generic implementation above will - * firstly reserve 24 (or 25 when negative value) bytes. This will - * introduce a malloc call for most mainstream string implementations. - * - * But for most cases, a floating point doesn't need 24 (or 25) bytes to - * be converted as a string. - * - * This special version will not do string reserve. - */ -template -typename std::enable_if< - IsSomeString::value && std::is_floating_point::value, - Tgt>::type -to(Src value) { - Tgt result; - toAppend(value, &result); - return result; -} - -/** - * toDelim(SomeString str) returns itself. - */ -template -typename std::enable_if< - IsSomeString::value && - std::is_same::type>::value, - Tgt>::type -toDelim(const Delim& /* delim */, Src&& value) { - return std::forward(value); -} - -/** - * toDelim(delim, v1, v2, ...) uses toAppendDelim() as - * back-end for all types. - */ -template -typename std::enable_if< - IsSomeString::value && - (sizeof...(Ts) != 1 || - !std::is_same::type>:: - value), - Tgt>::type -toDelim(const Delim& delim, const Ts&... vs) { - Tgt result; - toAppendDelimFit(delim, vs..., &result); - return result; -} - -/******************************************************************************* - * Conversions from string types to integral types. - ******************************************************************************/ - -namespace detail { - -Expected str_to_bool(StringPiece* src) noexcept; - -template -Expected str_to_floating(StringPiece* src) noexcept; - -extern template Expected str_to_floating( - StringPiece* src) noexcept; -extern template Expected str_to_floating( - StringPiece* src) noexcept; - -template -Expected digits_to(const char* b, const char* e) noexcept; - -extern template Expected digits_to( - const char*, - const char*) noexcept; -extern template Expected digits_to( - const char*, - const char*) noexcept; -extern template Expected -digits_to(const char*, const char*) noexcept; - -extern template Expected digits_to( - const char*, - const char*) noexcept; -extern template Expected -digits_to(const char*, const char*) noexcept; - -extern template Expected digits_to( - const char*, - const char*) noexcept; -extern template Expected digits_to( - const char*, - const char*) noexcept; - -extern template Expected digits_to( - const char*, - const char*) noexcept; -extern template Expected -digits_to(const char*, const char*) noexcept; - -extern template Expected digits_to( - const char*, - const char*) noexcept; -extern template Expected -digits_to(const char*, const char*) noexcept; - -#if FOLLY_HAVE_INT128_T -extern template Expected<__int128, ConversionCode> digits_to<__int128>( - const char*, - const char*) noexcept; -extern template Expected -digits_to(const char*, const char*) noexcept; -#endif - -template -Expected str_to_integral(StringPiece* src) noexcept; - -extern template Expected str_to_integral( - StringPiece* src) noexcept; -extern template Expected -str_to_integral(StringPiece* src) noexcept; -extern template Expected -str_to_integral(StringPiece* src) noexcept; - -extern template Expected str_to_integral( - StringPiece* src) noexcept; -extern template Expected -str_to_integral(StringPiece* src) noexcept; - -extern template Expected str_to_integral( - StringPiece* src) noexcept; -extern template Expected -str_to_integral(StringPiece* src) noexcept; - -extern template Expected str_to_integral( - StringPiece* src) noexcept; -extern template Expected -str_to_integral(StringPiece* src) noexcept; - -extern template Expected str_to_integral( - StringPiece* src) noexcept; -extern template Expected -str_to_integral(StringPiece* src) noexcept; - -#if FOLLY_HAVE_INT128_T -extern template Expected<__int128, ConversionCode> str_to_integral<__int128>( - StringPiece* src) noexcept; -extern template Expected -str_to_integral(StringPiece* src) noexcept; -#endif - -template -typename std:: - enable_if::value, Expected>::type - convertTo(StringPiece* src) noexcept { - return str_to_bool(src); -} - -template -typename std::enable_if< - std::is_floating_point::value, - Expected>::type -convertTo(StringPiece* src) noexcept { - return str_to_floating(src); -} - -template -typename std::enable_if< - std::is_integral::value && !std::is_same::value, - Expected>::type -convertTo(StringPiece* src) noexcept { - return str_to_integral(src); -} - -} // namespace detail - -/** - * String represented as a pair of pointers to char to unsigned - * integrals. Assumes NO whitespace before or after. - */ -template -typename std::enable_if< - std::is_integral::value && !std::is_same::value, - Expected>::type -tryTo(const char* b, const char* e) { - return detail::digits_to(b, e); -} - -template -typename std::enable_if< - std::is_integral::value && !std::is_same::value, - Tgt>::type -to(const char* b, const char* e) { - return tryTo(b, e).thenOrThrow( - [](Tgt res) { return res; }, - [=](ConversionCode code) { - return makeConversionError(code, StringPiece(b, e)); - }); -} - -/******************************************************************************* - * Conversions from string types to arithmetic types. - ******************************************************************************/ - -/** - * Parsing strings to numeric types. - */ -template -FOLLY_NODISCARD inline typename std::enable_if< - std::is_arithmetic::value, - Expected>::type -parseTo(StringPiece src, Tgt& out) { - return detail::convertTo(&src).then( - [&](Tgt res) { return void(out = res), src; }); -} - -/******************************************************************************* - * Integral / Floating Point to integral / Floating Point - ******************************************************************************/ - -namespace detail { - -/** - * Bool to integral/float doesn't need any special checks, and this - * overload means we aren't trying to see if a bool is less than - * an integer. - */ -template -typename std::enable_if< - !std::is_same::value && - (std::is_integral::value || std::is_floating_point::value), - Expected>::type -convertTo(const bool& value) noexcept { - return static_cast(value ? 1 : 0); -} - -/** - * Checked conversion from integral to integral. The checks are only - * performed when meaningful, e.g. conversion from int to long goes - * unchecked. - */ -template -typename std::enable_if< - std::is_integral::value && !std::is_same::value && - !std::is_same::value && std::is_integral::value, - Expected>::type -convertTo(const Src& value) noexcept { - if /* constexpr */ ( - std::make_unsigned_t(std::numeric_limits::max()) < - std::make_unsigned_t(std::numeric_limits::max())) { - if (greater_than::max()>(value)) { - return makeUnexpected(ConversionCode::ARITH_POSITIVE_OVERFLOW); - } - } - if /* constexpr */ ( - std::is_signed::value && - (!std::is_signed::value || sizeof(Src) > sizeof(Tgt))) { - if (less_than::min()>(value)) { - return makeUnexpected(ConversionCode::ARITH_NEGATIVE_OVERFLOW); - } - } - return static_cast(value); -} - -/** - * Checked conversion from floating to floating. The checks are only - * performed when meaningful, e.g. conversion from float to double goes - * unchecked. - */ -template -typename std::enable_if< - std::is_floating_point::value && std::is_floating_point::value && - !std::is_same::value, - Expected>::type -convertTo(const Src& value) noexcept { - if /* constexpr */ ( - std::numeric_limits::max() < std::numeric_limits::max()) { - if (value > std::numeric_limits::max()) { - return makeUnexpected(ConversionCode::ARITH_POSITIVE_OVERFLOW); - } - if (value < std::numeric_limits::lowest()) { - return makeUnexpected(ConversionCode::ARITH_NEGATIVE_OVERFLOW); - } - } - return static_cast(value); -} - -/** - * Check if a floating point value can safely be converted to an - * integer value without triggering undefined behaviour. - */ -template -inline typename std::enable_if< - std::is_floating_point::value && std::is_integral::value && - !std::is_same::value, - bool>::type -checkConversion(const Src& value) { - constexpr Src tgtMaxAsSrc = static_cast(std::numeric_limits::max()); - constexpr Src tgtMinAsSrc = static_cast(std::numeric_limits::min()); - if (value >= tgtMaxAsSrc) { - if (value > tgtMaxAsSrc) { - return false; - } - const Src mmax = folly::nextafter(tgtMaxAsSrc, Src()); - if (static_cast(value - mmax) > - std::numeric_limits::max() - static_cast(mmax)) { - return false; - } - } else if (std::is_signed::value && value <= tgtMinAsSrc) { - if (value < tgtMinAsSrc) { - return false; - } - const Src mmin = folly::nextafter(tgtMinAsSrc, Src()); - if (static_cast(value - mmin) < - std::numeric_limits::min() - static_cast(mmin)) { - return false; - } - } - return true; -} - -// Integers can always safely be converted to floating point values -template -constexpr typename std::enable_if< - std::is_integral::value && std::is_floating_point::value, - bool>::type -checkConversion(const Src&) { - return true; -} - -// Also, floating point values can always be safely converted to bool -// Per the standard, any floating point value that is not zero will yield true -template -constexpr typename std::enable_if< - std::is_floating_point::value && std::is_same::value, - bool>::type -checkConversion(const Src&) { - return true; -} - -/** - * Checked conversion from integral to floating point and back. The - * result must be convertible back to the source type without loss of - * precision. This seems Draconian but sometimes is what's needed, and - * complements existing routines nicely. For various rounding - * routines, see . - */ -template -typename std::enable_if< - (std::is_integral::value && std::is_floating_point::value) || - (std::is_floating_point::value && std::is_integral::value), - Expected>::type -convertTo(const Src& value) noexcept { - if (LIKELY(checkConversion(value))) { - Tgt result = static_cast(value); - if (LIKELY(checkConversion(result))) { - Src witness = static_cast(result); - if (LIKELY(value == witness)) { - return result; - } - } - } - return makeUnexpected(ConversionCode::ARITH_LOSS_OF_PRECISION); -} - -template -inline std::string errorValue(const Src& value) { - return to("(", pretty_name(), ") ", value); -} - -template -using IsArithToArith = bool_constant< - !std::is_same::value && !std::is_same::value && - std::is_arithmetic::value && std::is_arithmetic::value>; - -} // namespace detail - -template -typename std::enable_if< - detail::IsArithToArith::value, - Expected>::type -tryTo(const Src& value) noexcept { - return detail::convertTo(value); -} - -template -typename std::enable_if::value, Tgt>::type to( - const Src& value) { - return tryTo(value).thenOrThrow( - [](Tgt res) { return res; }, - [&](ConversionCode e) { - return makeConversionError(e, detail::errorValue(value)); - }); -} - -/******************************************************************************* - * Custom Conversions - * - * Any type can be used with folly::to by implementing parseTo. The - * implementation should be provided in the namespace of the type to facilitate - * argument-dependent lookup: - * - * namespace other_namespace { - * ::folly::Expected<::folly::StringPiece, SomeErrorCode> - * parseTo(::folly::StringPiece, OtherType&) noexcept; - * } - ******************************************************************************/ -template -FOLLY_NODISCARD typename std::enable_if< - std::is_enum::value, - Expected>::type -parseTo(StringPiece in, T& out) noexcept { - typename std::underlying_type::type tmp{}; - auto restOrError = parseTo(in, tmp); - out = static_cast(tmp); // Harmless if parseTo fails - return restOrError; -} - -FOLLY_NODISCARD -inline Expected parseTo( - StringPiece in, - StringPiece& out) noexcept { - out = in; - return StringPiece{in.end(), in.end()}; -} - -FOLLY_NODISCARD -inline Expected parseTo( - StringPiece in, - std::string& out) { - out.clear(); - out.append(in.data(), in.size()); // TODO try/catch? - return StringPiece{in.end(), in.end()}; -} - -FOLLY_NODISCARD -inline Expected parseTo( - StringPiece in, - fbstring& out) { - out.clear(); - out.append(in.data(), in.size()); // TODO try/catch? - return StringPiece{in.end(), in.end()}; -} - -namespace detail { -template -using ParseToResult = decltype(parseTo(StringPiece{}, std::declval())); - -struct CheckTrailingSpace { - Expected operator()(StringPiece sp) const { - auto e = enforceWhitespaceErr(sp); - if (UNLIKELY(e != ConversionCode::SUCCESS)) { - return makeUnexpected(e); - } - return unit; - } -}; - -template -struct ReturnUnit { - template - constexpr Expected operator()(T&&) const { - return unit; - } -}; - -// Older versions of the parseTo customization point threw on error and -// returned void. Handle that. -template -inline typename std::enable_if< - std::is_void>::value, - Expected>::type -parseToWrap(StringPiece sp, Tgt& out) { - parseTo(sp, out); - return StringPiece(sp.end(), sp.end()); -} - -template -inline typename std::enable_if< - !std::is_void>::value, - ParseToResult>::type -parseToWrap(StringPiece sp, Tgt& out) { - return parseTo(sp, out); -} - -template -using ParseToError = ExpectedErrorType()))>; - -} // namespace detail - -/** - * String or StringPiece to target conversion. Accepts leading and trailing - * whitespace, but no non-space trailing characters. - */ - -template -inline typename std::enable_if< - !std::is_same::value, - Expected>>::type -tryTo(StringPiece src) { - Tgt result{}; - using Error = detail::ParseToError; - using Check = typename std::conditional< - std::is_arithmetic::value, - detail::CheckTrailingSpace, - detail::ReturnUnit>::type; - return parseTo(src, result).then(Check(), [&](Unit) { - return std::move(result); - }); -} - -template -inline typename std::enable_if< - IsSomeString::value && !std::is_same::value, - Tgt>::type -to(Src const& src) { - return to(StringPiece(src.data(), src.size())); -} - -template -inline - typename std::enable_if::value, Tgt>::type - to(StringPiece src) { - Tgt result{}; - using Error = detail::ParseToError; - using Check = typename std::conditional< - std::is_arithmetic::value, - detail::CheckTrailingSpace, - detail::ReturnUnit>::type; - auto tmp = detail::parseToWrap(src, result); - return tmp - .thenOrThrow( - Check(), - [&](Error e) { throw_exception(makeConversionError(e, src)); }) - .thenOrThrow( - [&](Unit) { return std::move(result); }, - [&](Error e) { - throw_exception(makeConversionError(e, tmp.value())); - }); -} - -/** - * tryTo/to that take the strings by pointer so the caller gets information - * about how much of the string was consumed by the conversion. These do not - * check for trailing whitepsace. - */ -template -Expected> tryTo(StringPiece* src) { - Tgt result; - return parseTo(*src, result).then([&, src](StringPiece sp) -> Tgt { - *src = sp; - return std::move(result); - }); -} - -template -Tgt to(StringPiece* src) { - Tgt result{}; - using Error = detail::ParseToError; - return parseTo(*src, result) - .thenOrThrow( - [&, src](StringPiece sp) -> Tgt { - *src = sp; - return std::move(result); - }, - [=](Error e) { return makeConversionError(e, *src); }); -} - -/******************************************************************************* - * Enum to anything and back - ******************************************************************************/ - -template -typename std::enable_if< - std::is_enum::value && !std::is_same::value && - !std::is_convertible::value, - Expected>::type -tryTo(const Src& value) { - return tryTo(to_underlying(value)); -} - -template -typename std::enable_if< - !std::is_convertible::value && std::is_enum::value && - !std::is_same::value, - Expected>::type -tryTo(const Src& value) { - using I = typename std::underlying_type::type; - return tryTo(value).then([](I i) { return static_cast(i); }); -} - -template -typename std::enable_if< - std::is_enum::value && !std::is_same::value && - !std::is_convertible::value, - Tgt>::type -to(const Src& value) { - return to(to_underlying(value)); -} - -template -typename std::enable_if< - !std::is_convertible::value && std::is_enum::value && - !std::is_same::value, - Tgt>::type -to(const Src& value) { - return static_cast(to::type>(value)); -} - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/CppAttributes.h b/ios/Pods/Flipper-Folly/folly/CppAttributes.h deleted file mode 100644 index 75bf8c4..0000000 --- a/ios/Pods/Flipper-Folly/folly/CppAttributes.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * GCC compatible wrappers around clang attributes. - * - * @author Dominik Gabi - */ - -#pragma once - -#include - -#ifndef __has_attribute -#define FOLLY_HAS_ATTRIBUTE(x) 0 -#else -#define FOLLY_HAS_ATTRIBUTE(x) __has_attribute(x) -#endif - -#ifndef __has_cpp_attribute -#define FOLLY_HAS_CPP_ATTRIBUTE(x) 0 -#else -#define FOLLY_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) -#endif - -#ifndef __has_extension -#define FOLLY_HAS_EXTENSION(x) 0 -#else -#define FOLLY_HAS_EXTENSION(x) __has_extension(x) -#endif - -/** - * Fallthrough to indicate that `break` was left out on purpose in a switch - * statement, e.g. - * - * switch (n) { - * case 22: - * case 33: // no warning: no statements between case labels - * f(); - * case 44: // warning: unannotated fall-through - * g(); - * FOLLY_FALLTHROUGH; // no warning: annotated fall-through - * } - */ -#if FOLLY_HAS_CPP_ATTRIBUTE(fallthrough) -#define FOLLY_FALLTHROUGH [[fallthrough]] -#elif FOLLY_HAS_CPP_ATTRIBUTE(clang::fallthrough) -#define FOLLY_FALLTHROUGH [[clang::fallthrough]] -#elif FOLLY_HAS_CPP_ATTRIBUTE(gnu::fallthrough) -#define FOLLY_FALLTHROUGH [[gnu::fallthrough]] -#else -#define FOLLY_FALLTHROUGH -#endif - -/** - * Maybe_unused indicates that a function, variable or parameter might or - * might not be used, e.g. - * - * int foo(FOLLY_MAYBE_UNUSED int x) { - * #ifdef USE_X - * return x; - * #else - * return 0; - * #endif - * } - */ -#if FOLLY_HAS_CPP_ATTRIBUTE(maybe_unused) -#define FOLLY_MAYBE_UNUSED [[maybe_unused]] -#elif FOLLY_HAS_ATTRIBUTE(__unused__) || __GNUC__ -#define FOLLY_MAYBE_UNUSED __attribute__((__unused__)) -#else -#define FOLLY_MAYBE_UNUSED -#endif - -/** - * Nullable indicates that a return value or a parameter may be a `nullptr`, - * e.g. - * - * int* FOLLY_NULLABLE foo(int* a, int* FOLLY_NULLABLE b) { - * if (*a > 0) { // safe dereference - * return nullptr; - * } - * if (*b < 0) { // unsafe dereference - * return *a; - * } - * if (b != nullptr && *b == 1) { // safe checked dereference - * return new int(1); - * } - * return nullptr; - * } - * - * Ignores Clang's -Wnullability-extension since it correctly handles the case - * where the extension is not present. - */ -#if FOLLY_HAS_EXTENSION(nullability) -#define FOLLY_NULLABLE \ - FOLLY_PUSH_WARNING \ - FOLLY_CLANG_DISABLE_WARNING("-Wnullability-extension") \ - _Nullable FOLLY_POP_WARNING -#define FOLLY_NONNULL \ - FOLLY_PUSH_WARNING \ - FOLLY_CLANG_DISABLE_WARNING("-Wnullability-extension") \ - _Nonnull FOLLY_POP_WARNING -#else -#define FOLLY_NULLABLE -#define FOLLY_NONNULL -#endif - -/** - * "Cold" indicates to the compiler that a function is only expected to be - * called from unlikely code paths. It can affect decisions made by the - * optimizer both when processing the function body and when analyzing - * call-sites. - */ -#if __GNUC__ -#define FOLLY_COLD __attribute__((__cold__)) -#else -#define FOLLY_COLD -#endif - -/** - * no_unique_address indicates that a member variable can be optimized to - * occupy no space, rather than the minimum 1-byte used by default. - * - * class Empty {}; - * - * class NonEmpty1 { - * FOLLY_NO_UNIQUE_ADDRESS Empty e; - * int f; - * }; - * - * class NonEmpty2 { - * Empty e; - * int f; - * }; - * - * sizeof(NonEmpty1); // may be == sizeof(int) - * sizeof(NonEmpty2); // must be > sizeof(int) - */ -#if FOLLY_HAS_CPP_ATTRIBUTE(no_unique_address) -#define FOLLY_ATTR_NO_UNIQUE_ADDRESS [[no_unique_address]] -#else -#define FOLLY_ATTR_NO_UNIQUE_ADDRESS -#endif diff --git a/ios/Pods/Flipper-Folly/folly/CpuId.h b/ios/Pods/Flipper-Folly/folly/CpuId.h deleted file mode 100644 index 517ccb5..0000000 --- a/ios/Pods/Flipper-Folly/folly/CpuId.h +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include - -#include - -#ifdef _MSC_VER -#include -#endif - -namespace folly { - -/** - * Identification of an Intel CPU. - * Supports CPUID feature flags (EAX=1) and extended features (EAX=7, ECX=0). - * Values from - * http://www.intel.com/content/www/us/en/processors/processor-identification-cpuid-instruction-note.html - */ -class CpuId { - public: - // Always inline in order for this to be usable from a __ifunc__. - // In shared library mode, a __ifunc__ runs at relocation time, while the - // PLT hasn't been fully populated yet; thus, ifuncs cannot use symbols - // with potentially external linkage. (This issue is less likely in opt - // mode since inlining happens more likely, and it doesn't happen for - // statically linked binaries which don't depend on the PLT) - FOLLY_ALWAYS_INLINE CpuId() { -#if defined(_MSC_VER) && (FOLLY_X64 || defined(_M_IX86)) - int reg[4]; - __cpuid(static_cast(reg), 0); - const int n = reg[0]; - if (n >= 1) { - __cpuid(static_cast(reg), 1); - f1c_ = uint32_t(reg[2]); - f1d_ = uint32_t(reg[3]); - } - if (n >= 7) { - __cpuidex(static_cast(reg), 7, 0); - f7b_ = uint32_t(reg[1]); - f7c_ = uint32_t(reg[2]); - } -#elif defined(__i386__) && defined(__PIC__) && !defined(__clang__) && \ - defined(__GNUC__) - // The following block like the normal cpuid branch below, but gcc - // reserves ebx for use of its pic register so we must specially - // handle the save and restore to avoid clobbering the register - uint32_t n; - __asm__( - "pushl %%ebx\n\t" - "cpuid\n\t" - "popl %%ebx\n\t" - : "=a"(n) - : "a"(0) - : "ecx", "edx"); - if (n >= 1) { - uint32_t f1a; - __asm__( - "pushl %%ebx\n\t" - "cpuid\n\t" - "popl %%ebx\n\t" - : "=a"(f1a), "=c"(f1c_), "=d"(f1d_) - : "a"(1) - :); - } - if (n >= 7) { - __asm__( - "pushl %%ebx\n\t" - "cpuid\n\t" - "movl %%ebx, %%eax\n\r" - "popl %%ebx" - : "=a"(f7b_), "=c"(f7c_) - : "a"(7), "c"(0) - : "edx"); - } -#elif FOLLY_X64 || defined(__i386__) - uint32_t n; - __asm__("cpuid" : "=a"(n) : "a"(0) : "ebx", "ecx", "edx"); - if (n >= 1) { - uint32_t f1a; - __asm__("cpuid" : "=a"(f1a), "=c"(f1c_), "=d"(f1d_) : "a"(1) : "ebx"); - } - if (n >= 7) { - uint32_t f7a; - __asm__("cpuid" - : "=a"(f7a), "=b"(f7b_), "=c"(f7c_) - : "a"(7), "c"(0) - : "edx"); - } -#endif - } - -#define FOLLY_DETAIL_CPUID_X(name, r, bit) \ - FOLLY_ALWAYS_INLINE bool name() const { \ - return ((r) & (1U << bit)) != 0; \ - } - -// cpuid(1): Processor Info and Feature Bits. -#define FOLLY_DETAIL_CPUID_C(name, bit) FOLLY_DETAIL_CPUID_X(name, f1c_, bit) - FOLLY_DETAIL_CPUID_C(sse3, 0) - FOLLY_DETAIL_CPUID_C(pclmuldq, 1) - FOLLY_DETAIL_CPUID_C(dtes64, 2) - FOLLY_DETAIL_CPUID_C(monitor, 3) - FOLLY_DETAIL_CPUID_C(dscpl, 4) - FOLLY_DETAIL_CPUID_C(vmx, 5) - FOLLY_DETAIL_CPUID_C(smx, 6) - FOLLY_DETAIL_CPUID_C(eist, 7) - FOLLY_DETAIL_CPUID_C(tm2, 8) - FOLLY_DETAIL_CPUID_C(ssse3, 9) - FOLLY_DETAIL_CPUID_C(cnxtid, 10) - FOLLY_DETAIL_CPUID_C(fma, 12) - FOLLY_DETAIL_CPUID_C(cx16, 13) - FOLLY_DETAIL_CPUID_C(xtpr, 14) - FOLLY_DETAIL_CPUID_C(pdcm, 15) - FOLLY_DETAIL_CPUID_C(pcid, 17) - FOLLY_DETAIL_CPUID_C(dca, 18) - FOLLY_DETAIL_CPUID_C(sse41, 19) - FOLLY_DETAIL_CPUID_C(sse42, 20) - FOLLY_DETAIL_CPUID_C(x2apic, 21) - FOLLY_DETAIL_CPUID_C(movbe, 22) - FOLLY_DETAIL_CPUID_C(popcnt, 23) - FOLLY_DETAIL_CPUID_C(tscdeadline, 24) - FOLLY_DETAIL_CPUID_C(aes, 25) - FOLLY_DETAIL_CPUID_C(xsave, 26) - FOLLY_DETAIL_CPUID_C(osxsave, 27) - FOLLY_DETAIL_CPUID_C(avx, 28) - FOLLY_DETAIL_CPUID_C(f16c, 29) - FOLLY_DETAIL_CPUID_C(rdrand, 30) -#undef FOLLY_DETAIL_CPUID_C -#define FOLLY_DETAIL_CPUID_D(name, bit) FOLLY_DETAIL_CPUID_X(name, f1d_, bit) - FOLLY_DETAIL_CPUID_D(fpu, 0) - FOLLY_DETAIL_CPUID_D(vme, 1) - FOLLY_DETAIL_CPUID_D(de, 2) - FOLLY_DETAIL_CPUID_D(pse, 3) - FOLLY_DETAIL_CPUID_D(tsc, 4) - FOLLY_DETAIL_CPUID_D(msr, 5) - FOLLY_DETAIL_CPUID_D(pae, 6) - FOLLY_DETAIL_CPUID_D(mce, 7) - FOLLY_DETAIL_CPUID_D(cx8, 8) - FOLLY_DETAIL_CPUID_D(apic, 9) - FOLLY_DETAIL_CPUID_D(sep, 11) - FOLLY_DETAIL_CPUID_D(mtrr, 12) - FOLLY_DETAIL_CPUID_D(pge, 13) - FOLLY_DETAIL_CPUID_D(mca, 14) - FOLLY_DETAIL_CPUID_D(cmov, 15) - FOLLY_DETAIL_CPUID_D(pat, 16) - FOLLY_DETAIL_CPUID_D(pse36, 17) - FOLLY_DETAIL_CPUID_D(psn, 18) - FOLLY_DETAIL_CPUID_D(clfsh, 19) - FOLLY_DETAIL_CPUID_D(ds, 21) - FOLLY_DETAIL_CPUID_D(acpi, 22) - FOLLY_DETAIL_CPUID_D(mmx, 23) - FOLLY_DETAIL_CPUID_D(fxsr, 24) - FOLLY_DETAIL_CPUID_D(sse, 25) - FOLLY_DETAIL_CPUID_D(sse2, 26) - FOLLY_DETAIL_CPUID_D(ss, 27) - FOLLY_DETAIL_CPUID_D(htt, 28) - FOLLY_DETAIL_CPUID_D(tm, 29) - FOLLY_DETAIL_CPUID_D(pbe, 31) -#undef FOLLY_DETAIL_CPUID_D - - // cpuid(7): Extended Features. -#define FOLLY_DETAIL_CPUID_B(name, bit) FOLLY_DETAIL_CPUID_X(name, f7b_, bit) - FOLLY_DETAIL_CPUID_B(bmi1, 3) - FOLLY_DETAIL_CPUID_B(hle, 4) - FOLLY_DETAIL_CPUID_B(avx2, 5) - FOLLY_DETAIL_CPUID_B(smep, 7) - FOLLY_DETAIL_CPUID_B(bmi2, 8) - FOLLY_DETAIL_CPUID_B(erms, 9) - FOLLY_DETAIL_CPUID_B(invpcid, 10) - FOLLY_DETAIL_CPUID_B(rtm, 11) - FOLLY_DETAIL_CPUID_B(mpx, 14) - FOLLY_DETAIL_CPUID_B(avx512f, 16) - FOLLY_DETAIL_CPUID_B(avx512dq, 17) - FOLLY_DETAIL_CPUID_B(rdseed, 18) - FOLLY_DETAIL_CPUID_B(adx, 19) - FOLLY_DETAIL_CPUID_B(smap, 20) - FOLLY_DETAIL_CPUID_B(avx512ifma, 21) - FOLLY_DETAIL_CPUID_B(pcommit, 22) - FOLLY_DETAIL_CPUID_B(clflushopt, 23) - FOLLY_DETAIL_CPUID_B(clwb, 24) - FOLLY_DETAIL_CPUID_B(avx512pf, 26) - FOLLY_DETAIL_CPUID_B(avx512er, 27) - FOLLY_DETAIL_CPUID_B(avx512cd, 28) - FOLLY_DETAIL_CPUID_B(sha, 29) - FOLLY_DETAIL_CPUID_B(avx512bw, 30) - FOLLY_DETAIL_CPUID_B(avx512vl, 31) -#undef FOLLY_DETAIL_CPUID_B -#define FOLLY_DETAIL_CPUID_C(name, bit) FOLLY_DETAIL_CPUID_X(name, f7c_, bit) - FOLLY_DETAIL_CPUID_C(prefetchwt1, 0) - FOLLY_DETAIL_CPUID_C(avx512vbmi, 1) -#undef FOLLY_DETAIL_CPUID_C - -#undef FOLLY_DETAIL_CPUID_X - - private: - uint32_t f1c_ = 0; - uint32_t f1d_ = 0; - uint32_t f7b_ = 0; - uint32_t f7c_ = 0; -}; - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/DefaultKeepAliveExecutor.h b/ios/Pods/Flipper-Folly/folly/DefaultKeepAliveExecutor.h deleted file mode 100644 index f483ee2..0000000 --- a/ios/Pods/Flipper-Folly/folly/DefaultKeepAliveExecutor.h +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include - -#include - -#include -#include - -namespace folly { - -/// An Executor accepts units of work with add(), which should be -/// threadsafe. -class DefaultKeepAliveExecutor : public virtual Executor { - public: - virtual ~DefaultKeepAliveExecutor() { - DCHECK(!keepAlive_); - } - - folly::Executor::KeepAlive<> weakRef() { - return WeakRef::create(controlBlock_, this); - } - - protected: - void joinKeepAlive() { - DCHECK(keepAlive_); - keepAlive_.reset(); - keepAliveReleaseBaton_.wait(); - } - - void joinAndResetKeepAlive() { - joinKeepAlive(); - auto keepAliveCount = - controlBlock_->keepAliveCount_.exchange(1, std::memory_order_relaxed); - DCHECK_EQ(keepAliveCount, 0); - keepAliveReleaseBaton_.reset(); - keepAlive_ = makeKeepAlive(this); - } - - private: - struct ControlBlock { - std::atomic keepAliveCount_{1}; - }; - - class WeakRef : public Executor { - public: - static folly::Executor::KeepAlive<> create( - std::shared_ptr controlBlock, - Executor* executor) { - return makeKeepAlive(new WeakRef(std::move(controlBlock), executor)); - } - - void add(Func f) override { - if (auto executor = lock()) { - executor->add(std::move(f)); - } - } - - void addWithPriority(Func f, int8_t priority) override { - if (auto executor = lock()) { - executor->addWithPriority(std::move(f), priority); - } - } - - virtual uint8_t getNumPriorities() const override { - return numPriorities_; - } - - private: - WeakRef(std::shared_ptr controlBlock, Executor* executor) - : controlBlock_(std::move(controlBlock)), - executor_(executor), - numPriorities_(executor->getNumPriorities()) {} - - bool keepAliveAcquire() override { - auto keepAliveCount = - keepAliveCount_.fetch_add(1, std::memory_order_relaxed); - // We should never increment from 0 - DCHECK(keepAliveCount > 0); - return true; - } - - void keepAliveRelease() override { - auto keepAliveCount = - keepAliveCount_.fetch_sub(1, std::memory_order_acq_rel); - DCHECK(keepAliveCount >= 1); - - if (keepAliveCount == 1) { - delete this; - } - } - - folly::Executor::KeepAlive<> lock() { - auto controlBlock = - controlBlock_->keepAliveCount_.load(std::memory_order_relaxed); - do { - if (controlBlock == 0) { - return {}; - } - } while (!controlBlock_->keepAliveCount_.compare_exchange_weak( - controlBlock, - controlBlock + 1, - std::memory_order_release, - std::memory_order_relaxed)); - - return makeKeepAlive(executor_); - } - - std::atomic keepAliveCount_{1}; - - std::shared_ptr controlBlock_; - Executor* executor_; - - uint8_t numPriorities_; - }; - - bool keepAliveAcquire() override { - auto keepAliveCount = - controlBlock_->keepAliveCount_.fetch_add(1, std::memory_order_relaxed); - // We should never increment from 0 - DCHECK(keepAliveCount > 0); - return true; - } - - void keepAliveRelease() override { - auto keepAliveCount = - controlBlock_->keepAliveCount_.fetch_sub(1, std::memory_order_acquire); - DCHECK(keepAliveCount >= 1); - - if (keepAliveCount == 1) { - keepAliveReleaseBaton_.post(); // std::memory_order_release - } - } - - std::shared_ptr controlBlock_{std::make_shared()}; - Baton<> keepAliveReleaseBaton_; - KeepAlive keepAlive_{makeKeepAlive(this)}; -}; - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/Demangle.cpp b/ios/Pods/Flipper-Folly/folly/Demangle.cpp deleted file mode 100644 index 0df902c..0000000 --- a/ios/Pods/Flipper-Folly/folly/Demangle.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include -#include - -#include -#include -#include - -#if FOLLY_DETAIL_HAVE_DEMANGLE_H - -#include - -#endif - -namespace folly { - -#if FOLLY_DETAIL_HAVE_DEMANGLE_H - -fbstring demangle(const char* name) { - if (!name) { - return fbstring(); - } -#ifdef FOLLY_DEMANGLE_MAX_SYMBOL_SIZE - // GCC's __cxa_demangle() uses on-stack data structures for the - // parser state which are linear in the number of components of the - // symbol. For extremely long symbols, this can cause a stack - // overflow. We set an arbitrary symbol length limit above which we - // just return the mangled name. - size_t mangledLen = strlen(name); - if (mangledLen > FOLLY_DEMANGLE_MAX_SYMBOL_SIZE) { - return fbstring(name, mangledLen); - } -#endif - - int status; - size_t len = 0; - // malloc() memory for the demangled type name - char* demangled = abi::__cxa_demangle(name, nullptr, &len, &status); - if (status != 0) { - return name; - } - // len is the length of the buffer (including NUL terminator and maybe - // other junk) - return fbstring(demangled, strlen(demangled), len, AcquireMallocatedString()); -} - -namespace { - -struct DemangleBuf { - char* dest; - size_t remaining; - size_t total; -}; - -void demangleCallback(const char* str, size_t size, void* p) { - DemangleBuf* buf = static_cast(p); - size_t n = std::min(buf->remaining, size); - memcpy(buf->dest, str, n); - buf->dest += n; - buf->remaining -= n; - buf->total += size; -} - -} // namespace - -size_t demangle(const char* name, char* out, size_t outSize) { -#ifdef FOLLY_DEMANGLE_MAX_SYMBOL_SIZE - size_t mangledLen = strlen(name); - if (mangledLen > FOLLY_DEMANGLE_MAX_SYMBOL_SIZE) { - if (outSize) { - size_t n = std::min(mangledLen, outSize - 1); - memcpy(out, name, n); - out[n] = '\0'; - } - return mangledLen; - } -#endif - - DemangleBuf dbuf; - dbuf.dest = out; - dbuf.remaining = outSize ? outSize - 1 : 0; // leave room for null term - dbuf.total = 0; - - // Unlike most library functions, this returns 1 on success and 0 on failure - int status = - detail::cplus_demangle_v3_callback_wrapper(name, demangleCallback, &dbuf); - if (status == 0) { // failed, return original - return folly::strlcpy(out, name, outSize); - } - if (outSize != 0) { - *dbuf.dest = '\0'; - } - return dbuf.total; -} - -#else - -fbstring demangle(const char* name) { - return name; -} - -size_t demangle(const char* name, char* out, size_t outSize) { - return folly::strlcpy(out, name, outSize); -} - -#endif - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/Demangle.h b/ios/Pods/Flipper-Folly/folly/Demangle.h deleted file mode 100644 index da13fb1..0000000 --- a/ios/Pods/Flipper-Folly/folly/Demangle.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include - -namespace folly { - -/** - * Return the demangled (prettyfied) version of a C++ type. - * - * This function tries to produce a human-readable type, but the type name will - * be returned unchanged in case of error or if demangling isn't supported on - * your system. - * - * Use for debugging -- do not rely on demangle() returning anything useful. - * - * This function may allocate memory (and therefore throw std::bad_alloc). - */ -fbstring demangle(const char* name); -inline fbstring demangle(const std::type_info& type) { - return demangle(type.name()); -} - -/** - * Return the demangled (prettyfied) version of a C++ type in a user-provided - * buffer. - * - * The semantics are the same as for snprintf or strlcpy: bufSize is the size - * of the buffer, the string is always null-terminated, and the return value is - * the number of characters (not including the null terminator) that would have - * been written if the buffer was big enough. (So a return value >= bufSize - * indicates that the output was truncated) - * - * This function does not allocate memory and is async-signal-safe. - * - * Note that the underlying function for the fbstring-returning demangle is - * somewhat standard (abi::__cxa_demangle, which uses malloc), the underlying - * function for this version is less so (cplus_demangle_v3_callback from - * libiberty), so it is possible for the fbstring version to work, while this - * version returns the original, mangled name. - */ -size_t demangle(const char* name, char* out, size_t outSize); -inline size_t demangle(const std::type_info& type, char* buf, size_t bufSize) { - return demangle(type.name(), buf, bufSize); -} - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/DiscriminatedPtr.h b/ios/Pods/Flipper-Folly/folly/DiscriminatedPtr.h deleted file mode 100644 index 0f49bd6..0000000 --- a/ios/Pods/Flipper-Folly/folly/DiscriminatedPtr.h +++ /dev/null @@ -1,247 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Discriminated pointer: Type-safe pointer to one of several types. - * - * Similar to boost::variant, but has no space overhead over a raw pointer, as - * it relies on the fact that (on x86_64) there are 16 unused bits in a - * pointer. - * - * @author Tudor Bosman (tudorb@fb.com) - */ - -#pragma once - -#include -#include - -#include - -#include -#include -#include - -#if !FOLLY_X64 && !FOLLY_AARCH64 && !FOLLY_PPC64 -#error "DiscriminatedPtr is x64, arm64 and ppc64 specific code." -#endif - -namespace folly { - -/** - * Discriminated pointer. - * - * Given a list of types, a DiscriminatedPtr may point to an object - * of one of the given types, or may be empty. DiscriminatedPtr is type-safe: - * you may only get a pointer to the type that you put in, otherwise get - * throws an exception (and get_nothrow returns nullptr) - * - * This pointer does not do any kind of lifetime management -- it's not a - * "smart" pointer. You are responsible for deallocating any memory used - * to hold pointees, if necessary. - */ -template -class DiscriminatedPtr { - // <, not <=, as our indexes are 1-based (0 means "empty") - static_assert( - sizeof...(Types) < std::numeric_limits::max(), - "too many types"); - - public: - /** - * Create an empty DiscriminatedPtr. - */ - DiscriminatedPtr() : data_(0) {} - - /** - * Create a DiscriminatedPtr that points to an object of type T. - * Fails at compile time if T is not a valid type (listed in Types) - */ - template - explicit DiscriminatedPtr(T* ptr) { - set(ptr, typeIndex()); - } - - /** - * Set this DiscriminatedPtr to point to an object of type T. - * Fails at compile time if T is not a valid type (listed in Types) - */ - template - void set(T* ptr) { - set(ptr, typeIndex()); - } - - /** - * Get a pointer to the object that this DiscriminatedPtr points to, if it is - * of type T. Fails at compile time if T is not a valid type (listed in - * Types), and returns nullptr if this DiscriminatedPtr is empty or points to - * an object of a different type. - */ - template - T* get_nothrow() noexcept { - void* p = LIKELY(hasType()) ? ptr() : nullptr; - return static_cast(p); - } - - template - const T* get_nothrow() const noexcept { - const void* p = LIKELY(hasType()) ? ptr() : nullptr; - return static_cast(p); - } - - /** - * Get a pointer to the object that this DiscriminatedPtr points to, if it is - * of type T. Fails at compile time if T is not a valid type (listed in - * Types), and throws std::invalid_argument if this DiscriminatedPtr is empty - * or points to an object of a different type. - */ - template - T* get() { - if (UNLIKELY(!hasType())) { - throw std::invalid_argument("Invalid type"); - } - return static_cast(ptr()); - } - - template - const T* get() const { - if (UNLIKELY(!hasType())) { - throw std::invalid_argument("Invalid type"); - } - return static_cast(ptr()); - } - - /** - * Return true iff this DiscriminatedPtr is empty. - */ - bool empty() const { - return index() == 0; - } - - /** - * Return true iff the object pointed by this DiscriminatedPtr has type T, - * false otherwise. Fails at compile time if T is not a valid type (listed - * in Types...) - */ - template - bool hasType() const { - return index() == typeIndex(); - } - - /** - * Clear this DiscriminatedPtr, making it empty. - */ - void clear() { - data_ = 0; - } - - /** - * Assignment operator from a pointer of type T. - */ - template - DiscriminatedPtr& operator=(T* ptr) { - set(ptr); - return *this; - } - - /** - * Apply a visitor to this object, calling the appropriate overload for - * the type currently stored in DiscriminatedPtr. Throws invalid_argument - * if the DiscriminatedPtr is empty. - * - * The visitor must meet the following requirements: - * - * - The visitor must allow invocation as a function by overloading - * operator(), unambiguously accepting all values of type T* (or const T*) - * for all T in Types... - * - All operations of the function object on T* (or const T*) must - * return the same type (or a static_assert will fire). - */ - template - typename dptr_detail::VisitorResult::type apply(V&& visitor) { - size_t n = index(); - if (n == 0) { - throw std::invalid_argument("Empty DiscriminatedPtr"); - } - return dptr_detail::ApplyVisitor()( - n, std::forward(visitor), ptr()); - } - - template - typename dptr_detail::ConstVisitorResult::type apply( - V&& visitor) const { - size_t n = index(); - if (n == 0) { - throw std::invalid_argument("Empty DiscriminatedPtr"); - } - return dptr_detail::ApplyConstVisitor()( - n, std::forward(visitor), ptr()); - } - - private: - /** - * Get the 1-based type index of T in Types. - */ - template - uint16_t typeIndex() const { - return uint16_t(dptr_detail::GetTypeIndex::value); - } - - uint16_t index() const { - return data_ >> 48; - } - void* ptr() const { - return reinterpret_cast(data_ & ((1ULL << 48) - 1)); - } - - void set(void* p, uint16_t v) { - uintptr_t ip = reinterpret_cast(p); - CHECK(!(ip >> 48)); - ip |= static_cast(v) << 48; - data_ = ip; - } - - /** - * We store a pointer in the least significant 48 bits of data_, and a type - * index (0 = empty, or 1-based index in Types) in the most significant 16 - * bits. We rely on the fact that pointers have their most significant 16 - * bits clear on x86_64. - */ - uintptr_t data_; -}; - -template -decltype(auto) apply_visitor( - Visitor&& visitor, - const DiscriminatedPtr& variant) { - return variant.apply(std::forward(visitor)); -} - -template -decltype(auto) apply_visitor( - Visitor&& visitor, - DiscriminatedPtr& variant) { - return variant.apply(std::forward(visitor)); -} - -template -decltype(auto) apply_visitor( - Visitor&& visitor, - DiscriminatedPtr&& variant) { - return variant.apply(std::forward(visitor)); -} - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/DynamicConverter.h b/ios/Pods/Flipper-Folly/folly/DynamicConverter.h deleted file mode 100644 index 04aec59..0000000 --- a/ios/Pods/Flipper-Folly/folly/DynamicConverter.h +++ /dev/null @@ -1,415 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// @author Nicholas Ormrod - -#pragma once - -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -namespace folly { -template -T convertTo(const dynamic&); -template -dynamic toDynamic(const T&); -} // namespace folly - -/** - * convertTo returns a well-typed representation of the input dynamic. - * - * Example: - * - * dynamic d = dynamic::array( - * dynamic::array(1, 2, 3), - * dynamic::array(4, 5)); // a vector of vector of int - * auto vvi = convertTo>>(d); - * - * See docs/DynamicConverter.md for supported types and customization - */ - -namespace folly { - -/////////////////////////////////////////////////////////////////////////////// -// traits - -namespace dynamicconverter_detail { - -BOOST_MPL_HAS_XXX_TRAIT_DEF(value_type) -BOOST_MPL_HAS_XXX_TRAIT_DEF(iterator) -BOOST_MPL_HAS_XXX_TRAIT_DEF(mapped_type) -BOOST_MPL_HAS_XXX_TRAIT_DEF(key_type) - -template -struct iterator_class_is_container { - typedef std::reverse_iterator some_iterator; - enum { - value = has_value_type::value && - std::is_constructible::value - }; -}; - -template -using class_is_container = - Conjunction, iterator_class_is_container>; - -template -using is_range = StrictConjunction, has_iterator>; - -template -using is_container = StrictConjunction, class_is_container>; - -template -using is_map = StrictConjunction, has_mapped_type>; - -template -using is_associative = StrictConjunction, has_key_type>; - -} // namespace dynamicconverter_detail - -/////////////////////////////////////////////////////////////////////////////// -// custom iterators - -/** - * We have iterators that dereference to dynamics, but need iterators - * that dereference to typename T. - * - * Implementation details: - * 1. We cache the value of the dereference operator. This is necessary - * because boost::iterator_adaptor requires *it to return a - * reference. - * 2. For const reasons, we cannot call operator= to refresh the - * cache: we must call the destructor then placement new. - */ - -namespace dynamicconverter_detail { - -template -struct Dereferencer { - static inline void derefToCache( - Optional* /* mem */, - const dynamic::const_item_iterator& /* it */) { - throw_exception("array", dynamic::Type::OBJECT); - } - - static inline void derefToCache( - Optional* mem, - const dynamic::const_iterator& it) { - mem->emplace(convertTo(*it)); - } -}; - -template -struct Dereferencer> { - static inline void derefToCache( - Optional>* mem, - const dynamic::const_item_iterator& it) { - mem->emplace(convertTo(it->first), convertTo(it->second)); - } - - // Intentional duplication of the code in Dereferencer - template - static inline void derefToCache( - Optional* mem, - const dynamic::const_iterator& it) { - mem->emplace(convertTo(*it)); - } -}; - -template -class Transformer - : public boost:: - iterator_adaptor, It, typename T::value_type> { - friend class boost::iterator_core_access; - - typedef typename T::value_type ttype; - - mutable Optional cache_; - - void increment() { - ++this->base_reference(); - cache_ = none; - } - - ttype& dereference() const { - if (!cache_) { - Dereferencer::derefToCache(&cache_, this->base_reference()); - } - return cache_.value(); - } - - public: - explicit Transformer(const It& it) : Transformer::iterator_adaptor_(it) {} -}; - -// conversion factory -template -inline std::move_iterator> conversionIterator(const It& it) { - return std::make_move_iterator(Transformer(it)); -} - -} // namespace dynamicconverter_detail - -/////////////////////////////////////////////////////////////////////////////// -// DynamicConverter specializations - -/** - * Each specialization of DynamicConverter has the function - * 'static T convert(const dynamic&);' - */ - -// default - intentionally unimplemented -template -struct DynamicConverter; - -// boolean -template <> -struct DynamicConverter { - static bool convert(const dynamic& d) { - return d.asBool(); - } -}; - -// integrals -template -struct DynamicConverter< - T, - typename std::enable_if< - std::is_integral::value && !std::is_same::value>::type> { - static T convert(const dynamic& d) { - return folly::to(d.asInt()); - } -}; - -// enums -template -struct DynamicConverter< - T, - typename std::enable_if::value>::type> { - static T convert(const dynamic& d) { - using type = typename std::underlying_type::type; - return static_cast(DynamicConverter::convert(d)); - } -}; - -// floating point -template -struct DynamicConverter< - T, - typename std::enable_if::value>::type> { - static T convert(const dynamic& d) { - return folly::to(d.asDouble()); - } -}; - -// fbstring -template <> -struct DynamicConverter { - static folly::fbstring convert(const dynamic& d) { - return d.asString(); - } -}; - -// std::string -template <> -struct DynamicConverter { - static std::string convert(const dynamic& d) { - return d.asString(); - } -}; - -// std::pair -template -struct DynamicConverter> { - static std::pair convert(const dynamic& d) { - if (d.isArray() && d.size() == 2) { - return std::make_pair(convertTo(d[0]), convertTo(d[1])); - } else if (d.isObject() && d.size() == 1) { - auto it = d.items().begin(); - return std::make_pair(convertTo(it->first), convertTo(it->second)); - } else { - throw_exception("array (size 2) or object (size 1)", d.type()); - } - } -}; - -// non-associative containers -template -struct DynamicConverter< - C, - typename std::enable_if< - dynamicconverter_detail::is_container::value && - !dynamicconverter_detail::is_associative::value>::type> { - static C convert(const dynamic& d) { - if (d.isArray()) { - return C( - dynamicconverter_detail::conversionIterator(d.begin()), - dynamicconverter_detail::conversionIterator(d.end())); - } else if (d.isObject()) { - return C( - dynamicconverter_detail::conversionIterator(d.items().begin()), - dynamicconverter_detail::conversionIterator(d.items().end())); - } else { - throw_exception("object or array", d.type()); - } - } -}; - -// associative containers -template -struct DynamicConverter< - C, - typename std::enable_if< - dynamicconverter_detail::is_container::value && - dynamicconverter_detail::is_associative::value>::type> { - static C convert(const dynamic& d) { - C ret; // avoid direct initialization due to unordered_map's constructor - // causing memory corruption if the iterator throws an exception - if (d.isArray()) { - ret.insert( - dynamicconverter_detail::conversionIterator(d.begin()), - dynamicconverter_detail::conversionIterator(d.end())); - } else if (d.isObject()) { - ret.insert( - dynamicconverter_detail::conversionIterator(d.items().begin()), - dynamicconverter_detail::conversionIterator(d.items().end())); - } else { - throw_exception("object or array", d.type()); - } - return ret; - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// DynamicConstructor specializations - -/** - * Each specialization of DynamicConstructor has the function - * 'static dynamic construct(const C&);' - */ - -// default -template -struct DynamicConstructor { - static dynamic construct(const C& x) { - return dynamic(x); - } -}; - -// identity -template -struct DynamicConstructor< - C, - typename std::enable_if::value>::type> { - static dynamic construct(const C& x) { - return x; - } -}; - -// enums -template -struct DynamicConstructor< - C, - typename std::enable_if::value>::type> { - static dynamic construct(const C& x) { - return dynamic(to_underlying(x)); - } -}; - -// maps -template -struct DynamicConstructor< - C, - typename std::enable_if< - !std::is_same::value && - dynamicconverter_detail::is_map::value>::type> { - static dynamic construct(const C& x) { - dynamic d = dynamic::object; - for (const auto& pair : x) { - d.insert(toDynamic(pair.first), toDynamic(pair.second)); - } - return d; - } -}; - -// other ranges -template -struct DynamicConstructor< - C, - typename std::enable_if< - !std::is_same::value && - !dynamicconverter_detail::is_map::value && - !std::is_constructible::value && - dynamicconverter_detail::is_range::value>::type> { - static dynamic construct(const C& x) { - dynamic d = dynamic::array; - for (const auto& item : x) { - d.push_back(toDynamic(item)); - } - return d; - } -}; - -// pair -template -struct DynamicConstructor, void> { - static dynamic construct(const std::pair& x) { - dynamic d = dynamic::array; - d.push_back(toDynamic(x.first)); - d.push_back(toDynamic(x.second)); - return d; - } -}; - -// vector -template <> -struct DynamicConstructor, void> { - static dynamic construct(const std::vector& x) { - dynamic d = dynamic::array; - // Intentionally specifying the type as bool here. - // std::vector's iterators return a proxy which is a prvalue - // and hence cannot bind to an lvalue reference such as auto& - for (bool item : x) { - d.push_back(toDynamic(item)); - } - return d; - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// implementation - -template -T convertTo(const dynamic& d) { - return DynamicConverter::type>::convert(d); -} - -template -dynamic toDynamic(const T& x) { - return DynamicConstructor::type>::construct(x); -} - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/Exception.h b/ios/Pods/Flipper-Folly/folly/Exception.h deleted file mode 100644 index b050d64..0000000 --- a/ios/Pods/Flipper-Folly/folly/Exception.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include - -#include -#include -#include - -#include -#include -#include -#include - -namespace folly { - -// Various helpers to throw appropriate std::system_error exceptions from C -// library errors (returned in errno, as positive return values (many POSIX -// functions), or as negative return values (Linux syscalls)) -// -// The *Explicit functions take an explicit value for errno. - -inline std::system_error makeSystemErrorExplicit(int err, const char* msg) { - // TODO: The C++ standard indicates that std::generic_category() should be - // used for POSIX errno codes. - // - // We should ideally change this to use std::generic_category() instead of - // std::system_category(). However, undertaking this change will require - // updating existing call sites that currently catch exceptions thrown by - // this code and currently expect std::system_category. - return std::system_error(err, std::system_category(), msg); -} - -template -std::system_error makeSystemErrorExplicit(int err, Args&&... args) { - return makeSystemErrorExplicit( - err, to(std::forward(args)...).c_str()); -} - -inline std::system_error makeSystemError(const char* msg) { - return makeSystemErrorExplicit(errno, msg); -} - -template -std::system_error makeSystemError(Args&&... args) { - return makeSystemErrorExplicit(errno, std::forward(args)...); -} - -// Helper to throw std::system_error -[[noreturn]] inline void throwSystemErrorExplicit(int err, const char* msg) { - throw_exception(makeSystemErrorExplicit(err, msg)); -} - -template -[[noreturn]] void throwSystemErrorExplicit(int err, Args&&... args) { - throw_exception(makeSystemErrorExplicit(err, std::forward(args)...)); -} - -// Helper to throw std::system_error from errno and components of a string -template -[[noreturn]] void throwSystemError(Args&&... args) { - throwSystemErrorExplicit(errno, std::forward(args)...); -} - -// Check a Posix return code (0 on success, error number on error), throw -// on error. -template -void checkPosixError(int err, Args&&... args) { - if (UNLIKELY(err != 0)) { - throwSystemErrorExplicit(err, std::forward(args)...); - } -} - -// Check a Linux kernel-style return code (>= 0 on success, negative error -// number on error), throw on error. -template -void checkKernelError(ssize_t ret, Args&&... args) { - if (UNLIKELY(ret < 0)) { - throwSystemErrorExplicit(int(-ret), std::forward(args)...); - } -} - -// Check a traditional Unix return code (-1 and sets errno on error), throw -// on error. -template -void checkUnixError(ssize_t ret, Args&&... args) { - if (UNLIKELY(ret == -1)) { - throwSystemError(std::forward(args)...); - } -} - -template -void checkUnixErrorExplicit(ssize_t ret, int savedErrno, Args&&... args) { - if (UNLIKELY(ret == -1)) { - throwSystemErrorExplicit(savedErrno, std::forward(args)...); - } -} - -// Check the return code from a fopen-style function (returns a non-nullptr -// FILE* on success, nullptr on error, sets errno). Works with fopen, fdopen, -// freopen, tmpfile, etc. -template -void checkFopenError(FILE* fp, Args&&... args) { - if (UNLIKELY(!fp)) { - throwSystemError(std::forward(args)...); - } -} - -template -void checkFopenErrorExplicit(FILE* fp, int savedErrno, Args&&... args) { - if (UNLIKELY(!fp)) { - throwSystemErrorExplicit(savedErrno, std::forward(args)...); - } -} - -/** - * If cond is not true, raise an exception of type E. E must have a ctor that - * works with const char* (a description of the failure). - */ -#define CHECK_THROW(cond, E) \ - do { \ - if (!(cond)) { \ - folly::throw_exception("Check failed: " #cond); \ - } \ - } while (0) - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/ExceptionString.h b/ios/Pods/Flipper-Folly/folly/ExceptionString.h deleted file mode 100644 index 13042ea..0000000 --- a/ios/Pods/Flipper-Folly/folly/ExceptionString.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include -#include - -#include -#include -#include - -namespace folly { - -/** - * Debug string for an exception: include type and what(), if - * defined. - */ -inline fbstring exceptionStr(const std::exception& e) { -#if FOLLY_HAS_RTTI - fbstring rv(demangle(typeid(e))); - rv += ": "; -#else - fbstring rv("Exception (no RTTI available): "); -#endif - rv += e.what(); - return rv; -} - -inline fbstring exceptionStr(std::exception_ptr ep) { - if (!kHasExceptions) { - return "Exception (catch unavailable)"; - } - return catch_exception( - [&]() -> fbstring { - return catch_exception( - [&]() -> fbstring { std::rethrow_exception(ep); }, - [](auto&& e) { return exceptionStr(e); }); - }, - []() -> fbstring { return ""; }); -} - -template -auto exceptionStr(const E& e) -> typename std:: - enable_if::value, fbstring>::type { -#if FOLLY_HAS_RTTI - return demangle(typeid(e)); -#else - (void)e; - return "Exception (no RTTI available)"; -#endif -} - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/ExceptionWrapper-inl.h b/ios/Pods/Flipper-Folly/folly/ExceptionWrapper-inl.h deleted file mode 100644 index 0d26d3e..0000000 --- a/ios/Pods/Flipper-Folly/folly/ExceptionWrapper-inl.h +++ /dev/null @@ -1,680 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * - * Author: Eric Niebler - */ - -#include - -namespace folly { - -template -struct exception_wrapper::arg_type_ - : public arg_type_ {}; -template -struct exception_wrapper::arg_type_ { - using type = Arg; -}; -template -struct exception_wrapper::arg_type_ { - using type = Arg; -}; -template -struct exception_wrapper::arg_type_ { - using type = Arg; -}; -template -struct exception_wrapper::arg_type_ { - using type = Arg; -}; -template -struct exception_wrapper::arg_type_ { - using type = AnyException; -}; -template -struct exception_wrapper::arg_type_ { - using type = AnyException; -}; -template -struct exception_wrapper::arg_type_ { - using type = AnyException; -}; -template -struct exception_wrapper::arg_type_ { - using type = AnyException; -}; - -template -inline Ret exception_wrapper::noop_(Args...) { - return Ret(); -} - -inline std::type_info const* exception_wrapper::uninit_type_( - exception_wrapper const*) { - return &typeid(void); -} - -template -inline exception_wrapper::Buffer::Buffer(in_place_type_t, As&&... as_) { - ::new (static_cast(&buff_)) Ex(std::forward(as_)...); -} - -template -inline Ex& exception_wrapper::Buffer::as() noexcept { - return *static_cast(static_cast(&buff_)); -} -template -inline Ex const& exception_wrapper::Buffer::as() const noexcept { - return *static_cast(static_cast(&buff_)); -} - -inline std::exception const* exception_wrapper::as_exception_or_null_( - std::exception const& ex) { - return &ex; -} -inline std::exception const* exception_wrapper::as_exception_or_null_( - AnyException) { - return nullptr; -} - -static_assert( - !kMicrosoftAbiVer || (kMicrosoftAbiVer >= 1900 && kMicrosoftAbiVer <= 2000), - "exception_wrapper is untested and possibly broken on your version of " - "MSVC"); - -inline std::uintptr_t exception_wrapper::ExceptionPtr::as_int_( - std::exception_ptr const& ptr, - std::exception const& e) noexcept { - if (!kMicrosoftAbiVer) { - return reinterpret_cast(&e); - } else { - // On Windows, as of MSVC2017, all thrown exceptions are copied to the stack - // first. Thus, we cannot depend on exception references associated with an - // exception_ptr to be live for the duration of the exception_ptr. We need - // to directly access the heap allocated memory inside the exception_ptr. - // - // std::exception_ptr is an opaque reinterpret_cast of - // std::shared_ptr<__ExceptionPtr> - // __ExceptionPtr is a non-virtual class with two members, a union and a - // bool. The union contains the now-undocumented EHExceptionRecord, which - // contains a struct which contains a void* which points to the heap - // allocated exception. - // We derive the offset to pExceptionObject via manual means. - FOLLY_PACK_PUSH - struct Win32ExceptionPtr { - char offset[8 + 4 * sizeof(void*)]; - void* exceptionObject; - } FOLLY_PACK_ATTR; - FOLLY_PACK_POP - - auto* win32ExceptionPtr = - reinterpret_cast const*>(&ptr) - ->get(); - return reinterpret_cast(win32ExceptionPtr->exceptionObject); - } -} -inline std::uintptr_t exception_wrapper::ExceptionPtr::as_int_( - std::exception_ptr const&, - AnyException e) noexcept { - return reinterpret_cast(e.typeinfo_) + 1; -} -inline bool exception_wrapper::ExceptionPtr::has_exception_() const { - return 0 == exception_or_type_ % 2; -} -inline std::exception const* exception_wrapper::ExceptionPtr::as_exception_() - const { - return reinterpret_cast(exception_or_type_); -} -inline std::type_info const* exception_wrapper::ExceptionPtr::as_type_() const { - return reinterpret_cast(exception_or_type_ - 1); -} - -inline void exception_wrapper::ExceptionPtr::copy_( - exception_wrapper const* from, - exception_wrapper* to) { - ::new (static_cast(&to->eptr_)) ExceptionPtr(from->eptr_); -} -inline void exception_wrapper::ExceptionPtr::move_( - exception_wrapper* from, - exception_wrapper* to) { - ::new (static_cast(&to->eptr_)) ExceptionPtr(std::move(from->eptr_)); - delete_(from); -} -inline void exception_wrapper::ExceptionPtr::delete_(exception_wrapper* that) { - that->eptr_.~ExceptionPtr(); - that->vptr_ = &uninit_; -} -[[noreturn]] inline void exception_wrapper::ExceptionPtr::throw_( - exception_wrapper const* that) { - std::rethrow_exception(that->eptr_.ptr_); -} -inline std::type_info const* exception_wrapper::ExceptionPtr::type_( - exception_wrapper const* that) { - if (auto e = get_exception_(that)) { - return &typeid(*e); - } - return that->eptr_.as_type_(); -} -inline std::exception const* exception_wrapper::ExceptionPtr::get_exception_( - exception_wrapper const* that) { - return that->eptr_.has_exception_() ? that->eptr_.as_exception_() : nullptr; -} -inline exception_wrapper exception_wrapper::ExceptionPtr::get_exception_ptr_( - exception_wrapper const* that) { - return *that; -} - -template -inline void exception_wrapper::InPlace::copy_( - exception_wrapper const* from, - exception_wrapper* to) { - ::new (static_cast(std::addressof(to->buff_.as()))) - Ex(from->buff_.as()); -} -template -inline void exception_wrapper::InPlace::move_( - exception_wrapper* from, - exception_wrapper* to) { - ::new (static_cast(std::addressof(to->buff_.as()))) - Ex(std::move(from->buff_.as())); - delete_(from); -} -template -inline void exception_wrapper::InPlace::delete_(exception_wrapper* that) { - that->buff_.as().~Ex(); - that->vptr_ = &uninit_; -} -template -[[noreturn]] inline void exception_wrapper::InPlace::throw_( - exception_wrapper const* that) { - throw that->buff_.as(); -} -template -inline std::type_info const* exception_wrapper::InPlace::type_( - exception_wrapper const*) { - return &typeid(Ex); -} -template -inline std::exception const* exception_wrapper::InPlace::get_exception_( - exception_wrapper const* that) { - return as_exception_or_null_(that->buff_.as()); -} -template -inline exception_wrapper exception_wrapper::InPlace::get_exception_ptr_( - exception_wrapper const* that) { - try { - throw_(that); - } catch (Ex const& ex) { - return exception_wrapper{std::current_exception(), ex}; - } -} - -template -[[noreturn]] inline void exception_wrapper::SharedPtr::Impl::throw_() - const { - throw ex_; -} -template -inline std::exception const* -exception_wrapper::SharedPtr::Impl::get_exception_() const noexcept { - return as_exception_or_null_(ex_); -} -template -inline exception_wrapper -exception_wrapper::SharedPtr::Impl::get_exception_ptr_() const noexcept { - try { - throw_(); - } catch (Ex& ex) { - return exception_wrapper{std::current_exception(), ex}; - } -} -inline void exception_wrapper::SharedPtr::copy_( - exception_wrapper const* from, - exception_wrapper* to) { - ::new (static_cast(std::addressof(to->sptr_))) SharedPtr(from->sptr_); -} -inline void exception_wrapper::SharedPtr::move_( - exception_wrapper* from, - exception_wrapper* to) { - ::new (static_cast(std::addressof(to->sptr_))) - SharedPtr(std::move(from->sptr_)); - delete_(from); -} -inline void exception_wrapper::SharedPtr::delete_(exception_wrapper* that) { - that->sptr_.~SharedPtr(); - that->vptr_ = &uninit_; -} -[[noreturn]] inline void exception_wrapper::SharedPtr::throw_( - exception_wrapper const* that) { - that->sptr_.ptr_->throw_(); - folly::assume_unreachable(); -} -inline std::type_info const* exception_wrapper::SharedPtr::type_( - exception_wrapper const* that) { - return that->sptr_.ptr_->info_; -} -inline std::exception const* exception_wrapper::SharedPtr::get_exception_( - exception_wrapper const* that) { - return that->sptr_.ptr_->get_exception_(); -} -inline exception_wrapper exception_wrapper::SharedPtr::get_exception_ptr_( - exception_wrapper const* that) { - return that->sptr_.ptr_->get_exception_ptr_(); -} - -template -inline exception_wrapper::exception_wrapper( - ThrownTag, - in_place_type_t, - As&&... as) - : eptr_{std::make_exception_ptr(Ex(std::forward(as)...)), - reinterpret_cast(std::addressof(typeid(Ex))) + 1u}, - vptr_(&ExceptionPtr::ops_) {} - -template -inline exception_wrapper::exception_wrapper( - OnHeapTag, - in_place_type_t, - As&&... as) - : sptr_{std::make_shared>(std::forward(as)...)}, - vptr_(&SharedPtr::ops_) {} - -template -inline exception_wrapper::exception_wrapper( - InSituTag, - in_place_type_t, - As&&... as) - : buff_{in_place_type, std::forward(as)...}, - vptr_(&InPlace::ops_) {} - -inline exception_wrapper::exception_wrapper(exception_wrapper&& that) noexcept - : exception_wrapper{} { - (vptr_ = that.vptr_)->move_(&that, this); // Move into *this, won't throw -} - -inline exception_wrapper::exception_wrapper( - exception_wrapper const& that) noexcept - : exception_wrapper{} { - that.vptr_->copy_(&that, this); // Copy into *this, won't throw - vptr_ = that.vptr_; -} - -// If `this == &that`, this move assignment operator leaves the object in a -// valid but unspecified state. -inline exception_wrapper& exception_wrapper::operator=( - exception_wrapper&& that) noexcept { - vptr_->delete_(this); // Free the current exception - (vptr_ = that.vptr_)->move_(&that, this); // Move into *this, won't throw - return *this; -} - -inline exception_wrapper& exception_wrapper::operator=( - exception_wrapper const& that) noexcept { - exception_wrapper(that).swap(*this); - return *this; -} - -inline exception_wrapper::~exception_wrapper() { - reset(); -} - -template -inline exception_wrapper::exception_wrapper( - std::exception_ptr ptr, - Ex& ex) noexcept - : eptr_{ptr, ExceptionPtr::as_int_(ptr, ex)}, vptr_(&ExceptionPtr::ops_) { - assert(eptr_.ptr_); -} - -namespace exception_wrapper_detail { -template -Ex&& dont_slice(Ex&& ex) { - assert(typeid(ex) == typeid(std::decay_t) || - !"Dynamic and static exception types don't match. Exception would " - "be sliced when storing in exception_wrapper."); - return std::forward(ex); -} -} // namespace exception_wrapper_detail - -template < - class Ex, - class Ex_, - FOLLY_REQUIRES_DEF(Conjunction< - exception_wrapper::IsStdException, - exception_wrapper::IsRegularExceptionType>::value)> -inline exception_wrapper::exception_wrapper(Ex&& ex) - : exception_wrapper{ - PlacementOf{}, - in_place_type, - exception_wrapper_detail::dont_slice(std::forward(ex))} {} - -template < - class Ex, - class Ex_, - FOLLY_REQUIRES_DEF(exception_wrapper::IsRegularExceptionType::value)> -inline exception_wrapper::exception_wrapper(in_place_t, Ex&& ex) - : exception_wrapper{ - PlacementOf{}, - in_place_type, - exception_wrapper_detail::dont_slice(std::forward(ex))} {} - -template < - class Ex, - typename... As, - FOLLY_REQUIRES_DEF(exception_wrapper::IsRegularExceptionType::value)> -inline exception_wrapper::exception_wrapper(in_place_type_t, As&&... as) - : exception_wrapper{PlacementOf{}, - in_place_type, - std::forward(as)...} {} - -inline void exception_wrapper::swap(exception_wrapper& that) noexcept { - exception_wrapper tmp(std::move(that)); - that = std::move(*this); - *this = std::move(tmp); -} - -inline exception_wrapper::operator bool() const noexcept { - return vptr_ != &uninit_; -} - -inline bool exception_wrapper::operator!() const noexcept { - return !static_cast(*this); -} - -inline void exception_wrapper::reset() { - vptr_->delete_(this); -} - -inline bool exception_wrapper::has_exception_ptr() const noexcept { - return vptr_ == &ExceptionPtr::ops_; -} - -inline std::exception* exception_wrapper::get_exception() noexcept { - return const_cast(vptr_->get_exception_(this)); -} -inline std::exception const* exception_wrapper::get_exception() const noexcept { - return vptr_->get_exception_(this); -} - -template -inline Ex* exception_wrapper::get_exception() noexcept { - Ex* object{nullptr}; - with_exception([&](Ex& ex) { object = &ex; }); - return object; -} - -template -inline Ex const* exception_wrapper::get_exception() const noexcept { - Ex const* object{nullptr}; - with_exception([&](Ex const& ex) { object = &ex; }); - return object; -} - -inline std::exception_ptr exception_wrapper::to_exception_ptr() noexcept { - if (*this) { - // Computing an exception_ptr is expensive so cache the result. - return (*this = vptr_->get_exception_ptr_(this)).eptr_.ptr_; - } - return {}; -} -inline std::exception_ptr exception_wrapper::to_exception_ptr() const noexcept { - return vptr_->get_exception_ptr_(this).eptr_.ptr_; -} - -inline std::type_info const& exception_wrapper::none() noexcept { - return typeid(void); -} -inline std::type_info const& exception_wrapper::unknown() noexcept { - return typeid(Unknown); -} - -inline std::type_info const& exception_wrapper::type() const noexcept { - return *vptr_->type_(this); -} - -inline folly::fbstring exception_wrapper::what() const { - if (auto e = get_exception()) { - return class_name() + ": " + e->what(); - } - return class_name(); -} - -inline folly::fbstring exception_wrapper::class_name() const { - auto& ti = type(); - return ti == none() - ? "" - : ti == unknown() ? "" : folly::demangle(ti); -} - -template -inline bool exception_wrapper::is_compatible_with() const noexcept { - return with_exception([](Ex const&) {}); -} - -[[noreturn]] inline void exception_wrapper::throw_exception() const { - vptr_->throw_(this); - onNoExceptionError(__func__); -} - -template -[[noreturn]] inline void exception_wrapper::throw_with_nested(Ex&& ex) const { - try { - throw_exception(); - } catch (...) { - std::throw_with_nested(std::forward(ex)); - } -} - -template -struct exception_wrapper::ExceptionTypeOf { - using type = arg_type>; - static_assert( - std::is_reference::value, - "Always catch exceptions by reference."); - static_assert( - !IsConst || std::is_const>::value, - "handle() or with_exception() called on a const exception_wrapper " - "and asked to catch a non-const exception. Handler will never fire. " - "Catch exception by const reference to fix this."); -}; - -// Nests a throw in the proper try/catch blocks -template -struct exception_wrapper::HandleReduce { - bool* handled_; - - template < - class ThrowFn, - class CatchFn, - FOLLY_REQUIRES(!IsCatchAll::value)> - auto operator()(ThrowFn&& th, CatchFn& ca) const { - using Ex = _t>; - return [th = std::forward(th), &ca, handled_ = handled_] { - try { - th(); - } catch (Ex& e) { - // If we got here because a catch function threw, rethrow. - if (*handled_) { - throw; - } - *handled_ = true; - ca(e); - } - }; - } - - template < - class ThrowFn, - class CatchFn, - FOLLY_REQUIRES(IsCatchAll::value)> - auto operator()(ThrowFn&& th, CatchFn& ca) const { - return [th = std::forward(th), &ca, handled_ = handled_] { - try { - th(); - } catch (...) { - // If we got here because a catch function threw, rethrow. - if (*handled_) { - throw; - } - *handled_ = true; - ca(); - } - }; - } -}; - -// When all the handlers expect types derived from std::exception, we can -// sometimes invoke the handlers without throwing any exceptions. -template -struct exception_wrapper::HandleStdExceptReduce { - using StdEx = AddConstIf; - - template < - class ThrowFn, - class CatchFn, - FOLLY_REQUIRES(!IsCatchAll::value)> - auto operator()(ThrowFn&& th, CatchFn& ca) const { - using Ex = _t>; - return - [th = std::forward(th), &ca](auto&& continuation) -> StdEx* { - if (auto e = const_cast(th(continuation))) { - if (auto e2 = dynamic_cast>(e)) { - ca(*e2); - } else { - return e; - } - } - return nullptr; - }; - } - - template < - class ThrowFn, - class CatchFn, - FOLLY_REQUIRES(IsCatchAll::value)> - auto operator()(ThrowFn&& th, CatchFn& ca) const { - return [th = std::forward(th), &ca](auto &&) -> StdEx* { - // The following continuation causes ca() to execute if *this contains - // an exception /not/ derived from std::exception. - auto continuation = [&ca](StdEx* e) { - return e != nullptr ? e : ((void)ca(), nullptr); - }; - if (th(continuation) != nullptr) { - ca(); - } - return nullptr; - }; - } -}; - -// Called when some types in the catch clauses are not derived from -// std::exception. -template -inline void -exception_wrapper::handle_(std::false_type, This& this_, CatchFns&... fns) { - bool handled = false; - auto impl = exception_wrapper_detail::fold( - HandleReduce::value>{&handled}, - [&] { this_.throw_exception(); }, - fns...); - impl(); -} - -// Called when all types in the catch clauses are either derived from -// std::exception or a catch-all clause. -template -inline void -exception_wrapper::handle_(std::true_type, This& this_, CatchFns&... fns) { - using StdEx = exception_wrapper_detail:: - AddConstIf::value, std::exception>; - auto impl = exception_wrapper_detail::fold( - HandleStdExceptReduce::value>{}, - [&](auto&& continuation) { - return continuation( - const_cast(this_.vptr_->get_exception_(&this_))); - }, - fns...); - // This continuation gets evaluated if CatchFns... does not include a - // catch-all handler. It is a no-op. - auto continuation = [](StdEx* ex) { return ex; }; - if (nullptr != impl(continuation)) { - this_.throw_exception(); - } -} - -namespace exception_wrapper_detail { -template -struct catch_fn { - Fn fn_; - auto operator()(Ex& ex) { - return fn_(ex); - } -}; - -template -inline catch_fn catch_(Ex*, Fn fn) { - return {std::move(fn)}; -} -template -inline Fn catch_(void const*, Fn fn) { - return fn; -} -} // namespace exception_wrapper_detail - -template -inline bool exception_wrapper::with_exception_(This& this_, Fn fn_) { - if (!this_) { - return false; - } - bool handled = true; - auto fn = exception_wrapper_detail::catch_( - static_cast(nullptr), std::move(fn_)); - auto&& all = [&](...) { handled = false; }; - handle_(IsStdException>{}, this_, fn, all); - return handled; -} - -template -inline bool exception_wrapper::with_exception(Fn fn) { - return with_exception_(*this, std::move(fn)); -} -template -inline bool exception_wrapper::with_exception(Fn fn) const { - return with_exception_(*this, std::move(fn)); -} - -template -inline void exception_wrapper::handle(CatchFns... fns) { - using AllStdEx = - exception_wrapper_detail::AllOf...>; - if (!*this) { - onNoExceptionError(__func__); - } - this->handle_(AllStdEx{}, *this, fns...); -} -template -inline void exception_wrapper::handle(CatchFns... fns) const { - using AllStdEx = - exception_wrapper_detail::AllOf...>; - if (!*this) { - onNoExceptionError(__func__); - } - this->handle_(AllStdEx{}, *this, fns...); -} - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/ExceptionWrapper.cpp b/ios/Pods/Flipper-Folly/folly/ExceptionWrapper.cpp deleted file mode 100644 index 1cca54b..0000000 --- a/ios/Pods/Flipper-Folly/folly/ExceptionWrapper.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include - -#include - -namespace folly { - -exception_wrapper::VTable const exception_wrapper::uninit_{ - &noop_, - &noop_, - &noop_, - &noop_, - &uninit_type_, - &noop_, - &noop_}; - -exception_wrapper::VTable const exception_wrapper::ExceptionPtr::ops_{ - copy_, - move_, - delete_, - throw_, - type_, - get_exception_, - get_exception_ptr_}; - -exception_wrapper::VTable const exception_wrapper::SharedPtr::ops_{ - copy_, - move_, - delete_, - throw_, - type_, - get_exception_, - get_exception_ptr_}; - -namespace { -std::exception const* get_std_exception_(std::exception_ptr eptr) noexcept { - try { - std::rethrow_exception(eptr); - } catch (const std::exception& ex) { - return &ex; - } catch (...) { - return nullptr; - } -} -} // namespace - -exception_wrapper exception_wrapper::from_exception_ptr( - std::exception_ptr const& ptr) noexcept { - if (!ptr) { - return exception_wrapper(); - } - try { - std::rethrow_exception(ptr); - } catch (std::exception& e) { - return exception_wrapper(std::current_exception(), e); - } catch (...) { - return exception_wrapper(std::current_exception()); - } -} - -exception_wrapper::exception_wrapper(std::exception_ptr ptr) noexcept - : exception_wrapper{} { - if (ptr) { - if (auto e = get_std_exception_(ptr)) { - LOG(DFATAL) - << "Performance error: Please construct exception_wrapper with a " - "reference to the std::exception along with the " - "std::exception_ptr."; - *this = exception_wrapper{std::move(ptr), *e}; - } else { - Unknown uk; - *this = exception_wrapper{ptr, uk}; - } - } -} - -[[noreturn]] void exception_wrapper::onNoExceptionError( - char const* const name) { - std::ios_base::Init ioinit_; // ensure std::cerr is alive - std::cerr << "Cannot use `" << name - << "` with an empty folly::exception_wrapper" << std::endl; - std::terminate(); -} - -fbstring exceptionStr(exception_wrapper const& ew) { - return ew.what(); -} - -} // namespace folly diff --git a/ios/Pods/Flipper-Folly/folly/ExceptionWrapper.h b/ios/Pods/Flipper-Folly/folly/ExceptionWrapper.h deleted file mode 100644 index 7e529a2..0000000 --- a/ios/Pods/Flipper-Folly/folly/ExceptionWrapper.h +++ /dev/null @@ -1,714 +0,0 @@ -/* - * Copyright (c) Facebook, Inc. and its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * Author: Eric Niebler - */ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wpragmas" -#pragma GCC diagnostic ignored "-Wpotentially-evaluated-expression" -// GCC gets confused about lambda scopes and issues shadow-local warnings for -// parameters in totally different functions. -FOLLY_GCC_DISABLE_NEW_SHADOW_WARNINGS -#endif - -#define FOLLY_EXCEPTION_WRAPPER_H_INCLUDED - -namespace folly { - -#define FOLLY_REQUIRES_DEF(...) \ - std::enable_if_t(__VA_ARGS__), long> - -#define FOLLY_REQUIRES(...) FOLLY_REQUIRES_DEF(__VA_ARGS__) = __LINE__ - -namespace exception_wrapper_detail { - -template