[
  {
    "path": ".gitattributes",
    "content": "# Auto detect text files and perform LF normalization\n* text=auto\n\n# Custom for Visual Studio\n*.cs     diff=csharp\n*.sln    merge=union\n*.csproj merge=union\n*.vbproj merge=union\n*.fsproj merge=union\n*.dbproj merge=union\n\n# Standard to msysgit\n*.doc\t diff=astextplain\n*.DOC\t diff=astextplain\n*.docx diff=astextplain\n*.DOCX diff=astextplain\n*.dot  diff=astextplain\n*.DOT  diff=astextplain\n*.pdf  diff=astextplain\n*.PDF\t diff=astextplain\n*.rtf\t diff=astextplain\n*.RTF\t diff=astextplain\n"
  },
  {
    "path": ".gitignore",
    "content": "# Ignore data files for Kaku - these shouldn't be checked in\napp/src/main/assets/*\napp/src/main/res/raw/*\n\n# Ignore private and sensitive configuration files for Kaku\n# If you pull the repo, you will need to create and populate these files yourself\n# !!!! DO NOT EVER COMMIT THESE FILES AS THEY CONTAIN EXTREMELY SENSITIVE INFORMATION !!!!\napp/src/main/res/values/private_strings.xml\nkeystore.properties\nservice_account.json\n\n# Created by https://www.gitignore.io/api/android\n# Edit at https://www.gitignore.io/?templates=android\n\n### Android ###\n# Built application files\n*.apk\n*.ap_\n*.aab\n\n# Release files\napp/release/*\napp/debug/*\n\n# Files for the ART/Dalvik VM\n*.dex\n\n# Java class files\n*.class\n\n# Generated files\nbin/\ngen/\nout/\n\n# Gradle files\n.gradle/\nbuild/\n\n# Local configuration file (sdk path, etc)\nlocal.properties\n\n# Proguard folder generated by Eclipse\nproguard/\n\n# Log Files\n*.log\n\n# Android Studio Navigation editor temp files\n.navigation/\n\n# Android Studio captures folder\ncaptures/\n\n# IntelliJ\n*.iml\n.idea/workspace.xml\n.idea/tasks.xml\n.idea/gradle.xml\n.idea/assetWizardSettings.xml\n.idea/dictionaries\n.idea/libraries\n.idea/caches\n\n# Keystore files\n# Uncomment the following lines if you do not want to check your keystore files in.\n#*.jks\n#*.keystore\n\n# External native build folder generated in Android Studio 2.2 and later\n.externalNativeBuild\n\n# Google Services (e.g. APIs or Firebase)\ngoogle-services.json\n\n# Freeline\nfreeline.py\nfreeline/\nfreeline_project_description.json\n\n# fastlane\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots\nfastlane/test_output\nfastlane/readme.md\n\n### Android Patch ###\ngen-external-apklibs\n\n# End of https://www.gitignore.io/api/android"
  },
  {
    "path": ".idea/encodings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"Encoding\" addBOMForNewFiles=\"with NO BOM\" />\n</project>"
  },
  {
    "path": ".idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CMakeSettings\">\n    <configurations>\n      <configuration PROFILE_NAME=\"Debug\" CONFIG_NAME=\"Debug\" />\n    </configurations>\n  </component>\n  <component name=\"DesignSurface\">\n    <option name=\"filePathToZoomLevelMap\">\n      <map>\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/drawable-anydpi/icon_delete.xml\" value=\"0.8484375\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/drawable/bg_solid_border_0_blue_black.xml\" value=\"0.590625\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/drawable/bg_solid_border_0_white_black.xml\" value=\"0.8484375\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/drawable/bg_solid_border_corners_0_white_black_round.xml\" value=\"0.8484375\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/drawable/bg_translucent_border_0_blue_blue.xml\" value=\"0.8484375\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/drawable/bg_transparent_border_0_nil_default.xml\" value=\"0.8484375\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/drawable/bg_transparent_border_0_nil_ready.xml\" value=\"0.8484375\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/drawable/ic_baseline_arrow_right_alt_24.xml\" value=\"0.8484375\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/drawable/icon_capture.xml\" value=\"1.0\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/drawable/kakucaptureicon.xml\" value=\"0.8053435114503816\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/layout/activity_beta.xml\" value=\"0.3638948116560057\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/layout/activity_tutorial.xml\" value=\"0.77265625\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/layout/fragment_end.xml\" value=\"0.9079301075268817\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/layout/fragment_start.xml\" value=\"0.67\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/layout/fragment_tutorial.xml\" value=\"0.9079301075268817\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/layout/fragment_welcome.xml\" value=\"0.9079301075268817\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/layout/window.xml\" value=\"0.8\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/layout/window_capture.xml\" value=\"0.4943778110944528\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/layout/window_edit.xml\" value=\"0.56640625\" />\n        <entry key=\"..\\:/Dev/Kaku/app/src/main/res/layout/window_info.xml\" value=\"0.8\" />\n      </map>\n    </option>\n  </component>\n  <component name=\"ProjectRootManager\" version=\"2\" languageLevel=\"JDK_11\" default=\"true\" project-jdk-name=\"JDK\" project-jdk-type=\"JavaSDK\">\n    <output url=\"file://$PROJECT_DIR$/build/classes\" />\n  </component>\n  <component name=\"ProjectType\">\n    <option name=\"id\" value=\"Android\" />\n  </component>\n</project>"
  },
  {
    "path": ".idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/Kaku.iml\" filepath=\"$PROJECT_DIR$/Kaku.iml\" />\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/modules/app/Kaku.app.iml\" filepath=\"$PROJECT_DIR$/.idea/modules/app/Kaku.app.iml\" />\n    </modules>\n  </component>\n</project>"
  },
  {
    "path": ".idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"\" vcs=\"Git\" />\n  </component>\n</project>"
  },
  {
    "path": "LICENSE",
    "content": "BSD 3-Clause License\n\nCopyright (c) 2016, 0xbad1d3a5\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n  this list of conditions and the following disclaimer in the documentation\n  and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "README.md",
    "content": "Kaku: 画 (かく) - stroke (of a kanji, etc.), picture, drawing\n\nhttps://kaku.fuwafuwa.ca/\n\nKaku is a fast, powerful Japanese dictionary that stays on top of all your apps. It uses optical character recognition (OCR) technology to recognize kanji on the device screen for you (rather than the slowww tedious process of looking up individual characters manually), making it perfect for Japanese learners who want to study by reading raw manga, play untranslated games, and so on without the hassle of switching apps.\n\n[<img src=\"https://fdroid.gitlab.io/artwork/badge/get-it-on.png\"\n     alt=\"Get it on F-Droid\"\n     height=\"80\">](https://f-droid.org/packages/ca.fuwafuwa.kaku/)\n[<img src=\"https://play.google.com/intl/en_us/badges/images/generic/en-play-badge.png\"\n     alt=\"Get it on Google Play\"\n     height=\"80\">](https://play.google.com/store/apps/details?id=ca.fuwafuwa.kaku)\n"
  },
  {
    "path": "app/.gitignore",
    "content": "/build\n"
  },
  {
    "path": "app/build.gradle",
    "content": "plugins {\n    id 'com.android.application'\n}\n\napply plugin: 'com.android.application'\napply plugin: 'kotlin-android'\n\nandroid {\n\n    compileSdkVersion 31\n\n    compileOptions {\n        sourceCompatibility JavaVersion.VERSION_1_8\n        targetCompatibility JavaVersion.VERSION_1_8\n    }\n\n    def versionPrefix = \"1.3\"\n    defaultConfig {\n        applicationId \"ca.fuwafuwa.kaku\"\n        minSdkVersion 21\n        targetSdkVersion 31\n        versionCode 78\n        versionName \"$versionPrefix.$versionCode\"\n    }\n\n    buildFeatures {\n        viewBinding true\n    }\n\n    buildTypes {\n        release {\n            debuggable false\n            minifyEnabled false\n            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'\n        }\n        debug {\n            debuggable true\n        }\n    }\n    packagingOptions {\n        resources {\n            excludes += ['META-INF/DEPENDENCIES', 'META-INF/LICENSE', 'META-INF/LICENSE.txt', 'META-INF/license.txt', 'META-INF/NOTICE', 'META-INF/NOTICE.txt', 'META-INF/notice.txt', 'META-INF/ASL2.0', 'META-INF/CONTRIBUTORS.md', 'META-INF/LICENSE.md']\n        }\n    }\n\n\n    testOptions {\n        unitTests.returnDefaultValues = true\n    }\n}\n\ndependencies {\n    implementation \"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version\"\n    implementation 'com.rmtheis:tess-two:9.0.0'\n    implementation 'com.google.guava:guava:31.0.1-android'\n    implementation 'com.google.code.gson:gson:2.8.9'\n    implementation 'androidx.appcompat:appcompat:1.4.1'\n    implementation 'com.google.android.material:material:1.6.0'\n    implementation 'com.j256.ormlite:ormlite-android:5.1'\n    implementation 'com.google.android.gms:play-services-ads:20.6.0'\n    implementation 'com.atilika.kuromoji:kuromoji-core:0.9.0'\n    implementation 'com.atilika.kuromoji:kuromoji-ipadic:0.9.0'\n    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'\n    implementation 'androidx.legacy:legacy-support-v4:1.0.0'\n    testImplementation 'junit:junit:4.13.2'\n    // Probably just delete all these was trying to get GenerateDictionary to work as a Unit Test\n    testImplementation 'com.j256.ormlite:ormlite-core:5.1'\n    testImplementation 'com.j256.ormlite:ormlite-jdbc:5.1'\n    testImplementation 'org.xerial:sqlite-jdbc:3.25.2'\n    testImplementation 'xmlpull:xmlpull:1.1.3.1'\n    testImplementation 'kxml2:kxml2:2.3.0'\n}"
  },
  {
    "path": "app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in D:\\Android\\AndroidSDK/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n\n# If your project uses WebView with JS, uncomment the following\n# and specify the fully qualified class name to the JavaScript interface\n# class:\n#-keepclassmembers class fqcn.of.javascript.interface.for.webview {\n#   public *;\n#}\n"
  },
  {
    "path": "app/src/main/AndroidManifest.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"ca.fuwafuwa.kaku\">\n\n    <uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\" />\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\" />\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" />\n\n    <application\n        android:allowBackup=\"true\"\n        android:icon=\"@mipmap/ic_launcher\"\n        android:label=\"@string/app_name\"\n        android:largeHeap=\"true\"\n        android:supportsRtl=\"true\"\n        android:theme=\"@style/AppTheme\">\n\n        <meta-data\n            android:name=\"com.google.android.gms.ads.APPLICATION_ID\"\n            android:value=\"@string/ads_app_id\" />\n\n        <receiver android:name=\".MainService$CloseMainService\" />\n        <receiver android:name=\".MainService$TogglePageModeMainService\" />\n        <receiver android:name=\".MainService$ToggleInstantModeMainService\" />\n        <receiver android:name=\".MainService$ToggleImagePreviewMainService\" />\n        <receiver android:name=\".MainService$ToggleShowHideMainService\" />\n\n        <activity\n            android:name=\".MainActivity\"\n            android:label=\"Kaku\"\n            android:noHistory=\"false\"\n            android:launchMode=\"standard\"\n            android:screenOrientation=\"portrait\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.MAIN\" />\n                <category android:name=\"android.intent.category.LAUNCHER\" />\n            </intent-filter>\n        </activity>\n\n        <activity android:name=\".BetaActivity\"\n            android:label=\"Kaku Beta\"\n            android:noHistory=\"false\"\n            android:launchMode=\"standard\"\n            android:screenOrientation=\"portrait\">\n        </activity>\n\n        <activity\n            android:name=\".TutorialActivity\"\n            android:label=\"Kaku Tutorial\"\n            android:noHistory=\"false\"\n            android:launchMode=\"standard\"\n            android:screenOrientation=\"portrait\">\n        </activity>\n\n        <activity\n            android:name=\".PassthroughActivity\"\n            android:label=\"Kaku\"\n            android:launchMode=\"singleInstance\"\n            android:noHistory=\"true\"\n            android:exported=\"true\">\n            <intent-filter>\n                <action android:name=\"android.intent.action.PROCESS_TEXT\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <data android:mimeType=\"text/plain\" />\n            </intent-filter>\n            <intent-filter>\n                <action android:name=\"android.intent.action.SEND\" />\n                <category android:name=\"android.intent.category.DEFAULT\" />\n                <data android:mimeType=\"text/plain\" />\n            </intent-filter>\n        </activity>\n\n        <service\n            android:name=\".MainService\"\n            android:foregroundServiceType=\"mediaProjection\"\n            android:exported=\"true\" />\n    </application>\n\n</manifest>"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/BetaActivity.kt",
    "content": "package ca.fuwafuwa.kaku\n\nimport android.content.Intent\nimport android.net.Uri\nimport androidx.appcompat.app.AppCompatActivity\nimport android.os.Bundle\nimport android.widget.Button\n\nclass BetaActivity : AppCompatActivity()\n{\n    override fun onCreate(savedInstanceState: Bundle?)\n    {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_beta)\n\n        findViewById<Button>(R.id.beta_button_start).setOnClickListener {\n            finish()\n        }\n\n        val emailIntent = Intent(android.content.Intent.ACTION_SENDTO)\n        emailIntent.type = \"text/plain\"\n        emailIntent.data = Uri.parse(\"mailto:\")\n        emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, arrayOf(\"0xbad1d3a5@gmail.com\"))\n        emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, \"Kaku Beta User - ${android.os.Build.BRAND + \" \" + android.os.Build.MODEL}\")\n\n        findViewById<Button>(R.id.beta_button_email).setOnClickListener {\n            startActivity(Intent.createChooser(emailIntent, \"Send e-mail using...\"))\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Constants.kt",
    "content": "@file:JvmName(\"Constants\")\n\npackage ca.fuwafuwa.kaku\n\n// Thanks to the fact that SqliteOpenHelper.onUpgrade() doesn't work (due to multi-threading and getDao() being called before onUpgrade()),\n// we version/upgrade the DBs by changing the name. Lol. Should probably fix this if this becomes an issue in the future.\nconst val JMDICT_DATABASE_NAME = \"DB_KakuDict-02-16-2019.db\"\nconst val TESS_FOLDER_NAME = \"tessdata\"\nconst val TESS_DATA_NAME = \"jpn.traineddata\"\nconst val SCREENSHOT_FOLDER_NAME = \"screenshots\"\n\nconst val DB_SPLIT_CHAR = \"\\ufffc\"\nconst val DB_JMDICT_NAME = \"JMDICT\"\nconst val DB_KANJIDICT_NAME = \"KANJIDICT\"\nconst val DB_ENAMEDICT_NAME = \"ENAMEDICT\"\n\nconst val KAKU_PREF_FILE = \"ca.fuwafuwa.kaku\"\nconst val KAKU_PREF_SHOW_HIDE = \"ShowHide\"\nconst val KAKU_PREF_IMAGE_FILTER = \"ImageFilter\"\nconst val KAKU_PREF_TEXT_DIRECTION = \"TextDirection\"\nconst val KAKU_PREF_INSTANT_MODE = \"InstantMode\"\nconst val KAKU_PREF_FIRST_LAUNCH = \"FirstLaunch\"\nconst val KAKU_PREF_TIMES_LAUNCHED = \"TimesLaunched\"\nconst val KAKU_PREF_PLAY_STORE_RATED = \"PlayStoreRated\"\n\nconst val EXTRA_PROJECTION_RESULT_CODE = \"ca.fuwafuwa.kaku.PROJECTION_RESULT_CODE\"\nconst val EXTRA_PROJECTION_RESULT_INTENT = \"ca.fuwafuwa.kaku.PROJECTION_RESULT_INTENT\"\n\nconst val WINDOW_CAPTURE = \"WINDOW_CAPTURE\"\nconst val WINDOW_INFO = \"WINDOW_INFO\"\nconst val WINDOW_EDIT = \"WINDOW_EDIT\"\nconst val WINDOW_INSTANT_KANJI = \"WINDOW_INSTANT_KANJI\"\nconst val WINDOW_KANJI_CHOICE = \"WINDOW_KANJI_CHOICE\"\nconst val WINDOW_HISTORY = \"WINDOW_HISTORY\"\n\nconst val KAKU_CHANNEL_ID = \"kaku_notification_channel_id\"\nconst val KAKU_CHANNEL_NAME = \"Show Kaku Notification\"\n\nconst val REQUEST_SCREENSHOT = 100\nconst val REQUEST_DRAW_ON_TOP = 200\nconst val REQUEST_SERVICE_TOGGLE_IMAGE_PREVIEW = 300\nconst val REQUEST_SERVICE_TOGGLE_PAGE_MODE = 400\nconst val REQUEST_SERVICE_TOGGLE_INSTANT_MODE = 500\nconst val REQUEST_SERVICE_SHUTDOWN = 600\nconst val REQUEST_SERVICE_TOGGLE_SHOW_HIDE = 700"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/DatabaseHelper.java",
    "content": "package ca.fuwafuwa.kaku.Database;\n\nimport android.content.Context;\nimport android.database.sqlite.SQLiteDatabase;\n\nimport com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;\nimport com.j256.ormlite.dao.Dao;\n\nimport java.sql.SQLException;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\n\npublic abstract class DatabaseHelper extends OrmLiteSqliteOpenHelper implements IDatabaseHelper {\n\n    public DatabaseHelper(Context context, String databaseName, SQLiteDatabase.CursorFactory factory, int databaseVersion) {\n        super(context, databaseName, factory, databaseVersion);\n    }\n\n    public abstract void deleteDatabase();\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/DbHelperFactory.java",
    "content": "package ca.fuwafuwa.kaku.Database;\n\nimport android.content.Context;\n\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.JmDatabaseHelper;\nimport ca.fuwafuwa.kaku.Database.KanjiDict2Database.Kd2DatabaseHelper;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\n\npublic class DbHelperFactory {\n\n    private static Context mContext;\n\n    public DbHelperFactory(Context context){\n        mContext = context;\n    }\n\n    public DatabaseHelper instance(Class clazz){\n        if (clazz == JmDatabaseHelper.class) {\n            return JmDatabaseHelper.instance(mContext);\n        }\n        else if (clazz == Kd2DatabaseHelper.class){\n            return Kd2DatabaseHelper.instance(mContext);\n        }\n        else {\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/IDatabaseHelper.java",
    "content": "package ca.fuwafuwa.kaku.Database;\n\nimport com.j256.ormlite.dao.Dao;\n\nimport java.sql.SQLException;\n\npublic interface IDatabaseHelper\n{\n    <T> Dao<T, Integer> getDbDao(Class clazz) throws SQLException;\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/JmDatabaseHelper.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase;\n\nimport android.content.Context;\nimport android.database.sqlite.SQLiteDatabase;\nimport android.util.Log;\n\nimport com.j256.ormlite.dao.Dao;\nimport com.j256.ormlite.support.ConnectionSource;\nimport com.j256.ormlite.table.TableUtils;\n\nimport java.sql.SQLException;\n\nimport ca.fuwafuwa.kaku.Constants;\nimport ca.fuwafuwa.kaku.Database.DatabaseHelper;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.Entry;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.EntryOptimized;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.Kanji;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.KanjiIrregularity;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.KanjiPriority;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.Meaning;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningAdditionalInfo;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningAntonym;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningCrossReference;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningDialect;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningField;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningGloss;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningKanjiRestriction;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningLoanSource;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningMisc;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningPartOfSpeech;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningReadingRestriction;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.Reading;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.ReadingIrregularity;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.ReadingPriority;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.ReadingRestriction;\nimport ca.fuwafuwa.kaku.Exceptions.NotImplementedException;\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/26/2016.\n */\npublic class JmDatabaseHelper extends DatabaseHelper {\n\n    private static final String TAG = JmDatabaseHelper.class.getName();\n\n    private static final String DATABASE_NAME = Constants.JMDICT_DATABASE_NAME;\n    private static final int DATABASE_VERSION = 1;\n\n    private static JmDatabaseHelper instance;\n\n    private Context mContext;\n\n    private JmDatabaseHelper(Context context){\n        super(context, String.format(\"%s/%s\", context.getFilesDir().getAbsolutePath(), DATABASE_NAME), null, DATABASE_VERSION);\n        Log.d(TAG, \"JmDatabaseHelper Constructor\");\n        mContext = context;\n    }\n\n    public static synchronized JmDatabaseHelper instance(Context context){\n        if (instance == null){\n            instance = new JmDatabaseHelper(context);\n        }\n        return instance;\n    }\n\n    @Override\n    public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {\n        Log.d(TAG, \"JmDatabaseHelper onCreate\");\n        try {\n            TableUtils.createTable(connectionSource, EntryOptimized.class);\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n    }\n\n    @Override\n    public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {\n        // Can't use onUpgrade, because getDbDao() will sometimes run first due to being on another thread, opening a DB connection and causing issues when we try to delete the DB\n        throw new NotImplementedException();\n    }\n\n    public void deleteDatabase(){\n        mContext.deleteDatabase(String.format(\"%s/%s\", mContext.getFilesDir().getAbsolutePath(), DATABASE_NAME));\n    }\n\n    public <T> Dao<T, Integer> getDbDao(Class clazz) throws SQLException {\n        return getDao(clazz);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/Entry.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.dao.ForeignCollection;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.field.ForeignCollectionField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 5/2/2016.\n */\n@DatabaseTable\npublic class Entry {\n\n    @Expose\n    @DatabaseField(id = true)\n    private Integer id;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<Kanji> kanjis;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<Reading> readings;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<Meaning> meanings;\n\n    public Entry(){\n    }\n\n    public Integer getId() {\n        return id;\n    }\n\n    public void setId(Integer id) {\n        this.id = id;\n    }\n\n    public ForeignCollection<Kanji> getKanjis() {\n        return kanjis;\n    }\n\n    public void setKanjis(ForeignCollection<Kanji> kanjis) {\n        this.kanjis = kanjis;\n    }\n\n    public ForeignCollection<Reading> getReadings() {\n        return readings;\n    }\n\n    public void setReadings(ForeignCollection<Reading> readings) {\n        this.readings = readings;\n    }\n\n    public ForeignCollection<Meaning> getMeanings() {\n        return meanings;\n    }\n\n    public void setMeanings(ForeignCollection<Meaning> meanings) {\n        this.meanings = meanings;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n\n    @Override\n    public boolean equals(Object o) {\n        if (this == o) return true;\n        if (o == null || getClass() != o.getClass()) return false;\n\n        Entry entry1 = (Entry) o;\n\n        return id.equals(entry1.id);\n    }\n\n    @Override\n    public int hashCode() {\n        return id.hashCode();\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/EntryOptimized.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DataType;\nimport com.j256.ormlite.field.DatabaseField;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\n\npublic class EntryOptimized implements Comparable<EntryOptimized> {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose\n    @DatabaseField\n    private String kanji;\n\n    @Expose\n    @DatabaseField(dataType = DataType.LONG_STRING)\n    private String readings;\n\n    @Expose\n    @DatabaseField(dataType = DataType.LONG_STRING)\n    private String meanings;\n\n    @Expose\n    @DatabaseField(dataType = DataType.LONG_STRING)\n    private String pos;\n\n    @Expose\n    @DatabaseField(dataType = DataType.LONG_STRING)\n    private String priorities;\n\n    @Expose\n    @DatabaseField(dataType = DataType.LONG_STRING)\n    private String dictionary;\n\n    @Expose\n    @DatabaseField(dataType = DataType.BOOLEAN)\n    private boolean primaryEntry = false;\n\n    private boolean onlyKana = false;\n\n    public EntryOptimized(){\n    }\n\n    public String getKanji() {\n        return kanji;\n    }\n\n    public void setKanji(String kanji) {\n        this.kanji = kanji;\n    }\n\n    public String getReadings()\n    {\n        if (readings == null)\n        {\n            return \"\";\n        }\n        return readings;\n    }\n\n    public void setReadings(String readings) {\n        this.readings = readings;\n    }\n\n    public String getMeanings() {\n        return meanings;\n    }\n\n    public void setMeanings(String meanings) {\n        this.meanings = meanings;\n    }\n\n    public String getPos()\n    {\n        if (pos == null)\n        {\n            return \"\";\n        }\n        return pos;\n    }\n\n    public void setPos(String pos)\n    {\n        this.pos = pos;\n    }\n\n    public boolean isOnlyKana() {\n        return onlyKana;\n    }\n\n    public void setOnlyKana(boolean onlyKana) {\n        this.onlyKana = onlyKana;\n    }\n\n    public boolean isPrimaryEntry()\n    {\n        return primaryEntry;\n    }\n\n    public void setPrimaryEntry(boolean altForm)\n    {\n        primaryEntry = altForm;\n    }\n\n    public String getPriorities()\n    {\n        if (priorities == null)\n        {\n            return \"\";\n        }\n        return priorities;\n    }\n\n    public void setPriorities(String priorities)\n    {\n        this.priorities = priorities;\n    }\n\n    public String getDictionary()\n    {\n        return dictionary;\n    }\n\n    public void setDictionary(String dictionary)\n    {\n        this.dictionary = dictionary;\n    }\n\n    // Sort by kanji length for results\n    @Override\n    public int compareTo(EntryOptimized another) {\n        if (this.kanji.length() > another.getKanji().length()){\n            return -1;\n        }\n        else if (this.kanji.length() == another.getKanji().length()){\n            return 0;\n        }\n        else {\n            return 1;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/Kanji.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.dao.ForeignCollection;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.field.ForeignCollectionField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class Kanji {\n\n    @Expose(serialize = false)\n    public static final String KANJI_FIELD = \"kanji\";\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Entry fkEntry;\n\n    @Expose\n    @DatabaseField\n    private String kanji;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<KanjiIrregularity> kanjiIrregularities;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<KanjiPriority> kanjiPriorities;\n\n    public String getKanji() {\n        return kanji;\n    }\n\n    public void setKanji(String kanji) {\n        this.kanji = kanji;\n    }\n\n    public Entry getFkEntry() {\n        return fkEntry;\n    }\n\n    public void setFkEntry(Entry fkEntry) {\n        this.fkEntry = fkEntry;\n    }\n\n    public ForeignCollection<KanjiIrregularity> getKanjiIrregularities() {\n        return kanjiIrregularities;\n    }\n\n    public ForeignCollection<KanjiPriority> getKanjiPriorities() {\n        return kanjiPriorities;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/KanjiIrregularity.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class KanjiIrregularity {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Kanji fkKanji;\n\n    @Expose\n    @DatabaseField\n    private String kanjiIrregularity;\n\n    public String getKanjiIrregularity() {\n        return kanjiIrregularity;\n    }\n\n    public void setKanjiIrregularity(String kanjiIrregularity) {\n        this.kanjiIrregularity = kanjiIrregularity;\n    }\n\n    public Kanji getFkKanji() {\n        return fkKanji;\n    }\n\n    public void setFkKanji(Kanji fkKanji) {\n        this.fkKanji = fkKanji;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/KanjiPriority.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class KanjiPriority {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Kanji fkKanji;\n\n    @Expose\n    @DatabaseField\n    private String kanjiPriority;\n\n    public String getKanjiPriority() {\n        return kanjiPriority;\n    }\n\n    public void setKanjiPriority(String kanjiPriority) {\n        this.kanjiPriority = kanjiPriority;\n    }\n\n    public Kanji getFkKanji() {\n        return fkKanji;\n    }\n\n    public void setFkKanji(Kanji fkKanji) {\n        this.fkKanji = fkKanji;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/Meaning.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.dao.ForeignCollection;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.field.ForeignCollectionField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class Meaning {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Entry fkEntry;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<MeaningKanjiRestriction> kanjiRestrictions;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<MeaningReadingRestriction> readingRestrictions;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<MeaningPartOfSpeech> partsOfSpeech;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<MeaningCrossReference> crossReferences;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<MeaningAntonym> antonyms;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<MeaningField> fields;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<MeaningMisc> miscs;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<MeaningAdditionalInfo> additionalInfos;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<MeaningLoanSource> loanSources;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<MeaningDialect> dialects;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<MeaningGloss> glosses;\n\n    public Entry getFkEntry() {\n        return fkEntry;\n    }\n\n    public void setFkEntry(Entry fkEntry) {\n        this.fkEntry = fkEntry;\n    }\n    public ForeignCollection<MeaningKanjiRestriction> getKanjiRestrictions() {\n        return kanjiRestrictions;\n    }\n\n    public ForeignCollection<MeaningReadingRestriction> getReadingRestrictions() {\n        return readingRestrictions;\n    }\n\n    public ForeignCollection<MeaningPartOfSpeech> getPartsOfSpeech() {\n        return partsOfSpeech;\n    }\n\n    public ForeignCollection<MeaningCrossReference> getCrossReferences() {\n        return crossReferences;\n    }\n\n    public ForeignCollection<MeaningAntonym> getAntonyms() {\n        return antonyms;\n    }\n\n    public ForeignCollection<MeaningField> getFields() {\n        return fields;\n    }\n\n    public ForeignCollection<MeaningMisc> getMiscs() {\n        return miscs;\n    }\n\n    public ForeignCollection<MeaningAdditionalInfo> getAdditionalInfos() {\n        return additionalInfos;\n    }\n\n    public ForeignCollection<MeaningLoanSource> getLoanSources() {\n        return loanSources;\n    }\n\n    public ForeignCollection<MeaningDialect> getDialects() {\n        return dialects;\n    }\n\n    public ForeignCollection<MeaningGloss> getGlosses() {\n        return glosses;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/MeaningAdditionalInfo.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class MeaningAdditionalInfo {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Meaning fkMeaning;\n\n    @Expose\n    @DatabaseField\n    private String additionalInfo;\n\n    public String getAdditionalInfo() {\n        return additionalInfo;\n    }\n\n    public void setAdditionalInfo(String additionalInfo) {\n        this.additionalInfo = additionalInfo;\n    }\n\n    public Meaning getFkMeaning() {\n        return fkMeaning;\n    }\n\n    public void setFkMeaning(Meaning fkMeaning) {\n        this.fkMeaning = fkMeaning;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/MeaningAntonym.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class MeaningAntonym {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Meaning fkMeaning;\n\n    @Expose\n    @DatabaseField\n    private String antonym;\n\n    public String getAntonym() {\n        return antonym;\n    }\n\n    public void setAntonym(String antonym) {\n        this.antonym = antonym;\n    }\n\n    public Meaning getFkMeaning() {\n        return fkMeaning;\n    }\n\n    public void setFkMeaning(Meaning fkMeaning) {\n        this.fkMeaning = fkMeaning;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/MeaningCrossReference.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class MeaningCrossReference {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Meaning fkMeaning;\n\n    @Expose\n    @DatabaseField\n    private String crossReference;\n\n    public String getCrossReference() {\n        return crossReference;\n    }\n\n    public void setCrossReference(String crossReference) {\n        this.crossReference = crossReference;\n    }\n\n    public Meaning getFkMeaning() {\n        return fkMeaning;\n    }\n\n    public void setFkMeaning(Meaning fkMeaning) {\n        this.fkMeaning = fkMeaning;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/MeaningDialect.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class MeaningDialect {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Meaning fkMeaning;\n\n    @Expose\n    @DatabaseField\n    private String dialect;\n\n    public String getDialect() {\n        return dialect;\n    }\n\n    public void setDialect(String dialect) {\n        this.dialect = dialect;\n    }\n\n    public Meaning getFkMeaning() {\n        return fkMeaning;\n    }\n\n    public void setFkMeaning(Meaning fkMeaning) {\n        this.fkMeaning = fkMeaning;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/MeaningField.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class MeaningField {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Meaning fkMeaning;\n\n    @Expose\n    @DatabaseField\n    private String field;\n\n    public String getField() {\n        return field;\n    }\n\n    public void setField(String field) {\n        this.field = field;\n    }\n\n    public Meaning getFkMeaning() {\n        return fkMeaning;\n    }\n\n    public void setFkMeaning(Meaning fkMeaning) {\n        this.fkMeaning = fkMeaning;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/MeaningGloss.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class MeaningGloss {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Meaning fkMeaning;\n\n    @Expose\n    @DatabaseField\n    private String gloss;\n\n    @Expose\n    @DatabaseField\n    private String lang;\n\n    @Expose\n    @DatabaseField\n    private String gender;\n\n    public String getGloss() {\n        return gloss;\n    }\n\n    public void setGloss(String gloss) {\n        this.gloss = gloss;\n    }\n\n    public String getLang() {\n        return lang;\n    }\n\n    public void setLang(String lang) {\n        this.lang = lang;\n    }\n\n    public String getGender() {\n        return gender;\n    }\n\n    public void setGender(String gender) {\n        this.gender = gender;\n    }\n\n    public Meaning getFkMeaning() {\n        return fkMeaning;\n    }\n\n    public void setFkMeaning(Meaning fkMeaning) {\n        this.fkMeaning = fkMeaning;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/MeaningKanjiRestriction.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class MeaningKanjiRestriction {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Meaning fkMeaning;\n\n    @Expose\n    @DatabaseField\n    private String kanjiRestriction;\n\n    public String getKanjiRestriction() {\n        return kanjiRestriction;\n    }\n\n    public void setKanjiRestriction(String kanjiRestriction) {\n        this.kanjiRestriction = kanjiRestriction;\n    }\n\n    public Meaning getFkMeaning() {\n        return fkMeaning;\n    }\n\n    public void setFkMeaning(Meaning fkMeaning) {\n        this.fkMeaning = fkMeaning;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/MeaningLoanSource.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class MeaningLoanSource {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Meaning fkMeaning;\n\n    @Expose\n    @DatabaseField\n    private String loanSource;\n\n    @Expose\n    @DatabaseField\n    private String lang;\n\n    @Expose\n    @DatabaseField\n    private String type;\n\n    @Expose\n    @DatabaseField\n    private String waseieigo;\n\n    public String getLoanSource() {\n        return loanSource;\n    }\n\n    public void setLoanSource(String loanSource) {\n        this.loanSource = loanSource;\n    }\n\n    public String getLang() {\n        return lang;\n    }\n\n    public void setLang(String lang) {\n        this.lang = lang;\n    }\n\n    public String getType() {\n        return type;\n    }\n\n    public void setType(String type) {\n        this.type = type;\n    }\n\n    public String getWaseieigo() {\n        return waseieigo;\n    }\n\n    public void setWaseieigo(String waseieigo) {\n        this.waseieigo = waseieigo;\n    }\n\n    public Meaning getFkMeaning() {\n        return fkMeaning;\n    }\n\n    public void setFkMeaning(Meaning fkMeaning) {\n        this.fkMeaning = fkMeaning;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/MeaningMisc.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class MeaningMisc {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Meaning fkMeaning;\n\n    @Expose\n    @DatabaseField\n    private String misc;\n\n    public String getMisc() {\n        return misc;\n    }\n\n    public void setMisc(String misc) {\n        this.misc = misc;\n    }\n\n    public Meaning getFkMeaning() {\n        return fkMeaning;\n    }\n\n    public void setFkMeaning(Meaning fkMeaning) {\n        this.fkMeaning = fkMeaning;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/MeaningPartOfSpeech.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class MeaningPartOfSpeech {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Meaning fkMeaning;\n\n    @Expose\n    @DatabaseField\n    private String partOfSpeech;\n\n    public String getPartOfSpeech() {\n        return partOfSpeech;\n    }\n\n    public void setPartOfSpeech(String partOfSpeech) {\n        this.partOfSpeech = partOfSpeech;\n    }\n\n    public Meaning getFkMeaning() {\n        return fkMeaning;\n    }\n\n    public void setFkMeaning(Meaning fkMeaning) {\n        this.fkMeaning = fkMeaning;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/MeaningReadingRestriction.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class MeaningReadingRestriction {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Meaning fkMeaning;\n\n    @Expose\n    @DatabaseField\n    private String readingRestriction;\n\n    public String getReadingRestriction() {\n        return readingRestriction;\n    }\n\n    public void setReadingRestriction(String readingRestriction) {\n        this.readingRestriction = readingRestriction;\n    }\n\n    public Meaning getFkMeaning() {\n        return fkMeaning;\n    }\n\n    public void setFkMeaning(Meaning fkMeaning) {\n        this.fkMeaning = fkMeaning;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/Reading.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.dao.ForeignCollection;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.field.ForeignCollectionField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class Reading {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Entry fkEntry;\n\n    @Expose\n    @DatabaseField\n    private String reading;\n\n    @Expose\n    @DatabaseField\n    private String falseReading;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<ReadingRestriction> readingRestrictions;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<ReadingIrregularity> readingIrregularities;\n\n    @Expose\n    @ForeignCollectionField()\n    private ForeignCollection<ReadingPriority> readingPriorities;\n\n    public String getReading() {\n        return reading;\n    }\n\n    public void setReading(String reading) {\n        this.reading = reading;\n    }\n\n    public String getFalseReading() {\n        return falseReading;\n    }\n\n    public void setFalseReading(String falseReading) {\n        this.falseReading = falseReading;\n    }\n\n    public Entry getFkEntry() {\n        return fkEntry;\n    }\n\n    public void setFkEntry(Entry fkEntry) {\n        this.fkEntry = fkEntry;\n    }\n\n    public ForeignCollection<ReadingRestriction> getReadingRestrictions() {\n        return readingRestrictions;\n    }\n\n    public ForeignCollection<ReadingIrregularity> getReadingIrregularities() {\n        return readingIrregularities;\n    }\n\n    public ForeignCollection<ReadingPriority> getReadingPriorities() {\n        return readingPriorities;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/ReadingIrregularity.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class ReadingIrregularity {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Reading fkReading;\n\n    @Expose\n    @DatabaseField\n    private String readingIrregularity;\n\n    public String getReadingIrregularity() {\n        return readingIrregularity;\n    }\n\n    public void setReadingIrregularity(String readingIrregularity) {\n        this.readingIrregularity = readingIrregularity;\n    }\n\n    public Reading getFkReading() {\n        return fkReading;\n    }\n\n    public void setFkReading(Reading fkReading) {\n        this.fkReading = fkReading;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/ReadingPriority.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class ReadingPriority {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Reading fkReading;\n\n    @Expose\n    @DatabaseField\n    private String readingPriority;\n\n    public String getReadingPriority() {\n        return readingPriority;\n    }\n\n    public void setReadingPriority(String readingPriority) {\n        this.readingPriority = readingPriority;\n    }\n\n    public Reading getFkReading() {\n        return fkReading;\n    }\n\n    public void setFkReading(Reading fkReading) {\n        this.fkReading = fkReading;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/JmDictDatabase/Models/ReadingRestriction.java",
    "content": "package ca.fuwafuwa.kaku.Database.JmDictDatabase.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DatabaseField;\nimport com.j256.ormlite.table.DatabaseTable;\n\nimport ca.fuwafuwa.kaku.KakuTools;\n\n/**\n * Created by 0xbad1d3a5 on 7/25/2016.\n */\n@DatabaseTable\npublic class ReadingRestriction {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose(serialize = false)\n    @DatabaseField(foreign = true)\n    private Reading fkReading;\n\n    @Expose\n    @DatabaseField\n    private String readingRestriction;\n\n    public String getReadingRestriction() {\n        return readingRestriction;\n    }\n\n    public void setReadingRestriction(String readingRestriction) {\n        this.readingRestriction = readingRestriction;\n    }\n\n    public Reading getFkReading() {\n        return fkReading;\n    }\n\n    public void setFkReading(Reading fkReading) {\n        this.fkReading = fkReading;\n    }\n\n    @Override\n    public String toString() {\n        return KakuTools.toJson(this);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/KanjiDict2Database/Kd2DatabaseHelper.java",
    "content": "package ca.fuwafuwa.kaku.Database.KanjiDict2Database;\n\nimport android.content.Context;\nimport android.database.sqlite.SQLiteDatabase;\n\nimport com.j256.ormlite.dao.Dao;\nimport com.j256.ormlite.support.ConnectionSource;\nimport com.j256.ormlite.table.TableUtils;\n\nimport java.sql.SQLException;\n\nimport ca.fuwafuwa.kaku.Constants;\nimport ca.fuwafuwa.kaku.Database.DatabaseHelper;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.EntryOptimized;\nimport ca.fuwafuwa.kaku.Database.KanjiDict2Database.Models.CharacterOptimized;\nimport ca.fuwafuwa.kaku.Exceptions.NotImplementedException;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\n\npublic class Kd2DatabaseHelper extends DatabaseHelper {\n\n    private static final String DATABASE_NAME = Constants.JMDICT_DATABASE_NAME;\n    private static final int DATABASE_VERSION = 1;\n\n    private static Kd2DatabaseHelper instance;\n\n    private Context mContext;\n\n    public Kd2DatabaseHelper(Context context){\n        super(context, String.format(\"%s/%s\", context.getFilesDir().getAbsolutePath(), DATABASE_NAME), null, DATABASE_VERSION);\n        mContext = context;\n    }\n\n    public static synchronized Kd2DatabaseHelper instance(Context context){\n        if (instance == null){\n            instance = new Kd2DatabaseHelper(context);\n        }\n        return instance;\n    }\n\n    @Override\n    public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {\n        try {\n            TableUtils.createTable(connectionSource, EntryOptimized.class);\n        }\n        catch (SQLException e){\n            e.printStackTrace();\n        }\n    }\n\n    @Override\n    public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {\n        throw new NotImplementedException();\n    }\n\n    @Override\n    public void deleteDatabase() {\n        //mContext.deleteDatabase(String.format(\"%s/%s\", mContext.getFilesDir().getAbsolutePath(), DATABASE_NAME));\n    }\n\n    @Override\n    public <T> Dao<T, Integer> getDbDao(Class clazz) throws SQLException {\n        return getDao(clazz);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Database/KanjiDict2Database/Models/CharacterOptimized.java",
    "content": "package ca.fuwafuwa.kaku.Database.KanjiDict2Database.Models;\n\nimport com.google.gson.annotations.Expose;\nimport com.j256.ormlite.field.DataType;\nimport com.j256.ormlite.field.DatabaseField;\n\n/**\n * Created by 0xbad1d3a5 on 12/3/2016.\n */\n\npublic class CharacterOptimized {\n\n    @Expose(serialize = false)\n    @DatabaseField(generatedId = true)\n    private Integer id;\n\n    @Expose\n    @DatabaseField\n    private String kanji;\n\n    @Expose\n    @DatabaseField(dataType = DataType.LONG_STRING)\n    private String onyomi;\n\n    @Expose\n    @DatabaseField(dataType = DataType.LONG_STRING)\n    private String kunyomi;\n\n    @Expose\n    @DatabaseField(dataType = DataType.LONG_STRING)\n    private String meaning;\n\n    public String getKanji() {\n        return kanji;\n    }\n\n    public void setKanji(String kanji) {\n        this.kanji = kanji;\n    }\n\n    public String getOnyomi() {\n        return onyomi;\n    }\n\n    public void setOnyomi(String onyomi) {\n        this.onyomi = onyomi;\n    }\n\n    public String getKunyomi() {\n        return kunyomi;\n    }\n\n    public void setKunyomi(String kunyomi) {\n        this.kunyomi = kunyomi;\n    }\n\n    public String getMeaning() {\n        return meaning;\n    }\n\n    public void setMeaning(String meaning) {\n        this.meaning = meaning;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Deinflictor/DeinflectionDTOs.kt",
    "content": "package ca.fuwafuwa.kaku.Deinflictor\n\n/**\n * A RuleGroup is composed of multiple rules that share the same [DeinflectionRule.from] length\n *\n * @property rules List containing the rules in the RuleGroup\n * @property fromLength The [DeinflectionRule.from] length of the RuleGroup\n */\nclass DeinflectionRuleGroup\n{\n    val rules: ArrayList<DeinflectionRule> = ArrayList()\n    var fromLength: Int = 0\n}\n\n/**\n * Data class to represent each rule in deinflect.dat\n *\n * @property from The inflected form\n * @property to The deinflected form\n * @property type Bitmask for determining whether to continue processing deinflection.\n * This is kinda Japanese black magic and I don't really understand it that well either.\n * @property reason Deinflection reason\n */\ndata class DeinflectionRule(\n        val from: String,\n        val to: String,\n        val type: Int,\n        val reason: String)\n\n/**\n * Class to represent a deinflected word\n *\n * @property word The deinflected word\n * @property type Bitmask for determining whether to continue processing deinflection\n * @property reason Deinflection reason\n */\nclass DeinflectionInfo(\n        var word: String,\n        var type: Int,\n        var reason: String)"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Deinflictor/Deinflector.kt",
    "content": "package ca.fuwafuwa.kaku.Deinflictor\n\nimport android.content.Context\nimport ca.fuwafuwa.kaku.LangUtils\nimport java.io.BufferedReader\n\nclass Deinflector(context: Context) {\n\n    private val _ruleGroups: ArrayList<DeinflectionRuleGroup> = ArrayList()\n\n    init\n    {\n        loadRules(context.assets.open(\"deinflect.dat\").bufferedReader(Charsets.UTF_8))\n    }\n\n    private fun loadRules(reader: BufferedReader)\n    {\n        // Skip header\n        reader.readLine()\n\n        var ruleGroup = DeinflectionRuleGroup()\n        ruleGroup.fromLength = -1\n\n        var ruleReasons: ArrayList<String> = ArrayList()\n\n        reader.forEachLine {\n\n            var fields: List<String> = it.split(\"\\t\")\n\n            // Parse reason from file\n            if (fields.size == 1)\n            {\n                ruleReasons.add(fields[0].trim())\n            }\n            // Parse rule from file\n            else if (fields.size == 4)\n            {\n                var rule = DeinflectionRule(fields[0].trim(),\n                        fields[1].trim(),\n                        fields[2].trim().toInt(),\n                        ruleReasons.get(fields[3].trim().toInt()))\n\n                // Group inflections of the same length together into the same RuleGroup\n                if (ruleGroup.fromLength != rule.from.length){\n                    ruleGroup = DeinflectionRuleGroup()\n                    ruleGroup.fromLength = rule.from.length\n                    _ruleGroups.add(ruleGroup)\n                }\n\n                ruleGroup.rules.add(rule)\n            }\n        }\n    }\n\n    /**\n     * Gets potential deinflections of an inflected word.\n     * Does not guarantee that each deinflection is a real word.\n     *\n     * Example:\n     * かった\tい\t1152 (00000000 00000000 00000100 10000000)\t14 (past)\n     * ない\tる\t2308 (00000000 00000000 00001001 00000100)\t15 (negative)\n     *\n     * Starting word: 食べなかった\n     *\n     * 食べなかった\n     * - 食べない\n     * - 00000000 00000000 00000000 00000100\n     * - \"< past\"\n     *\n     * 食べない\n     * - 食べる\n     * - 00000000 00000000 00000000 00001001\n     * - \"< negative\"\n     *\n     * Chain is: [\"食べない\", \"食べる\"]\n     */\n    fun getPotentialDeinflections(word: String): List<DeinflectionInfo> {\n\n        var text: String = word //LangUtils.ConvertKanatanaToHiragana(word)\n\n        // Chain of inflections encountered\n        var deinfWordChain = ArrayList<DeinflectionInfo>()\n        deinfWordChain.add(DeinflectionInfo(text, 0xFF, \"\"))\n\n        // Map of possible deinflections to its deinfWordList index\n        var prevSeenDeinfWords = HashMap<String, Int>()\n        prevSeenDeinfWords[text] = 0\n\n        var currWordChainIndex = 0\n\n        do\n        {\n            var currDeinflectionInfo: DeinflectionInfo = deinfWordChain.get(currWordChainIndex)\n            var currWord: String = currDeinflectionInfo.word\n\n            for (ruleGroup in _ruleGroups)\n            {\n                // Only process RuleGroup if inflected word is longer than the group\n                if (ruleGroup.fromLength > currWord.length) continue\n\n                // Get the last X characters of word so that wordTail is the same length as the RuleGroup\n                var wordTail: String = currWord.substring(currWord.length - ruleGroup.fromLength)\n\n                for (rule in ruleGroup.rules)\n                {\n                    // Only process rule if wordTail matches a valid inflection rule\n                    // Only process rule if previous word in deinflection chain allows for such a transformation (type does not mask out)\n                    var shouldProcessRule = (currDeinflectionInfo.type and rule.type != 0) && (wordTail == rule.from)\n                    if (!shouldProcessRule) continue\n\n                    // Inflected words must be at least 2 characters in length\n                    var newWord: String = currWord.substring(0, currWord.length - rule.from.length) + rule.to\n                    if (newWord.length <= 1) continue\n\n                    // We've seen this deinflection before under a different rule, update type\n                    var prevSeenWordIndex: Int? = prevSeenDeinfWords.get(newWord)\n                    if (prevSeenWordIndex != null)\n                    {\n                        var prevSeenWordType: Int = deinfWordChain[prevSeenWordIndex].type\n                        deinfWordChain[prevSeenWordIndex].type = prevSeenWordType or (rule.type shr 8)\n                        continue\n                    }\n\n                    // Add new deinflection to the deinflection chain\n                    var newDeinflectedWord = DeinflectionInfo(\n                            newWord,\n                            rule.type shr 8,\n                            if (currDeinflectionInfo.reason.isNotEmpty()) \"< ${rule.reason} ${currDeinflectionInfo.reason}\" else \"< ${rule.reason}\"\n                    )\n                    prevSeenDeinfWords[newWord] = deinfWordChain.size\n                    deinfWordChain.add(newDeinflectedWord)\n                }\n            }\n        } while (++currWordChainIndex < deinfWordChain.size)\n\n        return deinfWordChain\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Deinflictor/PosMap.kt",
    "content": "package ca.fuwafuwa.kaku.Deinflictor\n\nclass PosMap {\n\n    companion object {\n\n        fun GetPosMapVal(pos: String) : String {\n\n            return when(pos){\n\n                \"*\" -> \"*\"\n\n                \"一般\" -> \"general\"\n\n                \"形容詞\" -> \"adjective\"\n                \"形容詞・アウオ段\" -> \"adjective auo-end\"\n                \"形容詞・イ段\" -> \"adjective i-end\"\n                \"形容詞・イイ\" -> \"adjective ii\"\n                \"副詞\" -> \"adverb\"\n                \"助動詞\" -> \"auxiliary verb\"\n                \"接続詞\" -> \"conjunction\"\n                \"接続助詞\" -> \"conjunction particle\"\n                \"連体詞\" -> \"pre-noun adjectival\"\n                \"感動詞\" -> \"interjection\"\n                \"名詞\" -> \"noun\"\n                \"助詞\" -> \"particle\"\n                \"格助詞\" -> \"case-marking particle\"\n                \"終助詞\" -> \"sentence-ending particle\"\n                \"副助詞\" -> \"adverbial particle\"\n                \"並立助詞\" -> \"parallel marker\"\n                \"係助詞  \" -> \"binding particle\"\n                \"副助詞／並立助詞／終助詞\" -> \"adverbial particle/parallel marker/binding particle\"\n                \"接頭詞\" -> \"prefix\"\n                \"助数詞\" -> \"counter suffix\"\n                \"動詞\" -> \"verb\"\n                \"代名詞\" -> \"pronoun\"\n                \"固有名詞\" -> \"proper noun\"\n\n                \"動詞非自立的\" -> pos\n                \"形容動詞語幹\" -> pos\n                \"副詞可能\" -> pos\n                \"ナイ形容詞語幹\" -> pos\n                \"助動詞語幹\" -> pos\n                \"接続詞的\" -> \"conjunction-like\"\n\n                \"自立\" -> \"independent\"\n                \"非自立\" -> \"not independent\"\n\n                \"基本形\" -> \"basic form\"\n                \"文語基本形\" -> \"classical basic form\"\n                \"仮定形\" -> \"hypothetical form\"\n                \"未然形\" -> \"imperfective form (nai stem)\"\n                \"連用形\" -> \"conjunctive form (masu stem)\"\n                \"音便基本形\" -> \"euphonic change basic form\"\n                \"現代基本形\" -> \"modern basic form\"\n                \"基本形-促音便\" -> \"basic form - nasal sound change\"\n\n                \"未然ヌ接続\" -> \"before -ta link\"\n                \"未然ウ接続\" -> \"before -u link\"\n                \"未然レル接続\" -> \"before -reru link\"\n                \"連用タ接続\" -> \"continuous -ta link\"\n                \"連用テ接続\" -> \"continuous -te link\"\n                \"連用ニ接続\" -> \"continuous -ni link\"\n                \"連用デ接続\" -> \"continuous -de link\"\n                \"連用ゴザイ接続\" -> \"continuous -gozai link\"\n                \"体言接続\" -> \"uninflected word link\"\n                \"ガル接続\" -> \"-garu link\"\n                \"助詞類接続\" -> \"particle link\"\n                \"サ変接続\" -> \"irregular link\"\n                \"名詞接続\" -> \"noun link\"\n                \"形容詞接続\" -> \"adjective link\"\n                \"数接続\" -> \"number link\"\n                \"動詞接続\" -> \"verb link\"\n                \"体言接続特殊\" -> \"special uninflected word link\"\n                \"体言接続特殊２\" -> \"special uninflected word link 2\"\n\n                \"仮定縮約１\" -> \"assumed contraction 1\"\n                \"仮定縮約２\" -> \"assumed contraction 2\"\n\n                \"接尾\" -> \"suffix\"\n                \"不変化型\" -> \"Invariant type\"\n                \"未然特殊\" -> \"before special\"\n                \"連語\" -> \"compound word\"\n                \"フィラー\" -> pos\n\n                \"連体化\" -> pos\n                \"副詞化\" -> pos\n\n                \"特殊\" -> \"special\"\n                \"特殊・マス\" -> \"masu\"\n                \"特殊・デス\" -> \"desu\"\n                \"特殊・ジャ\" -> \"jya\"\n                \"特殊・タ\" -> \"ta\"\n                \"特殊・タイ\" -> \"tai\"\n                \"特殊・ヌ\" -> \"nu\"\n                \"特殊・ヤ\" -> \"ya\"\n                \"特殊・ナイ\" -> \"nai\"\n                \"特殊・ダ\" -> \"da\"\n\n                \"命令ｅ\" -> \"e-command\"\n                \"命令ｉ\" -> \"i-command\"\n                \"命令ｙｏ\" -> \"yo-command\"\n                \"命令ｒｏ\" -> \"ro-command\"\n\n                \"文語・ベシ\" -> \"classical beshi\"\n                \"文語・マジ\" -> \"classical maji\"\n                \"文語・キ\" -> \"classical ki\"\n                \"文語・ナリ\" -> \"classical nari\"\n                \"文語・ル\" -> \"classical ru\"\n                \"文語・リ\" -> \"classical ri\"\n                \"文語・ケリ\" -> \"classical keri\"\n                \"文語・ゴトシ\" -> \"classical gotoshi\"\n\n                \"一段\" -> \"ichidan verb\"\n                \"一段・クレル\" -> \"ichidan verb kureru\"\n                \"一段・得ル\" -> \"ichidan verb eru\"\n\n                \"四段・ハ行\" -> \"yodan verb ha\"\n                \"四段・タ行\" -> \"yodan verb ta\"\n                \"四段・サ行\" -> \"yodan verb sa\"\n                \"四段・バ行\" -> \"yodan verb ba\"\n\n                \"五段・ラ行特殊\" -> pos\n                \"五段・ラ行アル\" -> pos\n                \"五段・マ行\" -> pos\n                \"五段・サ行\" -> pos\n                \"五段・ラ行\" -> pos\n                \"五段・ワ行促音便\" -> pos\n                \"五段・カ行イ音便\" -> pos\n                \"五段・ガ行\" -> pos\n                \"五段・バ行\" -> pos\n                \"五段・タ行\" -> pos\n                \"五段・ナ行\" -> pos\n                \"五段・ワ行ウ音便\" -> pos\n                \"五段・カ行促音便ユク\" -> pos\n                \"五段・カ行促音便\" -> pos\n\n                \"上二・ハ行\" -> pos\n                \"上二・ダ行\" -> pos\n\n                \"下二・タ行\" -> pos\n                \"下二・ハ行\" -> pos\n                \"下二・ガ行\" -> pos\n                \"下二・カ行\" -> pos\n                \"下二・得\" -> pos\n                \"下二・マ行\" -> pos\n                \"下二・ダ行\" -> pos\n\n                \"サ変・−ズル\" -> pos\n                \"サ変・−スル\" -> pos\n                \"カ変・来ル\" -> pos\n                \"ラ変\" -> pos\n                \"サ変・スル\" -> pos\n                \"カ変・クル\" -> pos\n\n                \"縮約\" -> pos\n                \"人名\" -> pos\n                \"名\" -> pos\n                \"姓\" -> pos\n                \"数\" -> pos\n                \"組織\" -> pos\n                \"引用文字列\" -> pos\n                \"地域\" -> pos\n                \"国\" -> pos\n                \"引用\" -> pos\n                \"その他\" -> pos\n                \"間投\" -> pos\n                \"記号\" -> pos\n                \"アルファベット\" -> pos\n                \"括弧閉\" -> pos\n                \"括弧開\" -> pos\n                \"読点\" -> pos\n                \"句点\" -> pos\n                \"空白\" -> pos\n\n                else -> \"UNMAPPED\"\n            };\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Dialogs/FeedbackDialogFragment.kt",
    "content": "package ca.fuwafuwa.kaku.Dialogs\n\nimport android.app.AlertDialog\nimport android.app.Dialog\nimport android.content.ActivityNotFoundException\nimport android.content.Context\nimport android.content.Intent\nimport android.net.Uri\nimport android.os.Bundle\nimport android.widget.Toast\nimport androidx.fragment.app.DialogFragment\nimport ca.fuwafuwa.kaku.KAKU_PREF_FILE\nimport ca.fuwafuwa.kaku.KAKU_PREF_PLAY_STORE_RATED\n\nclass FeedbackDialogFragment : DialogFragment()\n{\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog\n    {\n        return activity?.let {\n\n            val builder = AlertDialog.Builder(it)\n\n            builder.setTitle(\"Thanks for your feedback!\")\n                    .setMessage(\"Do you have anything you wish to say to the developer about Kaku? Bugs, feature requests, annoyances, anything goes!\")\n                    .setPositiveButton(\"SEND EMAIL\")\n                    {\n                        _, _ ->\n                        run {\n                            val emailIntent = Intent(android.content.Intent.ACTION_SENDTO)\n                            emailIntent.type = \"text/plain\"\n                            emailIntent.data = Uri.parse(\"mailto:\")\n                            emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, arrayOf(\"0xbad1d3a5@gmail.com\"))\n                            emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, \"Kaku Feedback - ${android.os.Build.BRAND + \" \" + android.os.Build.MODEL}\")\n\n                            startActivity(Intent.createChooser(emailIntent, \"Send e-mail using...\"))\n                        }\n                    }\n                    .setNegativeButton(\"CANCEL\")\n                    {\n                        _, _ ->\n                        run {\n                        }\n                    }\n\n            builder.create()\n\n        } ?: throw IllegalStateException(\"Activity cannot be null\")\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Dialogs/GrantPermissionDialogFragment.kt",
    "content": "package ca.fuwafuwa.kaku.Dialogs\n\nimport android.app.AlertDialog\nimport android.app.Dialog\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Bundle\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.FragmentActivity\nimport ca.fuwafuwa.kaku.KAKU_PREF_FILE\nimport ca.fuwafuwa.kaku.KAKU_PREF_FIRST_LAUNCH\nimport ca.fuwafuwa.kaku.MainActivity\n\nclass GrantPermissionDialogFragment : DialogFragment()\n{\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog\n    {\n        return activity?.let {\n\n            val builder = AlertDialog.Builder(it)\n\n            builder.setTitle(\"Grant Kaku Permissions\")\n                    .setMessage(\"Kaku uses optical character recognition (OCR) to detect text from images and works by automatically taking screenshots of your screen when active. After granting permissions, please restart Kaku.\\n\\nKaku works completely offline and WILL NEVER transmit ANY user data encountered during usage.\")\n                    .setPositiveButton(\"GRANT\")\n                    {\n                        _, _ ->\n                        run {\n                            val prefs = context!!.getSharedPreferences(KAKU_PREF_FILE, Context.MODE_PRIVATE)\n                            prefs.edit().putBoolean(KAKU_PREF_FIRST_LAUNCH, false).apply()\n\n                            startActivity(Intent(activity, MainActivity::class.java))\n                            (activity as FragmentActivity).finish()\n                        }\n                    }\n                    .setNegativeButton(\"CANCEL\")\n                    {\n                        _, _ ->\n                        run {\n                        }\n                    }\n\n            builder.create()\n\n        } ?: throw IllegalStateException(\"Activity cannot be null\")\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Dialogs/PlayStoreRatingDialogFragment.kt",
    "content": "package ca.fuwafuwa.kaku.Dialogs\n\nimport android.app.AlertDialog\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.fragment.app.DialogFragment\nimport android.widget.Toast\nimport android.content.ActivityNotFoundException\nimport android.content.Context\nimport android.content.Intent\nimport android.net.Uri\nimport ca.fuwafuwa.kaku.KAKU_PREF_FILE\nimport ca.fuwafuwa.kaku.KAKU_PREF_PLAY_STORE_RATED\n\n\nclass PlayStoreRatingDialogFragment : DialogFragment()\n{\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog\n    {\n        return activity?.let {\n\n            val builder = AlertDialog.Builder(it)\n            val prefs = requireContext().getSharedPreferences(KAKU_PREF_FILE, Context.MODE_PRIVATE)\n\n            builder.setTitle(\"Thanks for your feedback!\")\n                    .setMessage(\"Would you like to rate the app in the Play Store? It would mean a lot to me and helps support the app!\")\n                    .setPositiveButton(\"OK\")\n                    {\n                        _, _ ->\n                        run {\n                            launchMarket()\n                            prefs.edit().putBoolean(KAKU_PREF_PLAY_STORE_RATED, true).apply()\n                        }\n                    }\n                    .setNegativeButton(\"NO\")\n                    {\n                        _, _ ->\n                        run {\n                        }\n                    }\n                    .setNeutralButton(\"NEVER ASK AGAIN\")\n                    {\n                        _, _ ->\n                        run {\n                            prefs.edit().putBoolean(KAKU_PREF_PLAY_STORE_RATED, true).apply()\n                        }\n                    }\n\n            builder.create()\n\n        } ?: throw IllegalStateException(\"Activity cannot be null\")\n    }\n\n    private fun launchMarket()\n    {\n        val uri = Uri.parse(\"market://details?id=\" + requireActivity().packageName)\n        val linkToMarket = Intent(Intent.ACTION_VIEW, uri)\n\n        try\n        {\n            startActivity(linkToMarket)\n        } catch (e: ActivityNotFoundException)\n        {\n            Toast.makeText(requireContext(), \"Unable to launch Play Store\", Toast.LENGTH_LONG).show()\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Dialogs/StarRatingDialogFragment.kt",
    "content": "package ca.fuwafuwa.kaku.Dialogs\n\nimport android.app.AlertDialog\nimport android.app.Dialog\nimport android.content.Context\nimport android.os.Bundle\nimport android.widget.TextView\nimport androidx.fragment.app.DialogFragment\nimport ca.fuwafuwa.kaku.KAKU_PREF_FILE\nimport ca.fuwafuwa.kaku.KAKU_PREF_PLAY_STORE_RATED\nimport ca.fuwafuwa.kaku.R\n\nclass StarRatingDialogFragment : DialogFragment()\n{\n    private var rating = 0\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog\n    {\n        return activity?.let {\n\n            val builder = AlertDialog.Builder(it)\n\n            val inflater = requireActivity().layoutInflater;\n            val view = inflater.inflate(R.layout.dialog_rating_stars, null)\n\n            val star1 = view.findViewById<TextView>(R.id.dialog_rating_star1)\n            val star2 = view.findViewById<TextView>(R.id.dialog_rating_star2)\n            val star3 = view.findViewById<TextView>(R.id.dialog_rating_star3)\n            val star4 = view.findViewById<TextView>(R.id.dialog_rating_star4)\n            val star5 = view.findViewById<TextView>(R.id.dialog_rating_star5)\n\n            star1.setOnClickListener {\n                star1.text = \"★\"\n                star2.text = \"☆\"\n                star3.text = \"☆\"\n                star4.text = \"☆\"\n                star5.text = \"☆\"\n                rating = 1\n            }\n\n            star2.setOnClickListener {\n                star1.text = \"★\"\n                star2.text = \"★\"\n                star3.text = \"☆\"\n                star4.text = \"☆\"\n                star5.text = \"☆\"\n                rating = 2\n            }\n\n            star3.setOnClickListener {\n                star1.text = \"★\"\n                star2.text = \"★\"\n                star3.text = \"★\"\n                star4.text = \"☆\"\n                star5.text = \"☆\"\n                rating = 3\n            }\n\n            star4.setOnClickListener {\n                star1.text = \"★\"\n                star2.text = \"★\"\n                star3.text = \"★\"\n                star4.text = \"★\"\n                star5.text = \"☆\"\n                rating = 4\n            }\n\n            star5.setOnClickListener {\n                star1.text = \"★\"\n                star2.text = \"★\"\n                star3.text = \"★\"\n                star4.text = \"★\"\n                star5.text = \"★\"\n                rating = 5\n            }\n\n            builder.setTitle(\"What do you think of Kaku?\")\n                    .setView(view)\n                    .setPositiveButton(\"Ok\")\n                    {\n                        _, _ ->\n                        run {\n                            if (rating == 5)\n                            {\n                                PlayStoreRatingDialogFragment().show(requireActivity().supportFragmentManager, \"PlayStoreRating\")\n                            } else\n                            {\n                                val prefs = requireContext().getSharedPreferences(KAKU_PREF_FILE, Context.MODE_PRIVATE)\n                                prefs.edit().putBoolean(KAKU_PREF_PLAY_STORE_RATED, true).apply()\n\n                                FeedbackDialogFragment().show(requireActivity().supportFragmentManager, \"Feedback\")\n                            }\n                        }\n                    }\n                    .setNegativeButton(\"Cancel\")\n                    {\n                        _, _ ->\n                        run {\n                        }\n                    }\n\n            builder.create()\n\n        } ?: throw IllegalStateException(\"Activity cannot be null\")\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Dialogs/TutorialExplainDialogFragment.kt",
    "content": "package ca.fuwafuwa.kaku.Dialogs\n\nimport android.app.AlertDialog\nimport android.app.Dialog\nimport android.os.Bundle\nimport androidx.fragment.app.DialogFragment\n\n\nclass TutorialExplainDialogFragment : DialogFragment()\n{\n    private lateinit var mTitle : String\n    private lateinit var mMessage : String\n\n    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog\n    {\n        mTitle = arguments?.getString(ARG_TITLE)!!\n        mMessage = arguments?.getString(ARG_MESSAGE)!!\n\n        return activity?.let {\n\n            val builder = AlertDialog.Builder(it)\n\n            builder.setTitle(mTitle)\n                    .setMessage(mMessage)\n                    .setPositiveButton(\"OK\")\n                    {\n                        _, _ ->\n                        run {\n                        }\n                    }\n\n            builder.create()\n\n        } ?: throw IllegalStateException(\"Activity cannot be null\")\n    }\n\n    companion object\n    {\n        private val ARG_TITLE = \"arg_title\"\n        private val ARG_MESSAGE = \"arg_message\"\n\n        fun newInstance(title: String, message: String) : TutorialExplainDialogFragment\n        {\n            val dialog = TutorialExplainDialogFragment()\n            val args = Bundle()\n            args.putString(ARG_TITLE, title)\n            args.putString(ARG_MESSAGE, message)\n            dialog.arguments = args\n            return dialog\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Exceptions/NotImplementedException.java",
    "content": "package ca.fuwafuwa.kaku.Exceptions;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\n\npublic class NotImplementedException extends RuntimeException {\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Interfaces/Stoppable.java",
    "content": "package ca.fuwafuwa.kaku.Interfaces;\n\n/**\n * Created by 0xbad1d3a5 on 4/13/2016.\n */\n\npublic interface Stoppable {\n    void stop();\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/KakuTools.kt",
    "content": "@file:JvmName(\"KakuTools\")\n\npackage ca.fuwafuwa.kaku\n\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Build\nimport android.util.DisplayMetrics\nimport android.util.Log\nimport android.widget.Toast\n\nimport com.google.gson.GsonBuilder\nimport java.io.File\nimport java.io.FileOutputStream\nimport java.lang.Exception\n\nimport java.util.ArrayList\n\nprivate const val TAG = \"KakuTools\"\nprivate val gson = GsonBuilder().setPrettyPrinting().disableHtmlEscaping().excludeFieldsWithoutExposeAnnotation().create()\n\nenum class TextDirection(val value: Int) {\n    AUTO(0),\n    HORIZONTAL(1),\n    VERTICAL(2);\n\n    companion object {\n        private val values = values();\n        fun getByValue(value: Int) = values.firstOrNull { it.value == value }\n    }\n}\n\ndata class Prefs(val textDirectionSetting: TextDirection,\n                 val imageFilterSetting: Boolean,\n                 val instantModeSetting: Boolean,\n                 val showHideSetting: Boolean);\n\n// NOTE: The defValue here should match the defValue of the BroadcastReceivers, otherwise\n// they will be out of sync the first time.\nfun getPrefs(context: Context): Prefs\n{\n    val prefs = context.getSharedPreferences(KAKU_PREF_FILE, Context.MODE_PRIVATE)\n\n    return Prefs(\n            TextDirection.valueOf(prefs.getString(KAKU_PREF_TEXT_DIRECTION, TextDirection.AUTO.toString()).toString()),\n            prefs.getBoolean(KAKU_PREF_IMAGE_FILTER, true),\n            prefs.getBoolean(KAKU_PREF_INSTANT_MODE, true),\n            prefs.getBoolean(KAKU_PREF_SHOW_HIDE, true))\n}\n\nfun toJson(obj: Any): String\n{\n    return gson.toJson(obj)\n}\n\nfun dpToPx(context: Context, dp: Int): Int\n{\n    val displayMetrics = context.resources.displayMetrics\n    return Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT))\n}\n\nfun pxToDp(context: Context, px: Int): Int\n{\n    val displayMetrics = context.resources.displayMetrics\n    return Math.round(px / (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT))\n}\n\n/**\n * Splits `text` into individual unicode characters as a list of strings\n * @param text Text to split\n * @return List of strings with each string representing one unicode character\n */\nfun splitTextByChar(text: String): List<String>\n{\n    val charList = ArrayList<String>()\n\n    val length = text.length\n    var offset = 0\n    while (offset < length)\n    {\n        val curr = text.codePointAt(offset)\n        val charz = String(intArrayOf(curr), 0, 1)\n        charList.add(charz)\n        offset += Character.charCount(curr)\n    }\n\n    return charList\n}\n\nfun startKakuService(context: Context, i: Intent)\n{\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)\n    {\n        context.startForegroundService(i)\n    }\n    else\n    {\n        context.startService(i)\n    }\n}\n\nfun setupKakuDatabasesAndFiles(context: Context)\n{\n    try {\n        val filesAndPaths = hashMapOf(\n                JMDICT_DATABASE_NAME to context.filesDir.absolutePath,\n                TESS_DATA_NAME to \"${context.filesDir.absolutePath}/$TESS_FOLDER_NAME\")\n\n        if (shouldResetData(filesAndPaths))\n        {\n            Log.d(TAG, \"Resetting Data\")\n            for (fileAndPath in filesAndPaths){\n                File(\"${fileAndPath.value}/${fileAndPath.key}\").delete()\n            }\n        }\n\n        copyFilesIfNotExists(context, filesAndPaths)\n\n        var screenshotPath: String = context.filesDir.absolutePath + \"/$SCREENSHOT_FOLDER_NAME\"\n        createDirIfNotExists(screenshotPath)\n        deleteScreenshotsOlderThanOneDay(screenshotPath)\n    }\n    catch (e: Exception)\n    {\n        Toast.makeText(context, \"Unable to setup Kaku database\", Toast.LENGTH_LONG).show()\n        return\n    }\n}\n\nfun shouldResetData(filesAndPaths: Map<String, String>) : Boolean\n{\n    for (fileAndPath in filesAndPaths){\n        if (!File(\"${fileAndPath.value}/${fileAndPath.key}\").exists()) return true\n    }\n    return false\n}\n\nfun createDirIfNotExists(path: String)\n{\n    val dir = File(path)\n    if (!dir.exists())\n    {\n        dir.mkdirs()\n    }\n}\n\nfun copyFilesIfNotExists(context: Context, filesAndPaths: Map<String, String>)\n{\n    for (fileAndPath in filesAndPaths)\n    {\n        val path = fileAndPath.value\n        val fileName = fileAndPath.key\n        val filePath = \"$path/$fileName\"\n\n        if (File(filePath).exists())\n        {\n            return\n        }\n\n        createDirIfNotExists(path)\n\n        val input = context.assets.open(fileName)\n        val output = FileOutputStream(filePath)\n\n        input.copyTo(output);\n        output.close()\n\n        Log.d(TAG, \"Copied $filePath\")\n    }\n}\n\nfun deleteScreenshotsOlderThanOneDay(path: String)\n{\n    try {\n        var dir = File(path)\n        if (dir.exists())\n        {\n            Log.d(TAG, dir.absolutePath)\n            var listFileNames = dir.list()\n            var purgeTime = System.currentTimeMillis() - 1 * 24 * 60 * 60 * 1000\n            for (fileName in listFileNames)\n            {\n                val file = File(fileName)\n                if (file.isFile && file.lastModified() < purgeTime)\n                {\n                    file.delete()\n                }\n            }\n        }\n    }\n    catch (e: Exception)\n    {\n        Log.d(TAG, e.toString())\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/LangUtils.kt",
    "content": "package ca.fuwafuwa.kaku\n\nclass LangUtils {\n\n    companion object {\n\n        private val KanaHalf: IntArray = intArrayOf(\n                0x3092, 0x3041, 0x3043, 0x3045, 0x3047, 0x3049, 0x3083, 0x3085,\n                0x3087, 0x3063, 0x30FC, 0x3042, 0x3044, 0x3046, 0x3048, 0x304A,\n                0x304B, 0x304D, 0x304F, 0x3051, 0x3053, 0x3055, 0x3057, 0x3059,\n                0x305B, 0x305D, 0x305F, 0x3061, 0x3064, 0x3066, 0x3068, 0x306A,\n                0x306B, 0x306C, 0x306D, 0x306E, 0x306F, 0x3072, 0x3075, 0x3078,\n                0x307B, 0x307E, 0x307F, 0x3080, 0x3081, 0x3082, 0x3084, 0x3086,\n                0x3088, 0x3089, 0x308A, 0x308B, 0x308C, 0x308D, 0x308F, 0x3093\n        )\n\n        private val KanaVoiced: IntArray = intArrayOf(\n                0x30F4, 0xFF74, 0xFF75, 0x304C, 0x304E, 0x3050, 0x3052, 0x3054,\n                0x3056, 0x3058, 0x305A, 0x305C, 0x305E, 0x3060, 0x3062, 0x3065,\n                0x3067, 0x3069, 0xFF85, 0xFF86, 0xFF87, 0xFF88, 0xFF89, 0x3070,\n                0x3073, 0x3076, 0x3079, 0x307C\n        )\n\n        private val KanaSemiVoiced: IntArray = intArrayOf(\n                0x3071, 0x3074, 0x3077, 0x307A, 0x307D\n        )\n\n        fun IsHiragana(char: Char) : Boolean\n        {\n            return Character.UnicodeBlock.of(char) == Character.UnicodeBlock.HIRAGANA\n        }\n\n        fun IsKatakana(char: Char) : Boolean\n        {\n            return Character.UnicodeBlock.of(char) == Character.UnicodeBlock.KATAKANA\n        }\n\n        fun IsKanji(char: Char) : Boolean\n        {\n            val block = Character.UnicodeBlock.of(char)\n            return block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS ||\n                   block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A ||\n                   block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B ||\n                   block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C ||\n                   block == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D\n        }\n\n        fun IsJapaneseChar(char: Char) : Boolean\n        {\n            return IsHiragana(char) || IsKatakana(char) || IsKanji(char)\n        }\n\n        fun ConvertKanatanaToHiragana(text: String): String\n        {\n            var result: StringBuilder = StringBuilder()\n            var ordPrev: Int = 0;\n\n            for (i in text){\n\n                var ordCurr: Int = i.code\n\n                // Full-width katakana to hiragana\n                if ((ordCurr >= 0x30A1) && (ordCurr <= 0x30F3))\n                {\n                    ordCurr -= 0x60\n                }\n                // Half-width katakana to hiragana\n                else if ((ordCurr >= 0xFF66) && (ordCurr <= 0xFF9D))\n                {\n                    ordCurr = KanaHalf[ordCurr - 0xFF66]\n                }\n                // Voiced (used in half-width katakana) to hiragana\n                else if (ordCurr == 0xFF9E)\n                {\n                    if (ordPrev >= 0xFF73 && ordPrev <= 0xFF8E)\n                    {\n                        result.setLength(result.length - 1)\n                        ordCurr = KanaVoiced[ordPrev - 0xFF73]\n                    }\n                }\n                // Semi-voiced (used in half-width katakana) to hiragana\n                else if (ordCurr == 0xFF9F)\n                {\n                    if (ordPrev >= 0xFF8A && ordPrev <= 0xFF8E)\n                    {\n                        result.setLength(result.length - 1)\n                        ordCurr = KanaSemiVoiced[ordPrev - 0xFF8A]\n                    }\n                }\n                // Ignore Japanese ~\n                else if (ordCurr == 0xFF5E)\n                {\n                    ordPrev = 0\n                    continue\n                }\n\n                result.append(ordCurr.toChar())\n                ordPrev = ordCurr\n            }\n\n            return result.toString()\n        }\n\n        fun ConvertIntToCircledNum(num: Int): String\n        {\n            var circledNum: String = \"($num)\"\n\n            if (num == 0)\n            {\n                circledNum = \"⓪\"\n            } else if ((num >= 1) && (num <= 20))\n            {\n                circledNum = (('①' - 1) + num).toString()\n            }\n            // Note: Numbers over 20 may depend on font\n            else if ((num >= 21) && (num <= 35))\n            {\n                circledNum = (('㉑' - 21) + num).toString()\n            }\n            else if ((num >= 36) && (num <= 50))\n            {\n                circledNum = (('㊱' - 36) + num).toString()\n            }\n\n            return circledNum\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/MainActivity.kt",
    "content": "package ca.fuwafuwa.kaku\n\nimport android.app.Activity\nimport android.content.Context\nimport android.content.Intent\nimport android.content.SharedPreferences\nimport android.media.projection.MediaProjectionManager\nimport android.net.Uri\nimport android.os.Build\nimport android.os.Bundle\nimport android.os.CountDownTimer\nimport android.provider.Settings\nimport android.util.Log\nimport android.widget.Toast\nimport androidx.appcompat.app.AppCompatActivity\nimport ca.fuwafuwa.kaku.Dialogs.StarRatingDialogFragment\n\n\nclass MainActivity : AppCompatActivity()\n{\n    private var mIsActivityVisible = false\n    private var mShownRating = false\n\n    private lateinit var mPrefs : SharedPreferences\n    private lateinit var mStartKakuIntent: Intent\n\n    override fun onCreate(savedInstanceState: Bundle?)\n    {\n        super.onCreate(savedInstanceState)\n\n        if (isBeta())\n        {\n            startActivity(Intent(this, BetaActivity::class.java))\n        }\n\n        mPrefs = getSharedPreferences(KAKU_PREF_FILE, Context.MODE_PRIVATE)\n\n        if (isFirstLaunch())\n        {\n            startActivity(Intent(this, TutorialActivity::class.java))\n            finish()\n        }\n        else {\n            supportActionBar?.hide()\n            setContentView(R.layout.activity_main)\n\n            setupKakuDatabasesAndFiles(this)\n        }\n    }\n\n    override fun onStart()\n    {\n        super.onStart()\n\n        checkDrawOnTopPermissions()\n        checkScreenRecordPermissions()\n\n        showRatingDialog()\n    }\n\n    override fun onPause()\n    {\n        super.onPause()\n        Log.d(TAG, \"ACTIVITY INVISIBLE\")\n        mIsActivityVisible = false\n    }\n\n    override fun onResume()\n    {\n        super.onResume()\n        Log.d(TAG, \"ACTIVITY VISIBLE\")\n        mIsActivityVisible = true\n    }\n\n    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)\n    {\n        Log.d(TAG, \"onActivityResult\")\n\n        val relaunchAppText = \"Relaunch Kaku after verifying permission\"\n\n        if (requestCode == REQUEST_DRAW_ON_TOP)\n        {\n            Log.d(TAG, \"Recieved ACTION_MANAGE_OVERLAY_PERMISSION Intent\")\n\n            if (resultCode != Activity.RESULT_OK)\n            {\n                Toast.makeText(this, \"Check Permission: Draw on Other Apps\\n$relaunchAppText\", Toast.LENGTH_LONG).show()\n                finish()\n            }\n\n            return\n        }\n\n        if (requestCode == REQUEST_SCREENSHOT)\n        {\n            Log.d(TAG, \"Recieved REQUEST_SCREENSHOT Intent\")\n\n            if (resultCode != Activity.RESULT_OK)\n            {\n                Toast.makeText(this, \"Check Permission: Record Screen\\n$relaunchAppText\", Toast.LENGTH_LONG).show()\n                finish()\n            }\n\n            mStartKakuIntent = Intent(this, MainService::class.java)\n                    .putExtra(EXTRA_PROJECTION_RESULT_CODE, resultCode)\n                    .putExtra(EXTRA_PROJECTION_RESULT_INTENT, data)\n            return\n        }\n    }\n\n    fun startKaku(startFragment: MainStartFragment)\n    {\n        if (MainService.IsRunning())\n        {\n            return\n        }\n\n        if (!mIsActivityVisible)\n        {\n            return\n        }\n\n        if (::mStartKakuIntent.isInitialized)\n        {\n            startFragment.onKakuLoadStart()\n\n            val totalDuration = 2000\n            object : CountDownTimer(totalDuration.toLong(), 10)\n            {\n                override fun onFinish()\n                {\n                    startFragment.onKakuLoaded()\n                    startKakuService(this@MainActivity, mStartKakuIntent)\n                }\n\n                override fun onTick(millisUntilFinished: Long)\n                {\n                }\n            }.start()\n        }\n        else {\n            Toast.makeText(this, \"Unable to start Kaku service\", Toast.LENGTH_LONG).show()\n        }\n    }\n\n    private fun checkDrawOnTopPermissions()\n    {\n        var checkPermissions = \"Check \\\"Draw on Top of Other Apps\\\" permission\"\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)\n        {\n            if (!Settings.canDrawOverlays(this))\n            {\n                Log.d(TAG, \"Sending ACTION_MANAGE_OVERLAY_PERMISSION Intent\")\n                startActivityForResult(Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse(\"package:$packageName\")), REQUEST_DRAW_ON_TOP)\n            }\n        }\n        else\n        {\n            Toast.makeText(this, \"Manually $checkPermissions\\nKaku might not work on this device\", Toast.LENGTH_LONG).show()\n        }\n    }\n\n    private fun checkScreenRecordPermissions()\n    {\n        Log.d(TAG, \"Sending REQUEST_SCREENSHOT Intent\")\n        val mediaProjectionManager: MediaProjectionManager? = getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager\n        startActivityForResult(mediaProjectionManager!!.createScreenCaptureIntent(), REQUEST_SCREENSHOT)\n    }\n\n    private fun showRatingDialog()\n    {\n        if (mShownRating)\n        {\n            return\n        }\n\n        mShownRating = true\n\n        val timesLaunched = mPrefs.getInt(KAKU_PREF_TIMES_LAUNCHED, 1)\n        val rated = mPrefs.getBoolean(KAKU_PREF_PLAY_STORE_RATED, false)\n\n        if (timesLaunched % 20 == 0 && !rated)\n        {\n            StarRatingDialogFragment().show(supportFragmentManager, \"StarRating\")\n        }\n    }\n\n    private fun isFirstLaunch() : Boolean\n    {\n        return mPrefs.getBoolean(KAKU_PREF_FIRST_LAUNCH, true)\n    }\n\n    private fun isBeta() : Boolean\n    {\n        val CURRENT_PROD_VERSION = 73 // just hardcoded, change when a build is ready to be rolled out to prod\n        return BuildConfig.VERSION_CODE > CURRENT_PROD_VERSION\n    }\n\n    companion object\n    {\n        private val TAG = MainActivity::class.java.name\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/MainService.java",
    "content": "package ca.fuwafuwa.kaku;\n\nimport android.app.Notification;\nimport android.app.NotificationChannel;\nimport android.app.NotificationManager;\nimport android.app.PendingIntent;\nimport android.app.Service;\nimport android.content.BroadcastReceiver;\nimport android.content.Context;\nimport android.content.Intent;\nimport android.content.IntentFilter;\nimport android.content.SharedPreferences;\nimport android.content.res.Configuration;\nimport android.graphics.PixelFormat;\nimport android.graphics.Point;\nimport android.hardware.display.DisplayManager;\nimport android.hardware.display.VirtualDisplay;\nimport android.media.Image;\nimport android.media.ImageReader;\nimport android.media.projection.MediaProjection;\nimport android.media.projection.MediaProjectionManager;\nimport android.os.Build;\nimport android.os.Handler;\nimport android.os.IBinder;\nimport androidx.annotation.RequiresApi;\nimport androidx.core.app.NotificationCompat;\nimport android.util.DisplayMetrics;\nimport android.util.Log;\nimport android.view.Display;\nimport android.view.WindowManager;\nimport android.widget.Toast;\n\nimport ca.fuwafuwa.kaku.Interfaces.Stoppable;\nimport ca.fuwafuwa.kaku.Windows.Window;\nimport ca.fuwafuwa.kaku.Windows.WindowCoordinator;\n\nimport static androidx.core.app.NotificationCompat.FLAG_FOREGROUND_SERVICE;\nimport static androidx.core.app.NotificationCompat.FLAG_ONGOING_EVENT;\n\n/**\n * Created by 0xbad1d3a5 on 4/9/2016.\n */\npublic class MainService extends Service implements Stoppable {\n\n    private static final String TAG = MainService.class.getName();\n\n    public static class CloseMainService extends BroadcastReceiver\n    {\n        @Override\n        public void onReceive(Context context, Intent intent) {\n            Log.d(TAG, \"GOT CLOSE\");\n            context.stopService(new Intent(context, MainService.class));\n        }\n    }\n\n    public static class ToggleImagePreviewMainService extends BroadcastReceiver\n    {\n        @Override\n        public void onReceive(Context context, Intent intent)\n        {\n            SharedPreferences prefs = context.getSharedPreferences(Constants.KAKU_PREF_FILE, Context.MODE_PRIVATE);\n            boolean imagePreview = prefs.getBoolean(Constants.KAKU_PREF_IMAGE_FILTER, true);\n            prefs.edit().putBoolean(Constants.KAKU_PREF_IMAGE_FILTER, !imagePreview).apply();\n\n            KakuTools.startKakuService(context, new Intent(context, MainService.class));\n        }\n    }\n\n    public static class ToggleShowHideMainService extends BroadcastReceiver\n    {\n        @Override\n        public void onReceive(Context context, Intent intent)\n        {\n            SharedPreferences prefs = context.getSharedPreferences(Constants.KAKU_PREF_FILE, Context.MODE_PRIVATE);\n            boolean shown = prefs.getBoolean(Constants.KAKU_PREF_SHOW_HIDE, true);\n            prefs.edit().putBoolean(Constants.KAKU_PREF_SHOW_HIDE, !shown).apply();\n\n            KakuTools.startKakuService(context, new Intent(context, MainService.class));\n        }\n    }\n\n    public static class TogglePageModeMainService extends BroadcastReceiver\n    {\n        @Override\n        public void onReceive(Context context, Intent intent)\n        {\n            SharedPreferences prefs = context.getSharedPreferences(Constants.KAKU_PREF_FILE, Context.MODE_PRIVATE);\n            TextDirection textDirection = TextDirection.valueOf(prefs.getString(Constants.KAKU_PREF_TEXT_DIRECTION, TextDirection.AUTO.toString()));\n            textDirection = TextDirection.Companion.getByValue((textDirection.ordinal() + 1) % 3);\n            prefs.edit().putString(Constants.KAKU_PREF_TEXT_DIRECTION, textDirection.toString()).apply();\n\n            KakuTools.startKakuService(context, new Intent(context, MainService.class));\n        }\n    }\n\n    public static class ToggleInstantModeMainService extends BroadcastReceiver\n    {\n        @Override\n        public void onReceive(Context context, Intent intent)\n        {\n            SharedPreferences prefs = context.getSharedPreferences(Constants.KAKU_PREF_FILE, Context.MODE_PRIVATE);\n            boolean pageMode = prefs.getBoolean(Constants.KAKU_PREF_INSTANT_MODE, true);\n            prefs.edit().putBoolean(Constants.KAKU_PREF_INSTANT_MODE, !pageMode).apply();\n\n            KakuTools.startKakuService(context, new Intent(context, MainService.class));\n        }\n    }\n\n    public static class ScreenOffReceiver extends BroadcastReceiver\n    {\n        @Override\n        public void onReceive(Context context, Intent intent)\n        {\n            SharedPreferences prefs = context.getSharedPreferences(Constants.KAKU_PREF_FILE, Context.MODE_PRIVATE);\n            prefs.edit().putBoolean(Constants.KAKU_PREF_SHOW_HIDE, false).apply();\n\n            KakuTools.startKakuService(context, new Intent(context, MainService.class));\n        }\n    }\n\n    private class MediaProjectionStopCallback extends MediaProjection.Callback{\n        @Override\n        public void onStop(){\n            Log.d(TAG, \"Stopping projection\");\n            mHandler.post(new Runnable() {\n                @Override\n                public void run() {\n                    if (MediaProjectionStopCallback.this == mMediaProjectionStopCallback){\n                        if (mVirtualDisplay != null){\n                            mVirtualDisplay.release();\n                        }\n                        mMediaProjection.unregisterCallback(MediaProjectionStopCallback.this);\n                        mMediaProjection = null;\n                        mImageReader.close();\n                    }\n                }\n            });\n        }\n    }\n\n    private static boolean isKakuRunning = false;\n\n    private static final int VIRTUAL_DISPLAY_FLAGS = DisplayManager.VIRTUAL_DISPLAY_FLAG_OWN_CONTENT_ONLY | DisplayManager.VIRTUAL_DISPLAY_FLAG_PUBLIC;\n    private static final int NOTIFICATION_ID = 1;\n\n    private IntentFilter mIntentFilter = new IntentFilter(Intent.ACTION_SCREEN_OFF);\n    private ScreenOffReceiver mScreenOffReceiver = new ScreenOffReceiver();\n\n    private Intent mProjectionResultIntent;\n    private int mProjectionResultCode;\n\n    private WindowManager mWindowManager;\n    private MediaProjectionManager mMediaProjectionManager;\n    private MediaProjection mMediaProjection;\n    private ImageReader mImageReader;\n    private Display mDisplay;\n    private VirtualDisplay mVirtualDisplay;\n    private MainServiceHandler mHandler;\n\n    private int mRotation;\n    private Point mRealDisplaySize = new Point();\n\n    private MediaProjectionStopCallback mMediaProjectionStopCallback;\n    private WindowCoordinator mWindowCoordinator = new WindowCoordinator(this);\n\n    @Override\n    public IBinder onBind(Intent intent)\n    {\n        // Not used\n        return null;\n    }\n\n    @Override\n    public void onCreate()\n    {\n        super.onCreate();\n\n        if (!isKakuRunning)\n        {\n            SharedPreferences prefs = getSharedPreferences(Constants.KAKU_PREF_FILE, Context.MODE_PRIVATE);\n            prefs.edit().putBoolean(Constants.KAKU_PREF_SHOW_HIDE, true).apply();\n        }\n\n        Log.d(TAG, \"CREATING MAINSERVICE: \" + System.identityHashCode(this));\n        Toast.makeText(this, \"Starting capture window...\", Toast.LENGTH_LONG).show();\n\n        mMediaProjectionManager = (MediaProjectionManager) getSystemService(MEDIA_PROJECTION_SERVICE);\n        mHandler = new MainServiceHandler(this, mWindowCoordinator);\n\n        // Set preferences for ratings\n        SharedPreferences prefs = getSharedPreferences(Constants.KAKU_PREF_FILE, Context.MODE_PRIVATE);\n        int timesLaunched = prefs.getInt(Constants.KAKU_PREF_TIMES_LAUNCHED, 1);\n        prefs.edit().putInt(Constants.KAKU_PREF_TIMES_LAUNCHED, timesLaunched + 1).apply();\n\n        registerReceiver(mScreenOffReceiver, mIntentFilter);\n\n        startForeground(NOTIFICATION_ID, getNotification());\n        isKakuRunning = true;\n    }\n\n    @Override\n    public int onStartCommand(Intent intent, int flags, int startId)\n    {\n        Log.d(TAG, \"onStartCommand\");\n\n        if (intent.getExtras() != null &&\n            intent.getExtras().containsKey(Constants.EXTRA_PROJECTION_RESULT_CODE) &&\n            intent.getExtras().containsKey(Constants.EXTRA_PROJECTION_RESULT_INTENT))\n        {\n            mProjectionResultIntent = (Intent) intent.getExtras().get(Constants.EXTRA_PROJECTION_RESULT_INTENT);\n            mProjectionResultCode = intent.getExtras().getInt(Constants.EXTRA_PROJECTION_RESULT_CODE);\n        }\n\n        // Determine if we need to start/stop the capture service\n        SharedPreferences prefs = getSharedPreferences(Constants.KAKU_PREF_FILE, Context.MODE_PRIVATE);\n        Boolean shown = prefs.getBoolean(Constants.KAKU_PREF_SHOW_HIDE, true);\n        if (shown)\n        {\n            // Re-init CaptureWindow as well as prefs may have changed (BroadcastReceiver go to onStartCommand())\n            mWindowCoordinator.getWindow(Constants.WINDOW_CAPTURE).reInit(new Window.ReinitOptions());\n        }\n        else\n        {\n            mWindowCoordinator.stopAllWindows();\n            stop();\n        }\n\n        // Set notification text\n        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);\n        notificationManager.notify(NOTIFICATION_ID, getNotification());\n\n        return START_NOT_STICKY;\n    }\n\n    @Override\n    public void onConfigurationChanged(Configuration newConfig)\n    {\n        super.onConfigurationChanged(newConfig);\n\n        if (mWindowCoordinator.hasWindow(Constants.WINDOW_CAPTURE))\n        {\n            final int rotation = mDisplay.getRotation();\n\n            if (rotation != mRotation)\n            {\n                Log.d(TAG, \"Orientation changed\");\n                mRotation = rotation;\n                createVirtualDisplay();\n                mWindowCoordinator.reinitAllWindows();\n            }\n        }\n    }\n\n    @Override\n    public void onDestroy()\n    {\n        unregisterReceiver(mScreenOffReceiver);\n        stopForeground(true);\n        Log.d(TAG, \"DESTORYING MAINSERVICE: \" + System.identityHashCode(this));\n\n        stop();\n        mWindowCoordinator.stopAllWindows();\n        mWindowCoordinator = null;\n        isKakuRunning = false;\n\n        Log.d(TAG, String.format(\"MAINSERVICE: %s DESTROYED\", System.identityHashCode(this)));\n        super.onDestroy();\n    }\n\n    @Override\n    public void stop()\n    {\n        if (mMediaProjection != null)\n        {\n            mMediaProjection.stop();\n        }\n    }\n\n    public static boolean IsRunning()\n    {\n        return isKakuRunning;\n    }\n\n    /**\n     * This function is here as a bug fix against {@link #onConfigurationChanged(Configuration)} not\n     * triggering when the app is first started and immediately switches to another orientation. In\n     * such a case onConfigurationChanged will not trigger and {@link Window#reInit(ca.fuwafuwa.kaku.Windows.Window.ReinitOptions)} will not\n     * update the LayoutParams.\n     */\n    public void onCaptureWindowFinishedInitializing()\n    {\n        if (mMediaProjection == null){\n            Log.d(TAG, \"mMediaProjection is null\");\n            mMediaProjection = mMediaProjectionManager.getMediaProjection(mProjectionResultCode, mProjectionResultIntent);\n            mMediaProjectionStopCallback = new MediaProjectionStopCallback();\n            mMediaProjection.registerCallback(mMediaProjectionStopCallback, mHandler);\n        }\n        createVirtualDisplay();\n    }\n\n    public Handler getHandler()\n    {\n        return mHandler;\n    }\n\n    public Image getScreenshot() throws InterruptedException\n    {\n        long startTime = System.nanoTime();\n        Image image = mImageReader.acquireLatestImage();\n        while (image == null && System.nanoTime() < startTime + 2000000000){\n            Thread.sleep(20);\n            image = mImageReader.acquireLatestImage();\n        }\n        return image;\n    }\n\n    private Notification getNotification()\n    {\n        String channelId;\n        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){\n            channelId = createNotificationChannel();\n        }\n        else {\n            channelId = \"\";\n        }\n\n        PendingIntent toggleShowHide = PendingIntent.getBroadcast(this, Constants.REQUEST_SERVICE_TOGGLE_SHOW_HIDE, new Intent(this, ToggleShowHideMainService.class), PendingIntent.FLAG_IMMUTABLE);\n        PendingIntent toggleImagePreview = PendingIntent.getBroadcast(this, Constants.REQUEST_SERVICE_TOGGLE_IMAGE_PREVIEW, new Intent(this, ToggleImagePreviewMainService.class), PendingIntent.FLAG_IMMUTABLE);\n        PendingIntent togglePageMode = PendingIntent.getBroadcast(this, Constants.REQUEST_SERVICE_TOGGLE_PAGE_MODE, new Intent(this, TogglePageModeMainService.class), PendingIntent.FLAG_IMMUTABLE);\n        PendingIntent toggleInstantMode = PendingIntent.getBroadcast(this, Constants.REQUEST_SERVICE_TOGGLE_INSTANT_MODE, new Intent(this, ToggleInstantModeMainService.class), PendingIntent.FLAG_IMMUTABLE);\n        PendingIntent closeMainService = PendingIntent.getBroadcast(this, Constants.REQUEST_SERVICE_SHUTDOWN, new Intent(this, CloseMainService.class), PendingIntent.FLAG_IMMUTABLE);\n\n        Prefs prefs = KakuTools.getPrefs(this);\n\n        String contentTitle = \"Kaku\";\n        switch (prefs.getTextDirectionSetting())\n        {\n            case AUTO:\n                contentTitle = \"Kaku is determining text direction automatically\";\n                break;\n            case VERTICAL:\n                contentTitle = \"Kaku is reading text vertically\";\n                break;\n            case HORIZONTAL:\n                contentTitle = \"Kaku is reading text horizontally\";\n                break;\n        }\n\n        Notification n;\n        if (prefs.getShowHideSetting())\n        {\n            n = new NotificationCompat.Builder(this, channelId)\n                    .setSmallIcon(R.drawable.kaku_notification_icon)\n                    .setContentTitle(contentTitle)\n                    .setContentText(String.format(\"Instant mode %s, black and white filter %s\", prefs.getInstantModeSetting() ? \"on\" : \"off\", prefs.getImageFilterSetting() ? \"on\" : \"off\"))\n                    .setContentIntent(toggleShowHide)\n                    .addAction(0, \"Instant Mode\", toggleInstantMode)\n                    .addAction(0, \"Image Filter\", toggleImagePreview)\n                    .addAction(0, \"Shutdown\", closeMainService)\n                    .build();\n        }\n        else {\n            n = new NotificationCompat.Builder(this, channelId)\n                    .setSmallIcon(R.drawable.kaku_notification_icon)\n                    .setContentTitle(\"Kaku is hidden and in power-saving mode\")\n                    .setContentIntent(toggleShowHide)\n                    .build();\n        }\n\n        n.flags = FLAG_ONGOING_EVENT | FLAG_FOREGROUND_SERVICE;\n\n        return n;\n    }\n\n    private void createVirtualDisplay()\n    {\n        // display metrics\n        mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);\n        DisplayMetrics metrics = getResources().getDisplayMetrics();\n        int mDensity = metrics.densityDpi;\n        mDisplay = mWindowManager.getDefaultDisplay();\n\n        // get width and height\n        mDisplay.getRealSize(mRealDisplaySize);\n\n        // start capture reader\n        Log.d(TAG, String.format(\"Starting Projection: %dx%d\", mRealDisplaySize.x, mRealDisplaySize.y));\n        if (mVirtualDisplay != null){\n            mVirtualDisplay.release();\n        }\n        mImageReader = ImageReader.newInstance(mRealDisplaySize.x, mRealDisplaySize.y, PixelFormat.RGBA_8888, 2); // TODO: Something causing a NRE here\n        mVirtualDisplay = mMediaProjection.createVirtualDisplay(getClass().getName(), mRealDisplaySize.x, mRealDisplaySize.y, mDensity, VIRTUAL_DISPLAY_FLAGS, mImageReader.getSurface(), null, mHandler);\n    }\n\n    @RequiresApi(Build.VERSION_CODES.O)\n    private String createNotificationChannel()\n    {\n        String channelId = Constants.KAKU_CHANNEL_ID;\n        String channelName = Constants.KAKU_CHANNEL_NAME;\n\n        NotificationChannel channel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_LOW);\n        NotificationManager service = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);\n        service.createNotificationChannel(channel);\n\n        return channelId;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/MainServiceHandler.java",
    "content": "package ca.fuwafuwa.kaku;\n\nimport android.os.Handler;\nimport android.os.Message;\nimport android.util.Log;\nimport android.widget.Toast;\n\nimport ca.fuwafuwa.kaku.Ocr.OcrResult;\nimport ca.fuwafuwa.kaku.Windows.InformationWindow;\nimport ca.fuwafuwa.kaku.Windows.InstantKanjiWindow;\nimport ca.fuwafuwa.kaku.Windows.WindowCoordinator;\n\n/**\n * Created by 0xbad1d3a5 on 4/15/2016.\n */\npublic class MainServiceHandler extends Handler {\n\n    private static final String TAG = MainServiceHandler.class.getName();\n\n    private MainService mKakuService;\n    private WindowCoordinator mWindowCoordinator;\n\n    public MainServiceHandler(MainService mainService, WindowCoordinator windowCoordinator)\n    {\n        mKakuService = mainService;\n        mWindowCoordinator = windowCoordinator;\n    }\n\n    @Override\n    public void handleMessage(Message message)\n    {\n        if (message.obj instanceof String){\n            Toast.makeText(mKakuService, message.obj.toString(), Toast.LENGTH_SHORT).show();\n        }\n        else if (message.obj instanceof OcrResult)\n        {\n            OcrResult result = (OcrResult) message.obj;\n\n            Log.d(TAG, result.toString());\n\n            if (result.getDisplayData().getInstantMode())\n            {\n                InstantKanjiWindow instantKanjiWindow = mWindowCoordinator.getWindowOfType(Constants.WINDOW_INSTANT_KANJI);\n                instantKanjiWindow.setResult(result.getDisplayData());\n                instantKanjiWindow.show();\n            }\n            else {\n                InformationWindow infoWindow = mWindowCoordinator.getWindowOfType(Constants.WINDOW_INFO);\n                infoWindow.setResult(result.getDisplayData());\n                infoWindow.show();\n            }\n        }\n        else {\n            Toast.makeText(mKakuService, String.format(\"Unable to handle type: %s\", message.obj.getClass().getName()), Toast.LENGTH_SHORT).show();\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/MainStartFragment.kt",
    "content": "package ca.fuwafuwa.kaku\n\nimport android.content.Context\nimport android.content.Intent\nimport android.graphics.BitmapFactory\nimport android.net.ConnectivityManager\nimport android.net.NetworkInfo\nimport android.net.Uri\nimport android.os.Bundle\nimport android.text.SpannableStringBuilder\nimport android.text.Spanned\nimport android.text.TextPaint\nimport android.text.method.LinkMovementMethod\nimport android.text.style.ClickableSpan\nimport android.util.TypedValue\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.ImageView\nimport android.widget.ProgressBar\nimport android.widget.TextView\nimport androidx.core.content.ContextCompat\nimport androidx.fragment.app.Fragment\nimport com.google.android.gms.ads.*\nimport java.util.*\n\n\ndata class ImgData(val res: Int, val name: String, val nameLink: String, val imgLink: String, val hasImg: Boolean = true)\n\nclass MainStartFragment : Fragment()\n{\n    private lateinit var mainActivity : MainActivity\n    private lateinit var rootView : View\n\n    private lateinit var kakuLogo : TextView\n    private lateinit var kakuTitle : TextView\n    private lateinit var tutorialText : TextView\n    private lateinit var githubText : TextView\n\n    private lateinit var supportText : TextView\n    private lateinit var progressBar : ProgressBar\n\n    private lateinit var promoView : ViewGroup\n    private lateinit var adView : AdView\n    private lateinit var saeView : ImageView\n\n    private lateinit var imgData : ImgData\n\n    private var showAds = false\n\n    override fun onCreate(savedInstanceState: Bundle?)\n    {\n        super.onCreate(savedInstanceState)\n\n        // Switch off deprecated network API\n        val cm = requireActivity().getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager\n        val activeNetwork: NetworkInfo? = cm.activeNetworkInfo\n\n        val adsEnabled = false\n        val internetEnabled = activeNetwork?.isConnectedOrConnecting == true\n\n        showAds = adsEnabled && internetEnabled\n        if (showAds)\n        {\n            MobileAds.initialize(requireActivity())\n        }\n    }\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,\n                              savedInstanceState: Bundle?): View?\n    {\n        mainActivity = activity as MainActivity\n\n        rootView = inflater.inflate(R.layout.fragment_start, container, false)\n\n        kakuLogo = rootView.findViewById(R.id.kaku_logo)\n        kakuTitle = rootView.findViewById(R.id.kaku_title)\n        tutorialText = rootView.findViewById(R.id.kaku_tutorial)\n        githubText = rootView.findViewById(R.id.kaku_github)\n\n        supportText = rootView.findViewById(R.id.support_text)\n        progressBar = rootView.findViewById(R.id.progress_bar)\n\n        promoView = rootView.findViewById(R.id.promoView)\n        adView = rootView.findViewById(R.id.adView)\n        saeView = rootView.findViewById(R.id.saeView)\n\n        configureBottomPromo(showAds)\n\n        tutorialText.setOnClickListener {\n            startActivity(Intent(mainActivity, TutorialActivity::class.java))\n        }\n\n        githubText.setOnClickListener {\n            val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(\"https://github.com/0xbad1d3a5/Kaku\"))\n            startActivity(browserIntent)\n        }\n\n        return rootView\n    }\n\n    override fun onStart()\n    {\n        super.onStart()\n\n        supportText.viewTreeObserver.addOnGlobalLayoutListener {\n            var pos = IntArray(2)\n            supportText.getLocationInWindow(pos)\n            val drawableHeight = rootView.height - pos[1] - dpToPx(mainActivity, 30)\n\n            val logoSize = drawableHeight.toFloat() / 2\n            val titleSize = logoSize / 5\n            val textSize = titleSize / 2\n\n            kakuLogo.setTextSize(TypedValue.COMPLEX_UNIT_PX, logoSize)\n            kakuTitle.setTextSize(TypedValue.COMPLEX_UNIT_PX, titleSize)\n            tutorialText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)\n            supportText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)\n        }\n    }\n\n    override fun onResume()\n    {\n        super.onResume()\n\n        if (showAds)\n        {\n            val adRequest = AdRequest.Builder().build()\n            adView.loadAd(adRequest)\n        }\n\n        if (!MainService.IsRunning())\n        {\n            onKakuLoadStart()\n        }\n\n        Timer().schedule(object : TimerTask()\n        {\n            override fun run()\n            {\n                mainActivity.runOnUiThread {\n                    mainActivity.startKaku(this@MainStartFragment)\n                }\n            }\n        }, 3000)\n    }\n\n    fun onKakuLoadStart()\n    {\n        progressBar.isIndeterminate = true\n        progressBar.progress = 0\n        supportText.text = getString(R.string.kaku_loading)\n    }\n\n    fun onKakuLoaded()\n    {\n        progressBar.isIndeterminate = false\n        progressBar.progress = 100\n        writeSupportText()\n    }\n\n    private fun configureBottomPromo(adsEnabled: Boolean)\n    {\n        if (adsEnabled)\n        {\n            promoView.removeView(saeView)\n            setupAds()\n        }\n        else\n        {\n            promoView.removeView(adView)\n            setupImage()\n        }\n\n        if (MainService.IsRunning())\n        {\n            onKakuLoaded()\n        }\n    }\n\n    private fun setupAds()\n    {\n        adView.adListener = object: AdListener()\n        {\n            override fun onAdLoaded()\n            {\n                super.onAdLoaded()\n                mainActivity.startKaku(this@MainStartFragment)\n            }\n\n            override fun onAdFailedToLoad(p0: LoadAdError) {\n                super.onAdFailedToLoad(p0)\n                mainActivity.startKaku(this@MainStartFragment)\n            }\n        }\n    }\n\n    private fun setupImage()\n    {\n        imgData = getImageResources()\n\n        if (imgData.hasImg)\n        {\n            saeView.setImageBitmap(BitmapFactory.decodeStream(resources.openRawResource(imgData.res)))\n            saeView.setOnClickListener {\n                val i = Intent(Intent.ACTION_VIEW)\n                i.data = Uri.parse(imgData.imgLink)\n                startActivity(i)\n            }\n        }\n    }\n\n    private fun getImageResources(): ImgData\n    {\n        val imgs = listOf(\n                ImgData(R.raw.sae0001, \"@ultonesan\", \"https://twitter.com/ultonesan\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62885659\"),\n                ImgData(R.raw.sae0002, \"@ultonesan\", \"https://twitter.com/ultonesan\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=68641857\"),\n                ImgData(R.raw.sae0003, \"@ultonesan\", \"https://twitter.com/ultonesan\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=71950613\"),\n                ImgData(R.raw.sae0021, \"@ultonesan\", \"https://twitter.com/ultonesan\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=73297155\"),\n                ImgData(R.raw.sae0044, \"@ultonesan\", \"https://twitter.com/ultonesan\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60987977\"),\n                ImgData(R.raw.sae0004, \"@yamoyamo18\", \"https://twitter.com/yamoyamo18\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=73628894\"),\n                ImgData(R.raw.sae0005, \"@yamoyamo18\", \"https://twitter.com/yamoyamo18\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72424727\"),\n                ImgData(R.raw.sae0009, \"@yamoyamo18\", \"https://twitter.com/yamoyamo18\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72008999\"),\n                ImgData(R.raw.sae0016, \"@yamoyamo18\", \"https://twitter.com/yamoyamo18\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=66871255\"),\n                ImgData(R.raw.sae0022, \"@yamoyamo18\", \"https://twitter.com/yamoyamo18\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72822939\"),\n                ImgData(R.raw.sae0023, \"@yamoyamo18\", \"https://twitter.com/yamoyamo18\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=71623460\"),\n                ImgData(R.raw.sae0024, \"@yamoyamo18\", \"https://twitter.com/yamoyamo18\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=71994817\"),\n                ImgData(R.raw.sae0025, \"@yamoyamo18\", \"https://twitter.com/yamoyamo18\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=73311041\"),\n                ImgData(R.raw.sae0026, \"@yamoyamo18\", \"https://twitter.com/yamoyamo18\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=73166793\"),\n                ImgData(R.raw.sae0027, \"@yamoyamo18\", \"https://twitter.com/yamoyamo18\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=73056502\"),\n                ImgData(R.raw.sae0028, \"@yamoyamo18\", \"https://twitter.com/yamoyamo18\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=71894148\"),\n                ImgData(R.raw.sae0029, \"@yamoyamo18\", \"https://twitter.com/yamoyamo18\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=71741734\"),\n                ImgData(R.raw.sae0030, \"@yamoyamo18\", \"https://twitter.com/yamoyamo18\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=71550295\"),\n                ImgData(R.raw.sae0006, \"@Sutoroa_\", \"https://twitter.com/Sutoroa_\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72284325\"),\n                ImgData(R.raw.sae0098, \"@Sutoroa_\", \"https://twitter.com/Sutoroa_\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=73191911\"),\n                ImgData(R.raw.sae0007, \"栗羊\", \"https://www.pixiv.net/member.php?id=7231087\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=70943811\"),\n                ImgData(R.raw.sae0008, \"fevri\", \"https://www.pixiv.net/member.php?id=23625153\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=71230492\"),\n                ImgData(R.raw.sae0010, \"@ultimate_force6\", \"https://twitter.com/ultimate_force6\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=68200934\"),\n                ImgData(R.raw.sae0019, \"@ultimate_force6\", \"https://twitter.com/ultimate_force6\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65491060\"),\n                ImgData(R.raw.sae0020, \"@ultimate_force6\", \"https://twitter.com/ultimate_force6\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=71977064\"),\n                ImgData(R.raw.sae0057, \"@ultimate_force6\", \"https://twitter.com/ultimate_force6\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=74363079\"),\n                ImgData(R.raw.sae0011, \"@RomanticGACHA\", \"https://twitter.com/RomanticGACHA\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=71885557\"),\n                ImgData(R.raw.sae0013, \"ちゅんこ\", \"https://www.pixiv.net/member.php?id=15933874\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=70193706\"),\n                ImgData(R.raw.sae0014, \"ちゅんこ\", \"https://www.pixiv.net/member.php?id=15933874\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=69105225\"),\n                ImgData(R.raw.sae0015, \"ちゅんこ\", \"https://www.pixiv.net/member.php?id=15933874\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=64939768\"),\n                ImgData(R.raw.sae0065, \"ちゅんこ\", \"https://www.pixiv.net/member.php?id=15933874\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=57615504\"),\n                ImgData(R.raw.sae0066, \"ちゅんこ\", \"https://www.pixiv.net/member.php?id=15933874\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=57126244\"),\n                ImgData(R.raw.sae0067, \"ちゅんこ\", \"https://www.pixiv.net/member.php?id=15933874\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=57126244\"),\n                ImgData(R.raw.sae0068, \"ちゅんこ\", \"https://www.pixiv.net/member.php?id=15933874\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62991879\"),\n                ImgData(R.raw.sae0075, \"ちゅんこ\", \"https://www.pixiv.net/member.php?id=15933874\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59695678\"),\n                ImgData(R.raw.sae0076, \"ちゅんこ\", \"https://www.pixiv.net/member.php?id=15933874\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59695678\"),\n                ImgData(R.raw.sae0096, \"ちゅんこ\", \"https://www.pixiv.net/member.php?id=15933874\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=73671294\"),\n                ImgData(R.raw.sae0097, \"ちゅんこ\", \"https://www.pixiv.net/member.php?id=15933874\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=73262536\"),\n                ImgData(R.raw.sae0103, \"ちゅんこ\", \"https://www.pixiv.net/member.php?id=15933874\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59882410\"),\n                ImgData(R.raw.sae0017, \"@kusanosinta\", \"https://twitter.com/kusanosinta\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=66630846\"),\n                ImgData(R.raw.sae0018, \"@jksh5056\", \"https://twitter.com/jksh5056\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=66503611\"),\n                ImgData(R.raw.sae0012, \"@syounenkross\", \"https://twitter.com/syounenkross\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=64177621\"),\n                ImgData(R.raw.sae0031, \"@Nb_mk2\", \"https://twitter.com/Nb_mk2\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63674704\"),\n                ImgData(R.raw.sae0032, \"@Hachita888\", \"https://twitter.com/Hachita888\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=68277697\"),\n                ImgData(R.raw.sae0033, \"@Hachita888\", \"https://twitter.com/Hachita888\", \"https://twitter.com/Hachita888/status/1101056129159749632\"),\n                ImgData(R.raw.sae0034, \"Toffee\", \"https://www.pixiv.net/member.php?id=13274275\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62893744\"),\n                ImgData(R.raw.sae0035, \"@N1__03\", \"https://twitter.com/N1__03\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63248104\"),\n                ImgData(R.raw.sae0036, \"@yu_hi0420\", \"https://twitter.com/yu_hi0420\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60998374\"),\n                ImgData(R.raw.sae0037, \"@nike_abc\", \"https://twitter.com/nike_abc\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63199962\"),\n                ImgData(R.raw.sae0038, \"iwawo\", \"https://www.pixiv.net/member.php?id=1926865\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62945449\"),\n                ImgData(R.raw.sae0039, \"tamamooon\", \"https://www.pixiv.net/member.php?id=3796056\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62176436\"),\n                ImgData(R.raw.sae0040, \"Ametama\", \"https://www.pixiv.net/member.php?id=10122880\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61738328\"),\n                ImgData(R.raw.sae0041, \"@2cFirefly\", \"https://twitter.com/2cFirefly\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61109132\"),\n                ImgData(R.raw.sae0042, \"LP\", \"https://www.pixiv.net/member.php?id=9774145\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60911262\"),\n                ImgData(R.raw.sae0043, \"@haikimono\", \"https://twitter.com/haikimono\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60871513\"),\n                ImgData(R.raw.sae0045, \"@xx__lotus\", \"https://twitter.com/xx__lotus\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60860221\"),\n                ImgData(R.raw.sae0046, \"@kamonabe_44\", \"https://twitter.com/kamonabe_44\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60254903\"),\n                ImgData(R.raw.sae0047, \"@Yunagi_Amane\", \"https://twitter.com/Yunagi_Amane\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60128230\"),\n                ImgData(R.raw.sae0048, \"@Azmo_dan\", \"https://twitter.com/Azmo_dan\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59980990\"),\n                ImgData(R.raw.sae0049, \"@takeashiro\", \"https://twitter.com/takeashiro\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59770209\"),\n                ImgData(R.raw.sae0050, \"@watanseru\", \"https://twitter.com/watanseru\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59521673\"),\n                ImgData(R.raw.sae0051, \"@gin_no_te\", \"https://twitter.com/gin_no_te\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59907147\"),\n                ImgData(R.raw.sae0052, \"miazi\", \"https://www.pixiv.net/member.php?id=2551745\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59536025\"),\n                ImgData(R.raw.sae0053, \"ちゅんこ\", \"https://www.pixiv.net/member.php?id=15933874\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59420528\"),\n                ImgData(R.raw.sae0054, \"@shiredo326\", \"https://twitter.com/shiredo326\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59213920\"),\n                ImgData(R.raw.sae0055, \"@kashinoshishi\", \"https://twitter.com/kashinoshishi\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59283209\"),\n                ImgData(R.raw.sae0056, \"@xxSuite_Peexx\", \"https://twitter.com/xxSuite_Peexx\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=74367771\"),\n                ImgData(R.raw.sae0058, \"@minami_nyan\", \"https://twitter.com/minami_nyan\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59145679\"),\n                ImgData(R.raw.sae0059, \"@magchomp8\", \"https://twitter.com/magchomp8\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=58950389\"),\n                ImgData(R.raw.sae0060, \"みなみ茶哂\", \"https://www.pixiv.net/member.php?id=4939449\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=58574011\"),\n                ImgData(R.raw.sae0061, \"@k_nishiwaki\", \"https://twitter.com/k_nishiwaki\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=58034287\"),\n                ImgData(R.raw.sae0062, \"Koji\", \"https://www.pixiv.net/member.php?id=19228899\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=57976156\"),\n                ImgData(R.raw.sae0063, \"@P_KiGiSi\", \"https://twitter.com/P_KiGiSi\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=57758102\"),\n                ImgData(R.raw.sae0064, \"@TakahashiMitama\", \"https://twitter.com/Takahashimitama\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63206782\"),\n                ImgData(R.raw.sae0069, \"有河サトル\", \"https://www.pixiv.net/member.php?id=28781\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=53882354\"),\n                ImgData(R.raw.sae0072, \"有河サトル\", \"https://www.pixiv.net/member.php?id=28781\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=54029940\"),\n                ImgData(R.raw.sae0070, \"@25irohaxx\", \"https://twitter.com/25irohaxx\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59642129\"),\n                ImgData(R.raw.sae0071, \"@pizzasi7\", \"https://twitter.com/pizzasi7\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59989777\"),\n                ImgData(R.raw.sae0073, \"@frenchmaid_\", \"https://twitter.com/frenchmaid_\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=53105182\"),\n                ImgData(R.raw.sae0074, \"P-\", \"https://www.pixiv.net/member.php?id=1032188\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=51178608\"),\n                ImgData(R.raw.sae0077, \"P-\", \"https://www.pixiv.net/member.php?id=1032188\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=51344144\"),\n                ImgData(R.raw.sae0106, \"P-\", \"https://www.pixiv.net/member.php?id=1032188\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=57042341\"),\n                ImgData(R.raw.sae0078, \"@__KFR\", \"https://twitter.com/__KFR\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=49375938\"),\n                ImgData(R.raw.sae0079, \"AGG\", \"https://www.pixiv.net/member.php?id=12310765\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=49664984\"),\n                ImgData(R.raw.sae0080, \"みじんこうか\", \"https://www.pixiv.net/member.php?id=770137\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=47906259\"),\n                ImgData(R.raw.sae0081, \"@mazakaaaan\", \"https://twitter.com/mazakaaaan\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=47913066\"),\n                ImgData(R.raw.sae0083, \"@mazakaaaan\", \"https://twitter.com/mazakaaaan\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=46008331\"),\n                ImgData(R.raw.sae0086, \"@mazakaaaan\", \"https://twitter.com/mazakaaaan\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=41998732\"),\n                ImgData(R.raw.sae0082, \"H2O\", \"https://www.pixiv.net/member.php?id=18180240\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59537085\"),\n                ImgData(R.raw.sae0084, \"@natuya777\", \"https://twitter.com/natuya777\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=43285880\"),\n                ImgData(R.raw.sae0085, \"@natuya777\", \"https://twitter.com/natuya777\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=46606608\"),\n                ImgData(R.raw.sae0087, \"しの\", \"https://www.pixiv.net/member.php?id=35037\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=36906360\"),\n                ImgData(R.raw.sae0088, \"美月めいあ\", \"https://www.pixiv.net/member.php?id=383657\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=33659173\"),\n                ImgData(R.raw.sae0089, \"@mckeeeeelog\", \"https://twitter.com/mckeeeeelog\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=29860757\"),\n                ImgData(R.raw.sae0090, \"@miyakoazu\", \"https://twitter.com/miyakoazu\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=32349060\"),\n                ImgData(R.raw.sae0091, \"@WzK7VHEGkO0J4E4\", \"https://twitter.com/WzK7VHEGkO0J4E4\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59587222\"),\n                ImgData(R.raw.sae0092, \"@yuntayu\", \"https://twitter.com/yuntayu\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=32728220\"),\n                ImgData(R.raw.sae0093, \"@jackallllllllll\", \"https://twitter.com/jackallllllllll\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=42247716\"),\n                ImgData(R.raw.sae0094, \"@akihiko_05\", \"https://twitter.com/akihiko_05\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=68160948\"),\n                ImgData(R.raw.sae0095, \"Manyo\", \"https://www.pixiv.net/member.php?id=5940914\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=73269188\"),\n                ImgData(R.raw.sae0099, \"@migi_mawashi\", \"https://twitter.com/migi_mawashi\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=73112698\"),\n                ImgData(R.raw.sae0100, \"@syatly\", \"https://twitter.com/syatly\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=56959669\"),\n                ImgData(R.raw.sae0101, \"@syatly\", \"https://twitter.com/syatly\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=56959669\"),\n                ImgData(R.raw.sae0102, \"@ponyui0728\", \"https://twitter.com/ponyui0728\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=56880664\"),\n                ImgData(R.raw.sae0104, \"縞七\", \"https://www.pixiv.net/member.php?id=6454840\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72524370\"),\n                ImgData(R.raw.sae0105, \"@elesake\", \"https://twitter.com/elesake\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=44565332\")\n\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72574413\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72300606\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72319649\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72091546\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72010515\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=71846364\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=71576086\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=71445592\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61286524\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=71264363\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=71223663\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=68815242\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=72880878\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=69776652\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=70563899\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=69883575\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61621521\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=69759435\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=69644506\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=69541575\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=67888363\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=69598154\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=69176611\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=69297967\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=68515979\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=55885699\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=66886065\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=67197908\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=67050561\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61808784\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62053790\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=55045464\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=68054335\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61583824\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=66970564\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=66662471\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61854663\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61246834\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=66365255\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=66254674\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=66285209\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=46928698\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=66066299\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65987865\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65879293\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62559423\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65712553\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61596965\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=46623623\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63860848\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61191380\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65481843\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60867649\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63856945\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65490674\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63372013\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63350634\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=64114259\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61097071\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=41853425\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=27614826\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61628173\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63524058\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61897582\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62103143\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65479372\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=25326404\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65479726\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=26138046\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60727676\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61046820\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65479738\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63951102\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65028532\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=24908091\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=64290897\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=58546816\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62556140\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59703065\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=64076559\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=36896429\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=31847612\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=52125154\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=32441611\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=57866673\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=54074753\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=56498215\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=57458361\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60134647\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=58973257\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=52640454\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://www.pixiv.net/member_illust.php?mode=medium&illust_id=51140952\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://twitter.com/_citrusmikan/status/1084315711516770305\"),\n                //ImgData(R.raw.sae, \"\", \"\", \"https://twitter.com/frenchmaid_/status/794449492128825344\"),\n\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=46620217\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60477054\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=63879982\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60685026\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=54111389\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60556417\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61999933\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=61127239\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59531868\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=60211876\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62135077\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59731482\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=58925725\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=53024162\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=66740209\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=68011261\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=43284648\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59848031\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=73629542\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=56041501\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=70976755\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=67062837\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=42178521\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=70270394\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62495444\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=68958428\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=68433759\n                //https://www.pixiv.net/member_illust.php?mode=medium&illust_id=57793633\n        )\n\n        return imgs.random()\n    }\n\n    private fun writeSupportText()\n    {\n        if (!showAds && imgData.hasImg)\n        {\n            val saeName = \"小早川紗枝\"\n            val artText = \"\\uD83C\\uDF38 $saeName by ${imgData.name} \\uD83C\\uDF38\"\n            val spannableStringBuilder = SpannableStringBuilder(artText)\n\n            val clickableSae = object : ClickableSpan()\n            {\n                override fun onClick(view: View)\n                {\n                    val i = Intent(Intent.ACTION_VIEW)\n                    i.data = Uri.parse(\"https://twitter.com/hashtag/%E5%B0%8F%E6%97%A9%E5%B7%9D%E7%B4%97%E6%9E%9D\")\n                    startActivity(i)\n                }\n\n                override fun updateDrawState(ds: TextPaint)\n                {\n                    ds.color = ContextCompat.getColor(activity!!, R.color.blue_dark)\n                    ds.isUnderlineText = false;\n                }\n            }\n            spannableStringBuilder.setSpan(clickableSae, artText.indexOf(saeName), artText.indexOf(saeName) + saeName.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)\n\n            val clickableLink = object : ClickableSpan()\n            {\n                override fun onClick(view: View)\n                {\n                    val i = Intent(Intent.ACTION_VIEW)\n                    i.data = Uri.parse(imgData.nameLink)\n                    startActivity(i)\n                }\n\n                override fun updateDrawState(ds: TextPaint)\n                {\n                    ds.color = ContextCompat.getColor(activity!!, R.color.blue_dark)\n                    ds.isUnderlineText = false;\n                }\n            }\n            spannableStringBuilder.setSpan(clickableLink, artText.indexOf(imgData.name), artText.indexOf(imgData.name) + imgData.name.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)\n\n            supportText.text = spannableStringBuilder\n            supportText.movementMethod = LinkMovementMethod.getInstance()\n        }\n        else\n        {\n            supportText.text = getString(R.string.support_text)\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Ocr/BoxParams.java",
    "content": "package ca.fuwafuwa.kaku.Ocr;\n\n/**\n * Created by 0xbad1d3a5 on 4/16/2016.\n */\npublic final class BoxParams {\n\n    public int x;\n    public int y;\n    public int width;\n    public int height;\n\n    public BoxParams(int x, int y, int width, int height){\n        this.x = x;\n        this.y = y;\n        this.width = width;\n        this.height = height;\n    }\n\n    public String toString(){\n        return String.format(\"X:%d Y:%d (%dx%d)\", x, y, width, height);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Ocr/OcrCorrection.kt",
    "content": "package ca.fuwafuwa.kaku.Ocr\n\nclass OcrCorrection\n{\n    companion object\n    {\n        val CommonLookalikes: List<List<String>> = listOf(\n\n                // Hiragana\n                listOf(\"あ\", \"ぁ\", \"お\", \"ぉ\"),\n                listOf(\"い\", \"ぃ\"),\n                listOf(\"う\", \"ぅ\"),\n                listOf(\"え\", \"ぇ\", \"z\", \"Z\"),\n                listOf(\"お\", \"ぉ\", \"あ\", \"ぁ\"),\n\n                listOf(\"か\", \"が\", \"カ\", \"ガ\", \"ヵ\", \"力\"),\n                listOf(\"き\", \"ぎ\", \"さ\", \"ざ\"),\n                listOf(\"く\", \"ぐ\", \"〈\", \"<\", \"＜\", \"(\"),\n                listOf(\"け\", \"げ\"),\n                listOf(\"こ\", \"ご\"),\n\n                listOf(\"さ\", \"ざ\", \"き\", \"ぎ\"),\n                listOf(\"し\", \"じ\", \"L\", \"Ｌ\", \"U\"),\n                listOf(\"す\", \"ず\"),\n                listOf(\"せ\", \"ぜ\"),\n                listOf(\"そ\", \"ぞ\"),\n\n                listOf(\"た\", \"だ\"),\n                listOf(\"ち\", \"ぢ\"),\n                listOf(\"つ\", \"づ\", \"っ\", \"ウ\", \"ゥ\", \"ワ\", \"ヮ\"),\n                listOf(\"て\", \"で\"),\n                listOf(\"と\", \"ど\"),\n\n                listOf(\"な\"),\n                listOf(\"に\"),\n                listOf(\"ぬ\"),\n                listOf(\"ね\"),\n                listOf(\"の\"),\n\n                listOf(\"は\", \"ば\", \"ぱ\"),\n                listOf(\"ひ\", \"び\", \"ぴ\"),\n                listOf(\"ふ\", \"ぶ\", \"ぷ\"),\n                listOf(\"へ\", \"べ\", \"ぺ\"),\n                listOf(\"ほ\", \"ぼ\", \"ぽ\"),\n\n                listOf(\"ま\"),\n                listOf(\"み\"),\n                listOf(\"む\"),\n                listOf(\"め\"),\n                listOf(\"も\"),\n\n                listOf(\"や\", \"ゃ\"),\n                listOf(\"ゆ\", \"ゅ\"),\n                listOf(\"よ\", \"ょ\"),\n\n                listOf(\"ら\"),\n                listOf(\"り\", \"リ\", \"ㇼ\"),\n                listOf(\"る\"),\n                listOf(\"れ\"),\n                listOf(\"ろ\"),\n\n                listOf(\"わ\", \"ゎ\"),\n                listOf(\"を\"),\n                listOf(\"ん\"),\n\n                // Katakana\n                listOf(\"ア\", \"ァ\"),\n                listOf(\"イ\", \"ィ\"),\n                listOf(\"ウ\", \"ゥ\", \"つ\", \"づ\", \"っ\", \"ワ\", \"ヮ\"),\n                listOf(\"エ\", \"ェ\"),\n                listOf(\"オ\", \"ォ\"),\n\n                listOf(\"カ\", \"ガ\", \"ヵ\", \"か\", \"が\", \"力\"),\n                listOf(\"キ\", \"ギ\"),\n                listOf(\"ク\", \"グ\", \"ㇰ\"),\n                listOf(\"ケ\", \"ゲ\", \"ヶ\"),\n                listOf(\"コ\", \"ゴ\"),\n\n                listOf(\"サ\", \"ザ\"),\n                listOf(\"シ\", \"ジ\", \"ㇱ\"),\n                listOf(\"ス\", \"ズ\", \"ㇲ\"),\n                listOf(\"セ\", \"ゼ\"),\n                listOf(\"ソ\", \"ゾ\"),\n\n                listOf(\"タ\", \"ダ\", \"夕\"),\n                listOf(\"チ\", \"ヂ\"),\n                listOf(\"ツ\", \"ヅ\", \"ッ\"),\n                listOf(\"テ\", \"デ\"),\n                listOf(\"ト\", \"ド\", \"ㇳ\"),\n\n                listOf(\"ナ\"),\n                listOf(\"ニ\"),\n                listOf(\"ヌ\", \"ㇴ\"),\n                listOf(\"ネ\"),\n                listOf(\"ノ\"),\n\n                listOf(\"ハ\", \"バ\", \"パ\", \"ㇵ\"),\n                listOf(\"ヒ\", \"ビ\", \"ピ\", \"ㇶ\"),\n                listOf(\"フ\", \"ブ\", \"プ\", \"ㇷ\", \"ン\"), //, \"\\u31f7\\u309a\"),\n                listOf(\"ヘ\", \"ベ\", \"ペ\", \"ㇸ\"),\n                listOf(\"ホ\", \"ボ\", \"ポ\", \"ㇹ\"),\n\n                listOf(\"マ\"),\n                listOf(\"ミ\"),\n                listOf(\"ム\", \"ㇺ\"),\n                listOf(\"メ\"),\n                listOf(\"モ\"),\n\n                listOf(\"ヤ\", \"ャ\"),\n                listOf(\"ユ\", \"ュ\"),\n                listOf(\"ヨ\", \"ョ\"),\n\n                listOf(\"ラ\", \"ㇻ\"),\n                listOf(\"リ\", \"ㇼ\", \"り\"),\n                listOf(\"ル\", \"ㇽ\"),\n                listOf(\"レ\", \"ㇾ\"),\n                listOf(\"ロ\", \"ㇿ\", \"口\"),\n\n                listOf(\"ワ\", \"ヮ\", \"ウ\", \"ゥ\", \"つ\", \"づ\", \"っ\"),\n                listOf(\"ヲ\"),\n                listOf(\"ン\"),\n\n                // Other\n                listOf(\"ー\", \"一\", \"―\", \"‐\", \"—\", \"－\", \"-\", \"_\", \"|\"),\n                listOf(\"、\", \"`\", \"ヽ\"),\n                listOf(\"。\", \"o\")\n        )\n\n        val CommonMistakes : List<Pair<List<String>, String>> = listOf(\n\n                Pair(listOf(\"〈\", \"<\", \"＜\"), \"く\"),\n                Pair(listOf(\"L\", \"Ｌ\"), \"し\"),\n                Pair(listOf(\"z\", \"Z\"), \"え\"),\n                Pair(listOf(\"U\"), \"じ\"),\n                Pair(listOf(\"`\", \"ヽ\"), \"、\"),\n                Pair(listOf(\"o\"), \"。\"),\n\n                // Special cases for multiple mappings\n                Pair(listOf(\"ー\", \"一\", \"―\", \"‐\", \"—\", \"－\", \"-\", \"_\", \"|\"), \"\")\n        )\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Ocr/OcrParams.kt",
    "content": "package ca.fuwafuwa.kaku.Ocr\n\nimport android.graphics.Bitmap\nimport ca.fuwafuwa.kaku.TextDirection\n\ndata class OcrParams(val bitmap: Bitmap,\n                     val originalBitmap: Bitmap,\n                     val box: BoxParams,\n                     val textDirection: TextDirection,\n                     val instantMode: Boolean)\n{\n    override fun toString() : String {\n        return \"Box: $box InstantOCR: $instantMode TextDirection: $textDirection\"\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Ocr/OcrResult.kt",
    "content": "package ca.fuwafuwa.kaku.Ocr\n\nimport ca.fuwafuwa.kaku.Windows.Data.DisplayDataOcr\n\n/**\n * Created by 0xbad1d3a5 on 5/2/2016.\n */\nclass OcrResult(val displayData: DisplayDataOcr,\n                private val mOcrTime: Long)\n{\n    val text: String get() = displayData.text\n    val message: String get() = String.format(\"OCR Time: %.2fs\", mOcrTime / 1000.0)\n\n    override fun toString(): String\n    {\n        return String.format(\"%s\\nOcrTime: %d\\nInstant: %b\", text, mOcrTime, displayData.instantMode)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Ocr/OcrRunnable.kt",
    "content": "package ca.fuwafuwa.kaku.Ocr\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.os.Message\nimport android.util.Log\n\nimport com.googlecode.tesseract.android.ResultIterator\nimport com.googlecode.tesseract.android.TessBaseAPI\n\nimport java.io.FileNotFoundException\nimport java.io.FileOutputStream\nimport java.util.ArrayList\nimport java.util.HashMap\n\nimport ca.fuwafuwa.kaku.*\nimport ca.fuwafuwa.kaku.Interfaces.Stoppable\nimport ca.fuwafuwa.kaku.MainService\nimport ca.fuwafuwa.kaku.Windows.CaptureWindow\nimport ca.fuwafuwa.kaku.Windows.Data.ChoiceCertainty\nimport ca.fuwafuwa.kaku.Windows.Data.DisplayDataOcr\nimport ca.fuwafuwa.kaku.Windows.Data.ISquareChar\nimport ca.fuwafuwa.kaku.Windows.Data.SquareCharOcr\n\n/**\n * Created by 0xbad1d3a5 on 4/16/2016.\n */\nclass OcrRunnable(context: Context, private var mCaptureWindow: CaptureWindow?) : Runnable, Stoppable\n{\n    private val mContext: MainService = context as MainService\n    private val mOcrLock = java.lang.Object()\n    private val mSimilarChars = loadSimilarChars()\n    private val mCommonMistakes = loadCommonMistakes()\n\n    private var mTessBaseAPI: TessBaseAPI? = null\n    private var mThreadRunning = true\n    private var mTessReady = false\n    private var mOcrParams: OcrParams? = null\n\n    val isReadyForOcr: Boolean\n        get() = mOcrParams == null\n\n    init\n    {\n        mOcrParams = null\n    }\n\n    override fun run()\n    {\n        mTessBaseAPI = TessBaseAPI()\n        val storagePath = mContext.filesDir.absolutePath\n        mTessBaseAPI!!.init(storagePath, \"jpn\")\n\n        mTessReady = true\n\n        while (mThreadRunning)\n        {\n            Log.d(TAG, \"THREAD STARTING NEW LOOP\")\n\n            try\n            {\n                 synchronized(mOcrLock)\n                 {\n                    if (!mThreadRunning)\n                    {\n                        return@synchronized\n                    }\n\n                    Log.d(TAG, \"WAITING\")\n                    mOcrLock.wait()\n                    Log.d(TAG, \"THREAD STOPPED WAITING\")\n\n                    if (mOcrParams == null)\n                    {\n                        Log.d(TAG, \"OcrRunnable - OcrParams null\")\n                        return@synchronized\n                    }\n\n                    Log.d(TAG, \"Processing OCR with params \" + mOcrParams!!.toString())\n\n                    val startTime = System.currentTimeMillis()\n\n                    when (mOcrParams!!.textDirection)\n                    {\n                        TextDirection.HORIZONTAL -> mTessBaseAPI!!.pageSegMode = TessBaseAPI.PageSegMode.PSM_SINGLE_BLOCK\n                        TextDirection.VERTICAL -> mTessBaseAPI!!.pageSegMode = TessBaseAPI.PageSegMode.PSM_SINGLE_BLOCK_VERT_TEXT\n                    }\n\n                    saveBitmap(mOcrParams!!.bitmap)\n\n                    mCaptureWindow!!.showLoadingAnimation()\n\n                    mTessBaseAPI!!.setImage(mOcrParams!!.bitmap)\n                    mTessBaseAPI!!.getHOCRText(0)\n                    val displayData = getDisplayData(mOcrParams!!, mTessBaseAPI!!.resultIterator)\n                    processDisplayData(displayData)\n                    mTessBaseAPI!!.clear()\n\n                    if (displayData.text.length > 0)\n                    {\n                        val ocrTime = System.currentTimeMillis() - startTime\n                        sendOcrResultToContext(OcrResult(displayData, ocrTime))\n                    } else\n                    {\n                        sendToastToContext(\"No Characters Recognized.\")\n                    }\n\n                    mCaptureWindow!!.stopLoadingAnimation(mOcrParams!!.instantMode)\n\n                    mOcrParams = null\n                }\n            } catch (e: Exception)\n            {\n                e.printStackTrace()\n            }\n        }\n\n        Log.d(TAG, \"THREAD STOPPED\")\n    }\n\n    /**\n     * Unblocks the thread and starts OCR\n     */\n    fun runTess(ocrParams: OcrParams)\n    {\n        synchronized(mOcrLock)\n        {\n            if (!mThreadRunning || !mTessReady)\n            {\n                return\n            }\n\n            mOcrParams = ocrParams\n            mTessBaseAPI!!.stop()\n            mOcrLock.notify()\n\n            Log.d(TAG, \"NOTIFIED\")\n        }\n    }\n\n    /**\n     * Cancels OCR recognition in progress if Tesseract has been started\n     */\n    fun cancel()\n    {\n        mTessBaseAPI!!.stop()\n        Log.d(TAG, \"CANCELED\")\n    }\n\n    /**\n     * Cancels any OCR recognition in progress and stops any further OCR attempts\n     */\n    override fun stop()\n    {\n        synchronized(mOcrLock)\n        {\n            mThreadRunning = false\n            mOcrParams = null\n            mCaptureWindow = null\n\n            if (mTessBaseAPI != null)\n            {\n                mTessBaseAPI!!.stop()\n            }\n\n            mOcrLock.notify()\n        }\n    }\n\n    private fun processDisplayData(displayData: DisplayDataOcr)\n    {\n        for (squareChar in displayData.squareChars as List<SquareCharOcr>)\n        {\n            val similarChars = mSimilarChars[squareChar.char]\n\n            if (similarChars != null)\n            {\n                for (c in similarChars)\n                {\n                    squareChar.addChoice(c, ChoiceCertainty.UNCERTAIN)\n                }\n            }\n        }\n\n        for (squareChar in displayData.squareChars as List<SquareCharOcr>)\n        {\n            correctCommonMistake(squareChar, \"く\")\n            correctCommonMistake(squareChar, \"し\")\n            correctCommonMistake(squareChar, \"じ\")\n            correctCommonMistake(squareChar, \"え\")\n            correctCommonMistake(squareChar, \"、\")\n            correctCommonMistake(squareChar, \"。\")\n\n            correctKanjiOne(squareChar)\n            correctKatakanaDash(squareChar)\n        }\n    }\n\n    private fun correctCommonMistake(squareChar: SquareCharOcr, char: String)\n    {\n        if (mCommonMistakes[squareChar.char] == char)\n        {\n            val prev = squareChar.prev\n            val next = squareChar.next\n\n            if (prev?.char != null && LangUtils.IsJapaneseChar(prev.char[0]) ||\n                next?.char != null && LangUtils.IsJapaneseChar(next.char[0]))\n            {\n                squareChar.addChoice(char, ChoiceCertainty.CERTAIN)\n            }\n        }\n    }\n\n    private fun correctKatakanaDash(squareChar: SquareCharOcr)\n    {\n        if (mCommonMistakes[squareChar.char] != null)\n        {\n            val prev = squareChar.prev\n\n            if (prev?.char != null && LangUtils.IsKatakana(prev.char[0]))\n            {\n                squareChar.addChoice(\"ー\", ChoiceCertainty.CERTAIN)\n            }\n        }\n    }\n\n    private fun correctKanjiOne(squareChar: SquareCharOcr)\n    {\n        if (mCommonMistakes[squareChar.char] != null)\n        {\n            val next = squareChar.next\n\n            if (next?.char != null && (LangUtils.IsKanji(next.char[0]) || LangUtils.IsHiragana(next.char[0])))\n            {\n                squareChar.addChoice(\"一\", ChoiceCertainty.CERTAIN)\n            }\n        }\n    }\n\n    private fun getDisplayData(ocrParams: OcrParams, iterator: ResultIterator): DisplayDataOcr\n    {\n        val bitmap = mOcrParams!!.originalBitmap\n        val boxParams = mOcrParams!!.box\n\n        val ocrChars = ArrayList<SquareCharOcr>()\n        val displayData = DisplayDataOcr(bitmap, boxParams, ocrParams.instantMode, ocrChars)\n\n        if (iterator.next(TessBaseAPI.PageIteratorLevel.RIL_SYMBOL))\n        {\n            iterator.begin()\n        } else\n        {\n            return displayData\n        }\n\n        do\n        {\n            val c = iterator.symbolChoicesAndConfidence\n            val choices = ArrayList<kotlin.Pair<String, Double>>()\n            for (p in c) choices.add(kotlin.Pair(p.first as String, p.second as Double))\n            val pos = iterator.getBoundingBox(TessBaseAPI.PageIteratorLevel.RIL_SYMBOL)\n\n            ocrChars.add(SquareCharOcr(displayData, choices, pos))\n        } while (iterator.next(TessBaseAPI.PageIteratorLevel.RIL_SYMBOL))\n\n        iterator.delete()\n\n        displayData.assignIndicies()\n\n        return displayData\n    }\n\n    private fun loadSimilarChars(): HashMap<String, List<String>>\n    {\n        val similarChars = HashMap<String, List<String>>()\n\n        for (list in OcrCorrection.CommonLookalikes)\n        {\n            for ((index, kana) in list.withIndex())\n            {\n                if (list.size == 1)\n                {\n                    continue\n                }\n\n                val kanaList: List<String> = when (index)\n                {\n                    0 -> list.takeLast(list.size - 1)\n                    list.size - 1 -> list.take(list.size - 1)\n                    else -> list.subList(0, index) + list.subList(index + 1, list.size)\n                }\n\n                if (similarChars.containsKey(kana))\n                {\n                    for (k in kanaList)\n                    {\n                        if (!similarChars[kana]!!.contains(k))\n                        {\n                            similarChars[kana] = kanaList + listOf(k)\n                        }\n                    }\n                }\n                else\n                {\n                    similarChars[kana] = kanaList\n                }\n            }\n        }\n\n        return similarChars\n    }\n\n    private fun loadCommonMistakes(): HashMap<String, String>\n    {\n        val commonMistakes = HashMap<String, String>()\n\n        for (pair in OcrCorrection.CommonMistakes)\n        {\n            for (c in pair.first)\n            {\n                commonMistakes[c] = pair.second\n            }\n        }\n\n        return commonMistakes\n    }\n\n    private fun sendOcrResultToContext(result: OcrResult)\n    {\n        Message.obtain(mContext.handler, 0, result).sendToTarget()\n    }\n\n    private fun sendToastToContext(message: String)\n    {\n        Message.obtain(mContext.handler, 0, message).sendToTarget()\n    }\n\n    @Throws(FileNotFoundException::class)\n    private fun saveBitmap(bitmap: Bitmap, name: String = \"screen\")\n    {\n        val fs = String.format(\"%s/%s/%s_%d.png\", mContext.filesDir.absolutePath, SCREENSHOT_FOLDER_NAME, name, System.nanoTime())\n        Log.d(TAG, fs)\n        val fos = FileOutputStream(fs)\n        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)\n    }\n\n    companion object\n    {\n\n        private val TAG = OcrRunnable::class.java.name\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/PassthroughActivity.kt",
    "content": "package ca.fuwafuwa.kaku\n\nimport android.content.Intent\nimport android.os.Bundle\nimport android.view.Window\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.core.app.NotificationCompat\nimport ca.fuwafuwa.kaku.Windows.InformationWindow\nimport ca.fuwafuwa.kaku.Windows.WindowCoordinator\n\nclass PassthroughActivity : AppCompatActivity()\n{\n    override fun onCreate(savedInstanceState: Bundle?)\n    {\n        super.onCreate(savedInstanceState)\n        requestWindowFeature(Window.FEATURE_NO_TITLE);\n\n        setupKakuDatabasesAndFiles(this)\n\n        var processText : String? = null\n        when {\n            intent?.action == Intent.ACTION_PROCESS_TEXT ->\n            {\n                processText = intent.getStringExtra(Intent.EXTRA_PROCESS_TEXT)\n            }\n            intent?.action == Intent.ACTION_SEND ->\n            {\n                if (\"text/plain\" == intent.type)\n                {\n                    processText = intent.getStringExtra(Intent.EXTRA_TEXT)\n                }\n            }\n        }\n\n        if (processText != null)\n        {\n            val windowCoordinator = WindowCoordinator(applicationContext)\n            val infoWindow = windowCoordinator.getWindow(WINDOW_INFO) as InformationWindow\n\n            infoWindow.setResult(processText)\n            infoWindow.show()\n\n            finish()\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Search/JmSearchResult.kt",
    "content": "package ca.fuwafuwa.kaku.Search\n\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.EntryOptimized\nimport ca.fuwafuwa.kaku.Deinflictor.DeinflectionInfo\n\ndata class JmSearchResult(\n        val entry: EntryOptimized,\n        val deinfInfo: DeinflectionInfo,\n        val word: String\n)"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Search/JmTask.kt",
    "content": "package ca.fuwafuwa.kaku.Search\n\nimport android.content.Context\nimport android.os.AsyncTask\nimport android.util.Log\nimport ca.fuwafuwa.kaku.DB_JMDICT_NAME\nimport ca.fuwafuwa.kaku.DB_KANJIDICT_NAME\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.JmDatabaseHelper\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.EntryOptimized\nimport ca.fuwafuwa.kaku.Deinflictor.DeinflectionInfo\nimport ca.fuwafuwa.kaku.Deinflictor.Deinflector\nimport java.sql.SQLException\nimport java.util.ArrayList\nimport kotlin.collections.HashSet\nimport kotlin.collections.List\nimport kotlin.collections.filter\nimport kotlin.collections.sortedWith\n\n/**\n * Created by 0xbad1d3a5 on 12/16/2016.\n */\n\nclass JmTask @Throws(SQLException::class)\nconstructor(private val mSearchInfo: SearchInfo, private val mSearchJmTaskDone: SearchJmTaskDone, context: Context) : AsyncTask<Void, Void, List<JmSearchResult>>()\n{\n    companion object\n    {\n        private val TAG = JmTask::class.java.getName()\n    }\n\n    private val mJmDbHelper: JmDatabaseHelper = JmDatabaseHelper.instance(context)\n    private val mDeinflector: Deinflector = Deinflector(context)\n\n    interface SearchJmTaskDone\n    {\n        fun jmTaskCallback(results: List<JmSearchResult>, searchInfo: SearchInfo)\n    }\n\n    override fun doInBackground(vararg params: Void): List<JmSearchResult>\n    {\n        val text = mSearchInfo.text\n        val textOffset = mSearchInfo.textOffset\n        val entryOptimizedDao = mJmDbHelper.getDbDao<EntryOptimized>(EntryOptimized::class.java)\n\n        val startDictTime = System.currentTimeMillis()\n        var character = String(intArrayOf(text.codePointAt(textOffset)), 0, 1)\n\n        // What the flying fuck? Wasn't the entire point of using an ORM is so shit would be escaped for me?\n        character = character.replace(\"%\", \"\\\\%\")\n        character = character.replace(\"_\", \"\\\\_\")\n        character = character.replace(\"'\", \"''\")\n\n        val entries: List<EntryOptimized> = entryOptimizedDao.queryBuilder().where().like(\"kanji\", \"$character%\").query()\n        val matchedEntries = rankResults(getMatchedEntries(text, textOffset, entries))\n        Log.d(TAG, \"Dict lookup time: ${System.currentTimeMillis() - startDictTime}\")\n\n        return matchedEntries\n    }\n\n    override fun onPostExecute(result: List<JmSearchResult>)\n    {\n        mSearchJmTaskDone.jmTaskCallback(result, mSearchInfo)\n    }\n\n    @Throws(SQLException::class)\n    private fun getMatchedEntries(text: String, textOffset: Int, entries: List<EntryOptimized>): List<JmSearchResult>\n    {\n        val end = if (textOffset + 80 >= text.length) text.length else textOffset + 80\n        var word = text.substring(textOffset, end)\n        val seenEntries = HashSet<EntryOptimized>()\n        val results = ArrayList<JmSearchResult>()\n\n        while (word.isNotEmpty())\n        {\n            // Find deinflections and add them\n            val deinfResultsList: List<DeinflectionInfo> = mDeinflector.getPotentialDeinflections(word)\n            var count = 0\n            for (deinfInfo in deinfResultsList)\n            {\n                val filteredEntry: List<EntryOptimized> = entries.filter { entry -> entry.kanji == deinfInfo.word }\n\n                if (filteredEntry.isEmpty())\n                {\n                    continue\n                }\n\n                for (entry in filteredEntry){\n\n                    if (seenEntries.contains(entry)){\n                        continue\n                    }\n\n                    var valid = true\n\n                    if (count > 0)\n                    {\n                        valid = (deinfInfo.type and 1 != 0) && (entry.pos.contains(\"v1\")) ||\n                                (deinfInfo.type and 2 != 0) && (entry.pos.contains(\"v5\")) ||\n                                (deinfInfo.type and 4 != 0) && (entry.pos.contains(\"adj-i\")) ||\n                                (deinfInfo.type and 8 != 0) && (entry.pos.contains(\"vk\")) ||\n                                (deinfInfo.type and 16 != 0) && (entry.pos.contains(\"vs-\"))\n                    }\n\n                    if (valid){\n                        results.add(JmSearchResult(entry, deinfInfo, word))\n                        seenEntries.add(entry)\n                    }\n\n                    count++\n                }\n            }\n\n            // Add all exact matches as well\n            val filteredEntry: List<EntryOptimized> = entries.filter { entry -> entry.kanji == word }\n            for (entry in filteredEntry)\n            {\n                if (seenEntries.contains(entry))\n                {\n                    continue\n                }\n\n                results.add(JmSearchResult(entry, DeinflectionInfo(word, 0, \"\"), word))\n                seenEntries.add(entry)\n            }\n\n            word = word.substring(0, word.length - 1)\n        }\n\n        return results\n    }\n\n    private fun rankResults(results: List<JmSearchResult>) : List<JmSearchResult>\n    {\n        return results.sortedWith(compareBy(\n                { getDictPriority(it) },\n                { 0 - it.entry.kanji.length },\n                { getEntryPriority(it) },\n                { getPriority(it) }))\n    }\n\n    private fun getDictPriority(result: JmSearchResult) : Int\n    {\n        return when\n        {\n            result.entry.dictionary == DB_JMDICT_NAME -> Int.MAX_VALUE - 2\n            result.entry.dictionary == DB_KANJIDICT_NAME -> Int.MAX_VALUE - 1\n            else -> Int.MAX_VALUE\n        }\n    }\n\n    private fun getEntryPriority(result: JmSearchResult) : Int\n    {\n        return if (result.entry.isPrimaryEntry) 0 else 1\n    }\n\n    private fun getPriority(result: JmSearchResult) : Int\n    {\n        val priorities = result.entry.priorities.split(\",\")\n        var lowestPriority = Int.MAX_VALUE\n\n        for (priority in priorities){\n\n            var pri = Int.MAX_VALUE\n\n            if (priority.contains(\"nf\")){ // looks like the range is nf01-nf48\n                pri = priority.substring(2).toInt()\n            }\n            else if (priority == \"news1\"){\n                pri = 60\n            }\n            else if (priority == \"news2\"){\n                pri = 70\n            }\n            else if (priority == \"ichi1\"){\n                pri = 80\n            }\n            else if (priority == \"ichi2\"){\n                pri = 90\n            }\n            else if (priority == \"spec1\"){\n                pri = 100\n            }\n            else if (priority == \"spec2\"){\n                pri = 110\n            }\n            else if (priority == \"gai1\"){\n                pri = 120\n            }\n            else if (priority == \"gai2\"){\n                pri = 130\n            }\n\n            lowestPriority = if (pri < lowestPriority) pri else lowestPriority\n        }\n\n        return lowestPriority\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Search/Kd2Task.kt",
    "content": "package ca.fuwafuwa.kaku.Search\n\nimport android.content.Context\nimport android.os.AsyncTask\n\nimport com.j256.ormlite.dao.Dao\n\nimport java.sql.SQLException\n\nimport ca.fuwafuwa.kaku.Database.KanjiDict2Database.Kd2DatabaseHelper\nimport ca.fuwafuwa.kaku.Database.KanjiDict2Database.Models.CharacterOptimized\n\n/**\n * Created by 0xbad1d3a5 on 12/16/2016.\n */\n\nclass Kd2Task @Throws(SQLException::class)\nconstructor(private val mSearchInfo: SearchInfo, private val mSearchKd2TaskDone: SearchKd2TaskDone, context: Context) : AsyncTask<Void, Void, List<CharacterOptimized>>()\n{\n    companion object\n    {\n        private val TAG = Kd2Task::class.java.name\n    }\n\n    private val mKd2DbHelper: Kd2DatabaseHelper\n    private val mCharacterOptimizedDao: Dao<CharacterOptimized, Int>\n\n    interface SearchKd2TaskDone\n    {\n        fun kd2TaskCallback(results: List<CharacterOptimized>, searchInfo: SearchInfo)\n    }\n\n    init\n    {\n        this.mKd2DbHelper = Kd2DatabaseHelper.instance(context)\n        this.mCharacterOptimizedDao = mKd2DbHelper.getDbDao(CharacterOptimized::class.java)\n    }\n\n    override fun doInBackground(vararg params: Void): List<CharacterOptimized>\n    {\n        val character = String(intArrayOf(mSearchInfo.text.codePointAt(mSearchInfo.textOffset)), 0, 1).replace(\"%\", \"\\\\%\")\n        return mCharacterOptimizedDao.queryBuilder().where().like(\"kanji\", \"$character%\").query().toList()\n    }\n\n    override fun onPostExecute(result: List<CharacterOptimized>)\n    {\n        mSearchKd2TaskDone.kd2TaskCallback(result, mSearchInfo)\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Search/SearchInfo.kt",
    "content": "package ca.fuwafuwa.kaku.Search\n\nimport ca.fuwafuwa.kaku.Windows.Data.DisplayData\nimport ca.fuwafuwa.kaku.Windows.Data.ISquareChar\nimport ca.fuwafuwa.kaku.Windows.Views.KanjiCharacterView\n\n/**\n * Created by 0xbad1d3a5 on 12/16/2016.\n */\n\nclass SearchInfo(val squareChar: ISquareChar)\n{\n    val text: String get() = squareChar.displayData.text\n\n    val textOffset: Int\n        get() {\n            var index = 0\n\n            for (char in squareChar.displayData.squareChars)\n            {\n                if (char === squareChar)\n                {\n                    break\n                }\n                index += char.char.length\n            }\n\n            return index\n        }\n\n    val index: Int get() = squareChar.index\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Search/Searcher.java",
    "content": "package ca.fuwafuwa.kaku.Search;\n\nimport android.content.Context;\nimport android.os.AsyncTask;\nimport android.util.Log;\n\nimport org.jetbrains.annotations.NotNull;\n\nimport java.sql.SQLException;\nimport java.util.List;\n\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.EntryOptimized;\nimport ca.fuwafuwa.kaku.Database.KanjiDict2Database.Models.CharacterOptimized;\n\n/**\n * Created by 0xbad1d3a5 on 8/28/2016.\n */\npublic class Searcher implements JmTask.SearchJmTaskDone {\n\n    public interface SearchDictDone\n    {\n        void jmResultsCallback(List<JmSearchResult> results, SearchInfo search);\n    }\n\n    private static final String TAG = Searcher.class.getName();\n\n    private SearchDictDone mSearchDictDone;\n    private Context mContext;\n\n    public Searcher(Context context) throws SQLException\n    {\n        mContext = context;\n    }\n\n    public void registerCallback(SearchDictDone dictDone)\n    {\n        this.mSearchDictDone = dictDone;\n    }\n\n    public void unregisterCallback()\n    {\n        this.mSearchDictDone = null;\n    }\n\n    public void search(SearchInfo searchInfo)\n    {\n        try {\n            new JmTask(searchInfo, this, mContext).executeOnExecutor(AsyncTask.SERIAL_EXECUTOR);\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n    }\n\n    @Override\n    public void jmTaskCallback(@NotNull List<JmSearchResult> results, @NotNull SearchInfo searchInfo)\n    {\n        mSearchDictDone.jmResultsCallback(results, searchInfo);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/TutorialActivity.kt",
    "content": "package ca.fuwafuwa.kaku\n\nimport android.os.Bundle\nimport androidx.appcompat.app.AppCompatActivity\nimport androidx.fragment.app.Fragment\nimport androidx.fragment.app.FragmentManager\nimport androidx.fragment.app.FragmentStatePagerAdapter\nimport ca.fuwafuwa.kaku.databinding.ActivityTutorialBinding\n\nclass TutorialActivity : AppCompatActivity()\n{\n    inner class SectionsPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm)\n    {\n        override fun getItem(position: Int): Fragment\n        {\n            if (position == 0){\n                return TutorialWelcomeFragment.newInstance()\n            }\n            if (position in 1..9)\n            {\n                return TutorialFragment.newInstance(position)\n            }\n\n            return TutorialEndFragment.newInstance()\n        }\n\n        override fun getCount(): Int\n        {\n            return 11\n        }\n    }\n\n    private lateinit var mSectionsPagerAdapter: FragmentStatePagerAdapter\n    private lateinit var mBinding: ActivityTutorialBinding\n\n    override fun onCreate(savedInstanceState: Bundle?)\n    {\n        super.onCreate(savedInstanceState)\n        mBinding = ActivityTutorialBinding.inflate(layoutInflater)\n\n        supportActionBar?.hide()\n        setContentView(mBinding.root)\n\n        mSectionsPagerAdapter = SectionsPagerAdapter(supportFragmentManager)\n        mBinding.container.adapter = mSectionsPagerAdapter\n        mBinding.container.offscreenPageLimit = 1\n        mBinding.tabIndicator.setupWithViewPager(mBinding.container)\n    }\n\n    companion object\n    {\n        private val TAG = TutorialActivity::class.java.name\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/TutorialEndFragment.kt",
    "content": "package ca.fuwafuwa.kaku\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport android.widget.Button\nimport androidx.fragment.app.Fragment\nimport ca.fuwafuwa.kaku.Dialogs.GrantPermissionDialogFragment\n\nclass TutorialEndFragment : Fragment()\n{\n    private lateinit var rootView : View\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View?\n    {\n        rootView = inflater.inflate(R.layout.fragment_end, container, false)\n\n        val button = rootView.findViewById<Button>(R.id.tutorial_end_start_kaku)\n\n        button.setOnClickListener {\n            GrantPermissionDialogFragment().show(fragmentManager!!, \"GrantPermission\")\n        }\n\n        return rootView\n    }\n\n    companion object\n    {\n        fun newInstance() : TutorialEndFragment {\n            return TutorialEndFragment()\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/TutorialFragment.kt",
    "content": "package ca.fuwafuwa.kaku\n\nimport android.net.Uri\nimport android.os.Bundle\nimport android.util.Log\nimport android.view.*\nimport android.view.ViewGroup.LayoutParams.WRAP_CONTENT\nimport android.widget.Button\nimport android.widget.LinearLayout\nimport android.widget.VideoView\nimport androidx.fragment.app.DialogFragment\nimport androidx.fragment.app.Fragment\nimport ca.fuwafuwa.kaku.Dialogs.TutorialExplainDialogFragment\n\nclass TutorialFragment : Fragment()\n{\n    private lateinit var mRootView : View\n    private lateinit var mVideoView : VideoView\n    private lateinit var mButtonLayout : LinearLayout\n    private lateinit var mExplainButton: Button\n    private var mPos : Int = -1\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View?\n    {\n        mRootView = inflater.inflate(R.layout.fragment_tutorial, container, false)\n\n        mVideoView = mRootView.findViewById(R.id.instruction_video_view) as VideoView\n        mButtonLayout = mRootView.findViewById(R.id.tutorial_buttons) as LinearLayout\n        mExplainButton = mRootView.findViewById(R.id.tutorial_button_explain)\n\n        mPos = arguments?.getInt(ARG_SECTION_NUMBER)!!\n\n        mExplainButton.setOnClickListener {\n            getExplainDialogForFragment(mPos).show(fragmentManager!!, \"ExplainDialog$mPos\")\n        }\n\n        Log.d(TAG, \"onCreateView $mPos\")\n\n        return mRootView\n    }\n\n    override fun onStart()\n    {\n        super.onStart()\n\n        mButtonLayout.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener\n        {\n            override fun onGlobalLayout()\n            {\n                val drawableHeight = mButtonLayout.y.toInt()\n\n                val params = LinearLayout.LayoutParams(WRAP_CONTENT, drawableHeight - dpToPx(context!!, 20))\n                params.gravity = Gravity.CENTER_HORIZONTAL\n                params.setMargins(0, dpToPx(context!!, 20), 0, 0)\n                mVideoView.layoutParams = params\n                mVideoView.requestLayout()\n\n                mButtonLayout.viewTreeObserver.removeOnGlobalLayoutListener(this)\n            }\n        })\n    }\n\n    override fun onResume()\n    {\n        super.onResume()\n\n        mVideoView.setVideoURI(Uri.parse(\"android.resource://ca.fuwafuwa.kaku/${getVideoForSectionNumber(mPos)}\"))\n        mVideoView.setOnPreparedListener { it.isLooping = true }\n        mVideoView.start()\n    }\n\n    private fun getExplainDialogForFragment(num: Int) : DialogFragment\n    {\n        return TutorialExplainDialogFragment.newInstance(getTitleTextForSectionNumber(num), getTextForSectionNumber(num))\n    }\n\n    private fun getVideoForSectionNumber(num: Int): Int\n    {\n        when (num){\n            1 -> return R.raw.tut1\n            2 -> return R.raw.tut2\n            3 -> return R.raw.tut3\n            4 -> return R.raw.tut4\n            5 -> return R.raw.tut5\n            6 -> return R.raw.tut6\n            7 -> return R.raw.tut7\n            8 -> return R.raw.tut8\n            9 -> return R.raw.tut9\n        }\n\n        return 0\n    }\n\n    private fun getTitleTextForSectionNumber(num: Int): String\n    {\n        when (num){\n            1 -> return \"BASIC USAGE\"\n            2 -> return \"INSTANT MODE\"\n            3 -> return \"QUICK IMAGE ACTION - FILTER\"\n            4 -> return \"QUICK TEXT ACTION - SWAP\"\n            5 -> return \"QUICK TEXT ACTION - EDIT\"\n            6 -> return \"QUICK TEXT ACTION - DELETE\"\n            7 -> return \"SEND TO GOOGLE TRANSLATE\"\n            8 -> return \"NOTIFICATION CONTROLS\"\n            9 -> return \"SELECT TO LOOKUP\"\n        }\n\n        return \"\"\n    }\n\n    private fun getTextForSectionNumber(num: Int): String\n    {\n        when (num){\n            1 -> return \"Drag the capture window to move the window. Drag the bottom right corner to resize. Double tap to start OCR and recognize text. Tip: resize area is inside the capture window.\"\n            2 -> return \"If instant mode is turned on in the settings and the capture window is fairly small, OCR will start immediately. This mode was intended to recognize words, not sentences.\"\n            3 -> return \"If the background of the text you want to recognize is translucent, you can try adjusting the image filter settings by doing a long press, then dragging left or right. Note: image filter setting must be turned on.\"\n            4 -> return \"Sometimes Kaku misrecognizes the kanji but can be easily corrected. Perform a quick swipe downward on the kanji for possible alternate recognitions.\"\n            5 -> return \"In the case that the correct kanji was not present in the swap quick action, perform a quick swipe to the upper-left to manually input the kanji. For manual correction, you must have a handwriting keyboard installed - for example, Gboard w/ Japanese Handwriting by Google.\"\n            6 -> return \"If you need to delete any extraneous characters, swipe to the upper right. For all text quick actions, the swipe direction may be reversed in instant mode when there is not enough screen space.\"\n            7 -> return \"Tap and hold on any kanji to copy recognized text to the clipboard. If you have \\\"Tap to Translate\\\" enabled in the Google Translate app, that will also be brought up.\"\n            8 -> return \"Quickly show/hide Kaku or change Kaku's settings through the notification.\"\n            9 -> return \"In the case that you can select the text and don't need OCR, simply select the text and send it to Kaku to bring up the dictionary.\"\n        }\n\n        return \"\"\n    }\n\n    companion object\n    {\n        private val TAG = TutorialFragment::class.java.name\n        private val ARG_SECTION_NUMBER = \"section_number\"\n\n        fun newInstance(sectionNumber: Int): TutorialFragment\n        {\n            val fragment = TutorialFragment()\n            val args = Bundle()\n            args.putInt(ARG_SECTION_NUMBER, sectionNumber)\n            fragment.arguments = args\n            return fragment\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/TutorialWelcomeFragment.kt",
    "content": "package ca.fuwafuwa.kaku\n\nimport android.os.Bundle\nimport android.view.LayoutInflater\nimport android.view.View\nimport android.view.ViewGroup\nimport androidx.fragment.app.Fragment\n\nclass TutorialWelcomeFragment : Fragment()\n{\n    private lateinit var rootView : View\n\n    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View?\n    {\n        rootView = inflater.inflate(R.layout.fragment_welcome, container, false)\n\n        return rootView\n    }\n\n    companion object\n    {\n        fun newInstance() : TutorialWelcomeFragment {\n            return TutorialWelcomeFragment()\n        }\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/CaptureWindow.kt",
    "content": "package ca.fuwafuwa.kaku.Windows\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.graphics.Color\nimport android.graphics.drawable.Drawable\nimport android.media.Image\nimport android.util.Log\nimport android.view.MotionEvent\nimport android.view.View\nimport android.view.ViewTreeObserver\nimport android.view.WindowManager\nimport android.view.animation.Animation\nimport android.view.animation.AnimationUtils\nimport android.widget.ImageView\n\nimport java.io.FileOutputStream\nimport java.io.IOException\n\nimport androidx.core.content.ContextCompat\nimport ca.fuwafuwa.kaku.*\nimport ca.fuwafuwa.kaku.MainService\nimport ca.fuwafuwa.kaku.Ocr.BoxParams\nimport ca.fuwafuwa.kaku.Ocr.OcrParams\nimport ca.fuwafuwa.kaku.Ocr.OcrRunnable\nimport ca.fuwafuwa.kaku.Prefs\nimport ca.fuwafuwa.kaku.R\nimport ca.fuwafuwa.kaku.TextDirection\nimport ca.fuwafuwa.kaku.Windows.Interfaces.WindowListener\nimport ca.fuwafuwa.kaku.XmlParsers.CommonParser\nimport com.googlecode.leptonica.android.*\n\n/**\n * Created by 0xbad1d3a5 on 4/13/2016.\n */\nclass CaptureWindow(context: Context, windowCoordinator: WindowCoordinator) : Window(context, windowCoordinator, R.layout.window_capture), WindowListener\n{\n    private val mOcr: OcrRunnable\n    private val mWindowBox: View\n    private val mImageView: ImageView\n    private val mFadeRepeat: Animation\n    private val mBorderDefault: Drawable\n    private val mBorderReady: Drawable\n\n    private var mPrefs: Prefs? = null\n    private var mThreshold: Int = 0\n    private var mLastDoubleTapTime: Long = 0\n    private val mLastDoubleTapIgnoreDelay: Long\n    private var mInLongPress: Boolean = false\n    private var mProcessingPreview: Boolean = false\n    private var mProcessingOcr: Boolean = false\n    private var mScreenshotForOcr: ScreenshotForOcr? = null\n\n    private var mCommonParser: CommonParser? = null\n\n    private val screenshotForOcr: ScreenshotForOcr?\n        get()\n        {\n            val viewPos = IntArray(2)\n            mWindowBox.getLocationOnScreen(viewPos)\n            val box = BoxParams(viewPos[0], viewPos[1], params.width, params.height)\n\n            try\n            {\n                return getReadyScreenshot(box)\n            } catch (e: Exception)\n            {\n                e.printStackTrace()\n            }\n\n            return null\n        }\n\n    private inner class ScreenshotForOcr(val crop: Bitmap?, val orig: Bitmap?, val params: BoxParams?, private var mSetThreshold: Int)\n    {\n\n        private var mCropProcessed: Bitmap? = null\n\n        val cachedScreenshot: Bitmap?\n            get()\n            {\n                if (mCropProcessed == null)\n                {\n                    mCropProcessed = getProcessedScreenshot(mSetThreshold)\n                }\n\n                return mCropProcessed\n            }\n\n\n        init\n        {\n            this.mCropProcessed = null\n        }\n\n        fun getProcessedScreenshot(threshold: Int): Bitmap\n        {\n            val pix = ReadFile.readBitmap(crop)\n            val pix8 = Convert.convertTo8(pix)\n            val pixT = GrayQuant.pixThresholdToBinary(pix8, threshold)\n\n            val binarizedBitmap = WriteFile.writeBitmap(pixT)\n\n            pix.recycle()\n            pixT.recycle()\n\n            if (mCropProcessed != null) mCropProcessed!!.recycle()\n            mCropProcessed = binarizedBitmap\n            mSetThreshold = threshold\n\n            return binarizedBitmap\n        }\n\n        private fun kMeansClustering()\n        {\n\n        }\n\n        private fun calculateFuriganaPosition(bitmap: Bitmap): Bitmap\n        {\n            val screen = bitmap.copy(bitmap.config, true)\n\n            val screenHeight = screen.height\n            val screenHeightHalf = (screenHeight / 2).toFloat()\n            val screenWidth = screen.width\n\n            val histogram = IntArray(screenWidth)\n            val histogramBoost = FloatArray(screenWidth)\n\n            for (x in 0 until screenWidth)\n            {\n                for (y in 0 until screenHeight)\n                {\n                    val pixel = screen.getPixel(x, y)\n                    val R = pixel shr 16 and 0xff\n                    val G = pixel shr  8 and 0xff\n                    val B = pixel        and 0xff\n                    if (!(R < 10 && G < 10 && B < 10))\n                    {\n                        histogram[x]++\n                        histogramBoost[x] += if (y.toFloat() / screenHeight < 0.5) (screenHeightHalf - y) / screenHeightHalf else -((y - screenHeightHalf) / screenHeightHalf)\n                    }\n                }\n            }\n\n            // Calculate boost\n            var boostTotal = 0f\n            var boostAvg = 0f\n            var boostMax = 0f\n            // Find highest boost value\n            for (x in 0 until screenWidth)\n            {\n                if (histogramBoost[x] > boostMax) boostMax = histogramBoost[x]\n            }\n            // Stretch boost by itself (higher boosts will be even higher), and normalize all boost values by boostMax\n            for (x in 0 until screenWidth)\n            {\n                histogramBoost[x] = histogramBoost[x] * histogramBoost[x] / boostMax\n            }\n            // Find highest boost value\n            for (x in 0 until screenWidth)\n            {\n                if (histogramBoost[x] > boostMax) boostMax = histogramBoost[x]\n            }\n            // Normalize all boost values by boostMax again\n            for (x in 0 until screenWidth)\n            {\n                histogramBoost[x] = histogramBoost[x] / boostMax\n                boostTotal += histogramBoost[x]\n            }\n            boostAvg = boostTotal / screenWidth\n\n            // Calculate histogram average excluding white columns\n            var averageTotal = 0\n            var averageNonZero = 0\n            for (i in histogram.indices)\n            {\n                if (histogram[i] != 0)\n                {\n                    averageTotal += histogram[i]\n                    averageNonZero++\n                }\n            }\n            val avg = if (averageNonZero == 0) screenHeight else averageTotal / averageNonZero\n            var avgLine = screenHeight - (screenHeight - avg)\n            val maxBoostTimes = screenHeight - avg\n            avgLine = if (avgLine >= screenHeight) screenHeight - 1 else avgLine\n\n            // Draw histogram\n            for (x in 0 until screenWidth)\n            {\n                if (histogram[x] == 0)\n                {\n                    continue\n                }\n\n                var y: Int\n                y = screenHeight - 1\n                while (y >= screenHeight - (screenHeight - histogram[x]))\n                {\n                    screen.setPixel(x, y, screen.getPixel(x, y) and -0x3738)\n                    y--\n                }\n\n                if (histogramBoost[x] > 0)\n                {\n                    val timesToBoost = (histogramBoost[x] * screenHeight).toInt()\n                    for (i in 0 until timesToBoost)\n                    {\n                        if (y > 0)\n                        {\n                            screen.setPixel(x, y, screen.getPixel(x, y) and -0x373701)\n                            y--\n                        }\n                    }\n                }\n\n                if (histogram[x] != screenHeight)\n                {\n                    while (y > 0)\n                    {\n                        screen.setPixel(x, y, screen.getPixel(x, y) and -0x373738)\n                        y--\n                    }\n                }\n            }\n\n            // Draw average histogram line\n            val avgLineM = if (avgLine - 1 < 0) 0 else avgLine - 1\n            val avgLineP = if (avgLine + 1 > screenHeight - 1) screenHeight - 1 else avgLine + 1\n            for (x in 0 until screenWidth)\n            {\n                screen.setPixel(x, avgLineM, Color.GREEN)\n                screen.setPixel(x, avgLine, Color.GREEN)\n                screen.setPixel(x, avgLineP, Color.GREEN)\n            }\n\n            return screen\n        }\n    }\n\n    init\n    {\n        show()\n\n        this.mCommonParser = CommonParser(context)\n\n        mImageView = window.findViewById(R.id.capture_image)\n        mFadeRepeat = AnimationUtils.loadAnimation(this.context, R.anim.fade_repeat)\n        mBorderDefault = this.context.resources.getDrawable(R.drawable.bg_translucent_border_0_blue_blue, null)\n        mBorderReady = this.context.resources.getDrawable(R.drawable.bg_transparent_border_0_nil_ready, null)\n\n        mThreshold = 128\n        mLastDoubleTapTime = System.currentTimeMillis()\n        mLastDoubleTapIgnoreDelay = 500\n        mInLongPress = false\n        mProcessingPreview = false\n        mProcessingOcr = false\n        mScreenshotForOcr = null\n\n        mPrefs = getPrefs(context)\n\n        mOcr = OcrRunnable(this.context, this)\n        val tessThread = Thread(mOcr)\n        tessThread.name = String.format(\"TessThread%d\", System.nanoTime())\n        tessThread.isDaemon = true\n        tessThread.start()\n\n        windowManager.defaultDisplay.rotation\n\n        // Need to wait for the view to finish updating before we try to determine it's location\n        mWindowBox = window.findViewById(R.id.capture_box)\n        mWindowBox.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener\n        {\n            override fun onGlobalLayout()\n            {\n                (context as MainService).onCaptureWindowFinishedInitializing()\n                mWindowBox.viewTreeObserver.removeOnGlobalLayoutListener(this)\n            }\n        })\n\n        //windowCoordinator.getWindow(Constants.WINDOW_HISTORY).show();\n    }\n\n    override fun reInit(options: Window.ReinitOptions)\n    {\n        mPrefs = getPrefs(context)\n        super.reInit(options)\n    }\n\n    override fun onDoubleTap(e: MotionEvent): Boolean\n    {\n        mLastDoubleTapTime = System.currentTimeMillis()\n        performOcr(false)\n\n        // mCommonParser!!.parseJmDict()\n\n        return true\n    }\n\n    override fun onTouch(e: MotionEvent): Boolean\n    {\n        hideInstantWindows()\n\n        if (!mInLongPress && !mProcessingOcr)\n        {\n            mImageView.setImageResource(0)\n            setBorderStyle(e)\n        }\n\n        when (e.action)\n        {\n            MotionEvent.ACTION_MOVE ->\n            {\n                if (System.currentTimeMillis() > mLastDoubleTapTime + mLastDoubleTapIgnoreDelay)\n                {\n                    mOcr.cancel()\n                }\n\n                if (mInLongPress && mPrefs!!.imageFilterSetting)\n                {\n                    setPreviewImageForThreshold(e)\n                }\n            }\n        }\n\n        return super.onTouch(e)\n    }\n\n    override fun onLongPress(e: MotionEvent)\n    {\n        Log.d(TAG, \"onLongPress\")\n\n        mInLongPress = true\n        setPreviewImageForThreshold(e)\n    }\n\n    override fun onResize(e: MotionEvent): Boolean\n    {\n        hideInstantWindows()\n\n        mOcr.cancel()\n        mImageView.setImageResource(0)\n        setBorderStyle(e)\n        return super.onResize(e)\n    }\n\n    override fun onUp(e: MotionEvent): Boolean\n    {\n\n        Log.d(TAG, String.format(\"onUp - mImageFilterSetting: %b | mInLongPress: %b | mProcessingPreview: %b | mProcessingOcr: %b\", mPrefs!!.imageFilterSetting, mInLongPress, mProcessingPreview, mProcessingOcr))\n\n        if (!mInLongPress && !mProcessingPreview && !mProcessingOcr)\n        {\n            Log.d(TAG, \"onUp - SetPreviewImage\")\n            setBorderStyle(e)\n            mProcessingPreview = true\n            setCroppedScreenshot()\n        }\n\n        mInLongPress = false\n\n        return true\n    }\n\n    override fun stop()\n    {\n        mOcr.stop()\n        //windowCoordinator.getWindow(Constants.WINDOW_HISTORY).hide();\n        super.stop()\n    }\n\n    fun showLoadingAnimation()\n    {\n        (context as MainService).handler.post {\n            Log.d(TAG, \"showLoadingAnimation\")\n\n            mWindowBox.background = mBorderDefault\n            mImageView.imageAlpha = 0\n            mWindowBox.animation = mFadeRepeat\n            mWindowBox.startAnimation(mFadeRepeat)\n        }\n    }\n\n    fun stopLoadingAnimation(instant: Boolean)\n    {\n        (context as MainService).handler.post {\n            mProcessingOcr = false\n            mWindowBox.background = mBorderReady\n            mWindowBox.clearAnimation()\n            Log.d(TAG, \"stopLoadingAnimation - instant: $instant\")\n            if (instant)\n            {\n                mImageView.imageAlpha = 255\n            } else\n            {\n                mImageView.imageAlpha = 255\n                mImageView.setImageResource(0)\n                mScreenshotForOcr = null\n            }\n        }\n    }\n\n    fun hideInstantWindows()\n    {\n        windowCoordinator.getWindow(WINDOW_INSTANT_KANJI).hide()\n    }\n\n    override fun getDefaultParams(): WindowManager.LayoutParams\n    {\n        val params = super.getDefaultParams()\n        params.x = realDisplaySize.x / 2 - params.width / 2\n        params.y = realDisplaySize.y / 4 - params.height / 2\n        params.alpha = 0.8F\n        return params\n    }\n\n    private fun setPreviewImageForThreshold(e: MotionEvent)\n    {\n        if (mPrefs!!.imageFilterSetting && mScreenshotForOcr != null)\n        {\n            mThreshold = (e.rawX / realDisplaySize.x * 255).toInt()\n            val bitmap = mScreenshotForOcr!!.getProcessedScreenshot(mThreshold)\n            mImageView.setImageBitmap(bitmap)\n        }\n    }\n\n    private fun setCroppedScreenshot()\n    {\n        val thread = Thread(Runnable {\n            val ocrScreenshot = screenshotForOcr\n\n            if (ocrScreenshot == null || ocrScreenshot.crop == null || ocrScreenshot.orig == null || ocrScreenshot.params == null)\n            {\n                mProcessingPreview = false\n                return@Runnable\n            }\n\n            // Generate a cached screenshot in worker thread before setting it in the UI thread\n            ocrScreenshot.cachedScreenshot\n\n            (context as MainService).handler.post {\n                mScreenshotForOcr = ocrScreenshot\n\n                if (mPrefs!!.imageFilterSetting)\n                {\n                    mImageView.setImageBitmap(mScreenshotForOcr!!.cachedScreenshot)\n                }\n\n                if (mPrefs!!.instantModeSetting && System.currentTimeMillis() > mLastDoubleTapTime + mLastDoubleTapIgnoreDelay)\n                {\n                    val sizeForInstant = minSize * 3\n                    if (sizeForInstant >= mScreenshotForOcr!!.params!!.width || sizeForInstant >= mScreenshotForOcr!!.params!!.height)\n                    {\n                        performOcr(true)\n                    }\n                }\n\n                mProcessingPreview = false\n            }\n        })\n        thread.start()\n    }\n\n    private fun setBorderStyle(e: MotionEvent)\n    {\n        when (e.action)\n        {\n            MotionEvent.ACTION_DOWN -> mWindowBox.background = mBorderDefault\n            MotionEvent.ACTION_UP -> mWindowBox.background = mBorderReady\n        }\n    }\n\n    private fun performOcr(instant: Boolean)\n    {\n        mProcessingOcr = true\n\n        try\n        {\n            if (!instant)\n            {\n                while (!mOcr.isReadyForOcr)\n                {\n                    mOcr.cancel()\n                    Thread.sleep(10)\n                }\n            }\n\n            if (mScreenshotForOcr == null)\n            {\n                mProcessingOcr = false\n                return\n            }\n\n            val processedImage = if (mPrefs!!.imageFilterSetting) mScreenshotForOcr!!.cachedScreenshot else mScreenshotForOcr!!.crop\n\n            var textDirection = mPrefs!!.textDirectionSetting\n            if (textDirection === TextDirection.AUTO)\n            {\n                textDirection = if (mScreenshotForOcr!!.params!!.width >= mScreenshotForOcr!!.params!!.height) TextDirection.HORIZONTAL else TextDirection.VERTICAL\n            }\n\n            mOcr.runTess(OcrParams(processedImage!!, mScreenshotForOcr!!.crop!!, mScreenshotForOcr!!.params!!, textDirection, instant))\n        } catch (e: Exception)\n        {\n            e.printStackTrace()\n        }\n\n    }\n\n    @Throws(Exception::class)\n    private fun getReadyScreenshot(box: BoxParams): ScreenshotForOcr?\n    {\n        Log.d(TAG, String.format(\"X:%d Y:%d (%dx%d)\", box.x, box.y, box.width, box.height))\n\n        var screenshotReady: Boolean\n        val startTime = System.currentTimeMillis()\n        var screenshot: Bitmap\n\n        do\n        {\n\n            val rawScreenshot = (context as MainService).screenshot\n            if (rawScreenshot == null)\n            {\n                Log.d(TAG, \"getReadyScreenshot - rawScreenshot null\")\n                return null\n            }\n\n            screenshot = convertImageToBitmap(rawScreenshot)\n            screenshotReady = checkScreenshotIsReady(screenshot, box)\n\n            val viewPos = IntArray(2)\n            mWindowBox.getLocationOnScreen(viewPos)\n            box.x = viewPos[0]\n            box.y = viewPos[1]\n            box.width = params.width\n            box.height = params.height\n\n        } while (!screenshotReady && System.currentTimeMillis() < startTime + 2000)\n\n        val croppedBitmap = getCroppedBitmap(screenshot, box)\n\n        //saveBitmap(screenshot, String.format(\"debug_(%d,%d)_(%d,%d)\", box.x, box.y, box.width, box.height));\n        if (!screenshotReady)\n        {\n            saveBitmap(screenshot, String.format(\"error_(%d,%d)_(%d,%d)\", box.x, box.y, box.width, box.height))\n            saveBitmap(croppedBitmap, String.format(\"error_(%d,%d)_(%d,%d)\", box.x, box.y, box.width, box.height))\n            return null\n        }\n\n        return ScreenshotForOcr(croppedBitmap, screenshot, box, mThreshold)\n    }\n\n    private fun checkScreenshotIsReady(screenshot: Bitmap, box: BoxParams): Boolean\n    {\n        var readyColor = ContextCompat.getColor(context, R.color.red_capture_window_ready)\n        val screenshotColor = screenshot.getPixel(box.x, box.y)\n\n        if (readyColor != screenshotColor && isAcceptableAlternateReadyColor(screenshotColor))\n        {\n            readyColor = screenshotColor\n        }\n\n        for (x in box.x until box.x + box.width)\n        {\n            if (!isRGBWithinTolerance(readyColor, screenshot.getPixel(x, box.y)))\n            {\n                return false\n            }\n        }\n\n        for (x in box.x until box.x + box.width)\n        {\n            if (!isRGBWithinTolerance(readyColor, screenshot.getPixel(x, box.y + box.height - 1)))\n            {\n                return false\n            }\n        }\n\n        for (y in box.y until box.y + box.height)\n        {\n            if (!isRGBWithinTolerance(readyColor, screenshot.getPixel(box.x, y)))\n            {\n                return false\n            }\n        }\n\n        for (y in box.y until box.y + box.height)\n        {\n            if (!isRGBWithinTolerance(readyColor, screenshot.getPixel(box.x + box.width - 1, y)))\n            {\n                return false\n            }\n        }\n\n        return true\n    }\n\n    /**\n     * Looks like sometimes the screenshot just has a color that is 100% totally wrong. Let's just accept any red that's \"red enough\"\n     * @param screenshotColor\n     * @return\n     */\n    private fun isAcceptableAlternateReadyColor(screenshotColor: Int): Boolean\n    {\n        val R = screenshotColor shr 16 and 0xFF\n        val G = screenshotColor shr 8 and 0xFF\n        val B = screenshotColor and 0xFF\n\n        var isValid = true\n\n        if (G * 10 > R)\n        {\n            isValid = false\n        }\n\n        if (B * 10 > R)\n        {\n            isValid = false\n        }\n\n        return isValid\n    }\n\n    private fun isRGBWithinTolerance(color: Int, colorToCheck: Int): Boolean\n    {\n        val redRatio = (colorToCheck shr 16 and 0xFF) / 3;\n        var isColorWithinTolerance: Boolean = ((colorToCheck and 0xFF) < redRatio)\n        isColorWithinTolerance = isColorWithinTolerance and ((colorToCheck shr 8 and 0xFF) < redRatio)\n        isColorWithinTolerance = isColorWithinTolerance and ((colorToCheck shr 16 and 0xFF) > 140)\n        // Log.d(\"RGB\", \"R: ${colorToCheck shr 16 and 0xFF} G: ${colorToCheck shr 8 and 0xFF}B: ${colorToCheck and 0xFF}\")\n\n        return isColorWithinTolerance\n    }\n\n    @Throws(OutOfMemoryError::class)\n    private fun convertImageToBitmap(image: Image): Bitmap\n    {\n        val planes = image.planes\n        val buffer = planes[0].buffer\n        val pixelStride = planes[0].pixelStride\n        val rowStride = planes[0].rowStride\n        val rowPadding = rowStride - pixelStride * image.width\n\n        val bitmap = Bitmap.createBitmap(image.width + rowPadding / pixelStride, image.height, Bitmap.Config.ARGB_8888)\n        bitmap.copyPixelsFromBuffer(buffer)\n        image.close()\n\n        return bitmap\n    }\n\n    private fun getCroppedBitmap(screenshot: Bitmap, box: BoxParams): Bitmap\n    {\n        val borderSize = dpToPx(context, 1) + 1 // +1 due to rounding errors\n        return Bitmap.createBitmap(screenshot,\n                box.x + borderSize,\n                box.y + borderSize,\n                box.width - 2 * borderSize,\n                box.height - 2 * borderSize)\n    }\n\n    @Throws(IOException::class)\n    private fun saveBitmap(bitmap: Bitmap, name: String)\n    {\n        val fs = String.format(\"%s/%s/%s_%d.png\", context.filesDir.absolutePath, SCREENSHOT_FOLDER_NAME, name, System.nanoTime())\n        Log.d(TAG, fs)\n        val fos = FileOutputStream(fs)\n        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)\n        fos.close()\n    }\n\n    companion object\n    {\n\n        private val TAG = CaptureWindow::class.java.name\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Data/DisplayData.kt",
    "content": "package ca.fuwafuwa.kaku.Windows.Data\n\nimport android.graphics.Bitmap\nimport ca.fuwafuwa.kaku.Ocr.BoxParams\nimport ca.fuwafuwa.kaku.splitTextByChar\n\nopen class DisplayData(var squareChars: List<ISquareChar>)\n{\n    open var instantMode = false\n\n    val text: String\n        get()\n        {\n            val sb = StringBuilder()\n\n            for (char in squareChars)\n            {\n                sb.append(char.char)\n            }\n\n            return sb.toString()\n        }\n\n    val count: Int\n        get()\n        {\n            return squareChars.size\n        }\n\n    fun recomputeChars()\n    {\n        val newSquareChars = mutableListOf<ISquareChar>()\n\n        for (squareChar in squareChars)\n        {\n            val newChars = squareChar.text ?: squareChar.char\n            squareChar.text = null\n\n            when\n            {\n                newChars.length > 1 ->\n                {\n                    val newCharsList = splitTextByChar(newChars)\n\n                    for (newChar in newCharsList)\n                    {\n                        val newSquareChar = squareChar.clone()\n                        newSquareChar.char = newChar\n                        addOcrChoice(newSquareChar, newChar)\n\n                        newSquareChars.add(newSquareChar)\n                    }\n                }\n                newChars.length == 1 ->\n                {\n                    if (newChars != squareChar.char)\n                    {\n                        squareChar.char = newChars\n                        addOcrChoice(squareChar, newChars)\n                    }\n                    newSquareChars.add(squareChar)\n                }\n                newChars.length == 0 ->\n                {\n                    // character was deleted\n                }\n            }\n        }\n\n        squareChars = newSquareChars\n        assignIndicies()\n    }\n\n    fun assignIndicies()\n    {\n        for ((index, squareChars) in squareChars.withIndex())\n        {\n            squareChars.index = index\n        }\n    }\n\n    private fun addOcrChoice(squareChar: ISquareChar, choice: String)\n    {\n        if (squareChar is SquareCharOcr)\n        {\n            squareChar.addChoice(choice, ChoiceCertainty.CERTAIN)\n        }\n    }\n}\n\nclass DisplayDataOcr(val bitmap: Bitmap,\n                     val boxParams: BoxParams,\n                     override var instantMode: Boolean,\n                     squareChars: List<SquareCharOcr>) : DisplayData(squareChars)\n{\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Data/SquareChar.kt",
    "content": "package ca.fuwafuwa.kaku.Windows.Data\n\ninterface ISquareChar\n{\n    var index: Int\n\n    var char: String\n\n    var text: String?\n\n    var prev: ISquareChar?\n\n    var next: ISquareChar?\n\n    var userTouched: Boolean\n\n    val displayData: DisplayData\n\n    fun clone() : ISquareChar\n}\n\nopen class SquareChar(override val displayData: DisplayData,\n                      override var char: String) : ISquareChar\n{\n    override var index: Int = -1\n\n    override var userTouched: Boolean = false\n\n    override var text : String? = null\n    get()\n    {\n        val returnText = field\n        field = null\n        return returnText\n    }\n\n    override var prev : ISquareChar? = null\n    get()\n    {\n        return if (index == 0)\n        {\n            null\n        }\n        else\n        {\n            displayData.squareChars[index - 1]\n        }\n    }\n\n    override var next: ISquareChar? = null\n    get()\n    {\n        return if (index == displayData.count - 1)\n        {\n            null\n        }\n        else\n        {\n            displayData.squareChars[index + 1]\n        }\n    }\n\n    override fun clone(): ISquareChar\n    {\n        return SquareChar(displayData, char)\n    }\n}\n\nclass SquareCharOcr(override val displayData: DisplayDataOcr,\n                    val allChoices : MutableList<Pair<String, Double>>,\n                    val bitmapPos: IntArray) : SquareChar(displayData, \"\")\n{\n    override var char : String = \"\"\n\n    init\n    {\n        sortChoices()\n        char = allChoices[0].first\n    }\n\n    fun addChoice(char: String, certainty: ChoiceCertainty)\n    {\n        val matchIndex = allChoices.indexOfFirst { x -> x.first == char}\n\n        if (certainty == ChoiceCertainty.CERTAIN)\n        {\n            if (matchIndex >= 0) allChoices.removeAt(matchIndex)\n\n            allChoices.add(0, Pair(char, 100.0))\n            this.char = char\n        }\n        else\n        {\n            if (matchIndex < 0)\n            {\n                allChoices.add(Pair(char, 0.0))\n            }\n        }\n    }\n\n    override fun clone(): ISquareChar\n    {\n        return SquareCharOcr(displayData, allChoices.toMutableList(), bitmapPos)\n    }\n\n    private fun sortChoices()\n    {\n        allChoices.sortByDescending { x -> x.second }\n    }\n}\n\nenum class ChoiceCertainty\n{\n    CERTAIN,\n    UNCERTAIN\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/EditWindow.kt",
    "content": "package ca.fuwafuwa.kaku.Windows\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.graphics.Color\nimport android.graphics.PixelFormat\nimport android.graphics.Point\nimport android.os.Build\nimport android.util.Log\nimport android.view.MotionEvent\nimport android.view.WindowManager\nimport android.widget.ImageView\n\nimport ca.fuwafuwa.kaku.R\nimport ca.fuwafuwa.kaku.Windows.Data.DisplayDataOcr\nimport ca.fuwafuwa.kaku.Windows.Data.ISquareChar\nimport ca.fuwafuwa.kaku.Windows.Data.SquareCharOcr\nimport ca.fuwafuwa.kaku.Windows.Interfaces.IRecalculateKanjiViews\nimport ca.fuwafuwa.kaku.Windows.Views.ChoiceEditText\n\n/**\n * Created by 0xbad1d3a5 on 4/23/2016.\n */\nclass EditWindow(context: Context, windowCoordinator: WindowCoordinator) : Window(context, windowCoordinator, R.layout.window_edit), ChoiceEditText.InputDoneListener\n{\n    private val mChoiceEditText: ChoiceEditText = window.findViewById(R.id.edit_text)\n\n    private lateinit var mCallback: IRecalculateKanjiViews\n    private lateinit var mSquareChar: ISquareChar\n\n    init\n    {\n        mChoiceEditText.setInputDoneCallback(this)\n    }\n\n    override fun onTouch(e: MotionEvent): Boolean\n    {\n        return false\n    }\n\n    override fun onScroll(e1: MotionEvent, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean\n    {\n        return false\n    }\n\n    override fun onResize(e: MotionEvent): Boolean\n    {\n        return false\n    }\n\n    override fun show()\n    {\n        super.show()\n        mChoiceEditText.setText(\"\")\n        mChoiceEditText.showKeyboard()\n    }\n\n    override fun onEditTextInputDone(input: String?)\n    {\n        if (input != null && !input.trim { it <= ' ' }.isEmpty())\n        {\n            mSquareChar.text = input\n        }\n\n        mCallback.recalculateKanjiViews()\n        hide()\n    }\n\n    /**\n     * EditWindow does not need to reInit layout as its getDefaultParams() are all relative. Re-initing will cause bugs.\n     */\n    override fun reInit(options: Window.ReinitOptions)\n    {\n        options.reinitViewLayout = false\n        super.reInit(options)\n    }\n\n    fun setInputDoneCallback(callback: IRecalculateKanjiViews)\n    {\n        mCallback = callback\n    }\n\n    fun setInfo(squareChar: ISquareChar)\n    {\n        mSquareChar = squareChar\n        val displayData = squareChar.displayData\n\n        if (displayData is DisplayDataOcr && squareChar is SquareCharOcr)\n        {\n            val pos = squareChar.bitmapPos\n\n            var orig = displayData.bitmap\n            orig = orig.copy(orig.config, true)\n\n            var width = pos[2] - pos[0]\n            var height = pos[3] - pos[1]\n            var xPos = pos[0]\n            var yPos = pos[1]\n\n            Log.d(TAG, \"Initial | Orig: (${orig.width}x${orig.height}) Box: ($xPos, $yPos) (${width}x${height})\")\n\n            width = if (width <= 0) 1 else width\n            height = if (height <= 0) 1 else height\n\n            val wPadding = ((width * 1.5).toInt() - width) / 2\n            val hPadding = ((height * 1.5).toInt() - height) / 2\n\n            xPos -= wPadding\n            yPos -= hPadding\n            width += wPadding * 2\n            height += hPadding * 2\n\n            if (xPos < 0) xPos = 0\n            if (yPos < 0) yPos = 0\n            if (width + xPos > orig.width) width = orig.width - xPos - 1\n            if (height + yPos > orig.height) height = orig.height - yPos - 1\n\n            Log.d(TAG, \"After | Orig: (${orig.width}x${orig.height}) Box: ($xPos, $yPos) (${width}x${height})\")\n\n            for (xTop in xPos until width + xPos)\n            {\n                orig.setPixel(xTop, yPos, Color.RED)\n            }\n            for (xBottom in xPos until width + xPos)\n            {\n                orig.setPixel(xBottom, yPos + height, Color.RED)\n            }\n            for (yLeft in yPos until height + yPos)\n            {\n                orig.setPixel(xPos, yLeft, Color.RED)\n            }\n            for (yRight in yPos until height + yPos)\n            {\n                orig.setPixel(xPos + width, yRight, Color.RED) // TODO: We're crashing here - investigate\n            }\n            orig.setPixel(xPos + width, yPos + height, Color.RED)\n\n            val avgSize = calculateMedianSquareSize(squareChar)\n            val avgWidth = avgSize.x\n            val avgHeight = avgSize.y\n\n            xPos -= avgWidth * 6\n            yPos -= avgHeight * 6\n            width += avgWidth * 12\n            height += avgHeight * 12\n\n            if (xPos < 0) xPos = 0\n            if (yPos < 0) yPos = 0\n            if (width + xPos > orig.width) width = orig.width - xPos\n            if (height + yPos > orig.height) height = orig.height - yPos\n\n            val bitmapChar = Bitmap.createBitmap(orig, xPos, yPos, width, height)\n\n            val iv = window.findViewById<ImageView>(R.id.edit_kanji_image)\n            iv.setImageBitmap(bitmapChar)\n        }\n        else {\n            val iv = window.findViewById<ImageView>(R.id.edit_kanji_image)\n            iv.setBackgroundColor(0x44000000)\n            return\n        }\n    }\n\n    private fun calculateMedianSquareSize(squareChar: SquareCharOcr) : Point\n    {\n        val squareChars = (squareChar.displayData.squareChars as List<SquareCharOcr>).toList()\n        val widths = squareChars.map { it.bitmapPos[2] - it.bitmapPos[0] }.sorted()\n        val heights = squareChars.map { it.bitmapPos[3] - it.bitmapPos[1] }.sorted()\n\n        return Point(widths[widths.size / 2], heights[heights.size / 2])\n    }\n\n    /**\n     * We need to override here because we need cannot have the FLAG_NOT_FOCUSABLE flag set in [Window.getDefaultParams]\n     */\n    override fun getDefaultParams(): WindowManager.LayoutParams\n    {\n        val params = WindowManager.LayoutParams(\n                WindowManager.LayoutParams.MATCH_PARENT,\n                WindowManager.LayoutParams.MATCH_PARENT,\n                if (Build.VERSION.SDK_INT > 25) WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY else WindowManager.LayoutParams.TYPE_PHONE,\n                0,\n                PixelFormat.TRANSLUCENT)\n        params.x = 0\n        params.y = 0\n        return params\n    }\n\n    companion object\n    {\n        val TAG = EditWindow::class.java.name\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Enums/ChoiceType.java",
    "content": "package ca.fuwafuwa.kaku.Windows.Enums;\n\n/**\n * Created by 0xbad1d3a5 on 1/9/2017.\n */\npublic enum ChoiceType {\n    EDIT,\n    DELETE,\n    NONE\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Enums/LayoutPosition.kt",
    "content": "package ca.fuwafuwa.kaku.Windows.Enums\n\nenum class LayoutPosition {\n    TOP,\n    BOTTOM,\n    LEFT,\n    RIGHT\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/HistoryWindow.kt",
    "content": "package ca.fuwafuwa.kaku.Windows\n\nimport android.content.Context\nimport android.graphics.Color\nimport android.opengl.Visibility\nimport android.util.TypedValue\nimport android.view.Gravity\nimport android.view.MotionEvent\nimport android.view.View\nimport android.view.ViewGroup.LayoutParams.*\nimport android.widget.HorizontalScrollView\nimport android.widget.LinearLayout\nimport android.widget.TextView\nimport ca.fuwafuwa.kaku.DB_JMDICT_NAME\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.EntryOptimized\nimport ca.fuwafuwa.kaku.LangUtils\nimport ca.fuwafuwa.kaku.R\nimport ca.fuwafuwa.kaku.Search.JmSearchResult\nimport ca.fuwafuwa.kaku.Windows.Data.ISquareChar\nimport ca.fuwafuwa.kaku.Windows.Enums.LayoutPosition\nimport ca.fuwafuwa.kaku.dpToPx\n\nclass HistoryWindow(context: Context,\n                    windowCoordinator: WindowCoordinator) : Window(context, windowCoordinator, R.layout.window_history)\n{\n    private data class PastKanji(\n            val kanji: String,\n            val results: List<JmSearchResult>)\n    {\n        var timesSeen: Int = 0\n    }\n\n    private val container = window.findViewById<LinearLayout>(R.id.history_window_container)\n    private val childKanji = container.findViewById<LinearLayout>(R.id.history_window_kanji)\n    private val childResults = container.findViewById<LinearLayout>(R.id.history_window_results)\n    private val changeLayoutButton = window.findViewById<TextView>(R.id.history_window_layout_button)\n\n    private val maxShownHistory = 40\n    private val normalHeight = dpToPx(context, 45)\n    private val pastKanjiView = window.findViewById<LinearLayout>(R.id.past_kanji)!!\n    private val pastKanjiScrollView = window.findViewById<HorizontalScrollView>(R.id.past_kanji_scroll_view)!!\n    private val pastDictResults = window.findViewById<TextView>(R.id.history_dict_result)!!\n\n    private var pastKanjis = mutableListOf<PastKanji>()\n    private var isOnTop = true\n\n    init\n    {\n        changeLayoutButton.setOnClickListener {\n            isOnTop = !isOnTop\n            relayoutWindow(if (isOnTop) LayoutPosition.TOP else LayoutPosition.BOTTOM)\n        }\n\n        val tv = createTextView(0)\n        tv.text = \"Lookup History\"\n        pastKanjiView.addView(tv)\n    }\n\n    override fun onTouch(e: MotionEvent?): Boolean\n    {\n        childResults.layoutParams.height = 0\n        childKanji.visibility = View.VISIBLE\n\n        params.height = normalHeight\n        windowManager.updateViewLayout(window, params)\n\n        return true\n    }\n\n    override fun onScroll(e1: MotionEvent?, e2: MotionEvent?, distanceX: Float, distanceY: Float): Boolean\n    {\n        return false\n    }\n\n    override fun onResize(e: MotionEvent?): Boolean\n    {\n        return false\n    }\n\n    override fun show()\n    {\n        params.width = MATCH_PARENT\n        params.height = normalHeight\n        super.show()\n    }\n\n    /**\n     * HistoryWindow does not need to reInit layout as its getDefaultParams() are all relative. Re-initing will cause bugs.\n     */\n    override fun reInit(options: Window.ReinitOptions)\n    {\n        options.reinitViewLayout = false\n        super.reInit(options)\n    }\n\n    fun addResult(squareChar: ISquareChar, results: List<JmSearchResult>)\n    {\n        if (!squareChar.userTouched)\n        {\n            return\n        }\n\n        val word = results.first().entry.kanji\n\n        if (pastKanjis.any { k -> k.kanji == word })\n        {\n            pastKanjis.first { k -> k.kanji == word }.timesSeen++\n        }\n        else\n        {\n            pastKanjis.add(PastKanji(word, results))\n            if (pastKanjiView.childCount < maxShownHistory)\n            {\n                pastKanjiView.addView(createTextView(pastKanjis.size))\n            }\n        }\n\n        recalculateViews()\n    }\n\n    @Synchronized private fun relayoutWindow(pos: LayoutPosition)\n    {\n        params.height = normalHeight\n\n        val marginSize = dpToPx(context, 5)\n\n        container.removeAllViews()\n\n        if (pos == LayoutPosition.TOP)\n        {\n            val childResultsParams = childResults.layoutParams as LinearLayout.LayoutParams\n            childResultsParams.setMargins(marginSize, marginSize, marginSize, 0)\n            childResultsParams.height = 0\n            childResults.layoutParams = childResultsParams\n\n            val childKanjiParams = childKanji.layoutParams as LinearLayout.LayoutParams\n            childKanjiParams.setMargins(marginSize, marginSize, marginSize, 0)\n            childKanji.layoutParams = childKanjiParams\n\n            changeLayoutButton.text = \"▼\"\n\n            container.addView(childKanji)\n            container.addView(childResults)\n            container.gravity = Gravity.TOP\n\n            params.y = 0\n        }\n        else if (pos == LayoutPosition.BOTTOM)\n        {\n            val childResultsParams = childResults.layoutParams as LinearLayout.LayoutParams\n            childResultsParams.setMargins(marginSize, 0, marginSize, marginSize)\n            childResultsParams.height = 0\n            childResults.layoutParams = childResultsParams\n\n            val childKanjiParams = childKanji.layoutParams as LinearLayout.LayoutParams\n            childKanjiParams.setMargins(marginSize, 0, marginSize, marginSize)\n            childKanji.layoutParams = childKanjiParams\n\n            changeLayoutButton.text = \"▲\"\n\n            container.addView(childResults)\n            container.addView(childKanji)\n            container.gravity = Gravity.BOTTOM\n\n            params.y = viewHeight - normalHeight\n        }\n\n        windowManager.updateViewLayout(window, params)\n    }\n\n    private fun recalculateViews()\n    {\n        pastKanjis.sortByDescending { k -> k.timesSeen }\n        pastKanjis = pastKanjis.take(100).toMutableList()\n\n        for (i in 0 until pastKanjis.size)\n        {\n            if (i >= pastKanjiView.childCount)\n            {\n                break\n            }\n            (pastKanjiView.getChildAt(i) as TextView).text = pastKanjis[i].kanji\n        }\n\n        pastKanjiScrollView.scrollTo(0, 0)\n    }\n\n    private fun createTextView(index: Int) : TextView\n    {\n        val tv = TextView(context)\n        val padding = dpToPx(context, 5)\n\n        tv.setTextColor(Color.BLACK)\n        tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15.toFloat())\n\n        if (index == 0)\n        {\n            tv.setPadding(padding * 2, padding, padding, padding)\n        }\n        else if (index == maxShownHistory - 1)\n        {\n            tv.setPadding(padding, padding, padding * 2, padding)\n        }\n        else\n        {\n            tv.setPadding(padding, padding, padding, padding)\n        }\n\n        tv.setOnClickListener { v ->\n            childKanji.visibility = View.GONE\n            childKanji.requestLayout()\n            showEntry(pastKanjiView.indexOfChild(v))\n        }\n\n        return tv\n    }\n\n    private fun showEntry(index: Int)\n    {\n        childResults.layoutParams.height = WRAP_CONTENT\n        params.height = MATCH_PARENT\n        windowManager.updateViewLayout(window, params)\n\n        if (index < pastKanjis.size)\n        {\n            displayResults(pastKanjis[index].results)\n        }\n    }\n\n    private fun displayResults(jmResults: List<JmSearchResult>)\n    {\n        val sb = StringBuilder()\n\n        for ((entry, _) in jmResults)\n        {\n            sb.append(entry.kanji)\n\n            if (!entry.readings.isEmpty())\n            {\n                if (DB_JMDICT_NAME == entry.dictionary)\n                {\n                    sb.append(\" (\")\n                } else\n                {\n                    sb.append(\" \")\n                }\n                sb.append(entry.readings)\n                if (DB_JMDICT_NAME == entry.dictionary) sb.append(\")\")\n            }\n\n            sb.append(\"\\n\")\n            sb.append(getMeaning(entry))\n            sb.append(\"\\n\\n\")\n        }\n\n        if (sb.length > 2)\n        {\n            sb.setLength(sb.length - 2)\n        }\n\n        pastDictResults.setText(sb.toString())\n    }\n\n    private fun getMeaning(entry: EntryOptimized): String\n    {\n        val meanings = entry.meanings.split(\"\\ufffc\".toRegex()).toTypedArray()\n        val pos = entry.pos.split(\"\\ufffc\".toRegex()).toTypedArray()\n\n        val sb = StringBuilder()\n\n        for (i in meanings.indices)\n        {\n            if (i != 0)\n            {\n                sb.append(\" \")\n            }\n            sb.append(LangUtils.ConvertIntToCircledNum(i + 1))\n            sb.append(\" \")\n            if (DB_JMDICT_NAME == entry.dictionary && !pos[i].isEmpty())\n            {\n                sb.append(String.format(\"(%s) \", pos[i]))\n            }\n            sb.append(meanings[i])\n        }\n\n        return sb.toString()\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/InformationWindow.java",
    "content": "package ca.fuwafuwa.kaku.Windows;\n\nimport android.animation.Animator;\nimport android.animation.AnimatorListenerAdapter;\nimport android.content.ClipData;\nimport android.content.ClipboardManager;\nimport android.content.Context;\nimport android.graphics.PixelFormat;\nimport android.os.Build;\nimport android.util.Log;\nimport android.view.GestureDetector;\nimport android.view.Gravity;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewConfiguration;\nimport android.view.WindowManager;\nimport android.widget.LinearLayout;\nimport android.widget.TextSwitcher;\n\nimport org.jetbrains.annotations.NotNull;\n\nimport java.sql.SQLException;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport ca.fuwafuwa.kaku.Constants;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.EntryOptimized;\nimport ca.fuwafuwa.kaku.KakuTools;\nimport ca.fuwafuwa.kaku.LangUtils;\nimport ca.fuwafuwa.kaku.R;\nimport ca.fuwafuwa.kaku.Search.JmSearchResult;\nimport ca.fuwafuwa.kaku.Search.SearchInfo;\nimport ca.fuwafuwa.kaku.Search.Searcher;\nimport ca.fuwafuwa.kaku.Windows.Data.DisplayData;\nimport ca.fuwafuwa.kaku.Windows.Data.ISquareChar;\nimport ca.fuwafuwa.kaku.Windows.Data.SquareChar;\nimport ca.fuwafuwa.kaku.Windows.Interfaces.ICopyText;\nimport ca.fuwafuwa.kaku.Windows.Interfaces.IRecalculateKanjiViews;\nimport ca.fuwafuwa.kaku.Windows.Interfaces.ISearchPerformer;\nimport ca.fuwafuwa.kaku.Windows.Views.KanjiGridView;\n\n/**\n * Created by 0xbad1d3a5 on 4/23/2016.\n */\npublic class InformationWindow extends Window implements Searcher.SearchDictDone, IRecalculateKanjiViews, ISearchPerformer, ICopyText\n{\n\n    private static final String TAG = InformationWindow.class.getName();\n    private static final float FLICK_THRESHOLD = -0.05f;\n\n    private GestureDetector mGestureDetector;\n    private float mMaxFlingVelocity;\n    private LinearLayout mInfoWindow;\n    private KanjiGridView mKanjiGrid;\n    private TextSwitcher mDictResults;\n    private Searcher mSearcher;\n    private boolean mTextOnlyLookup;\n    private ArrayList<ISquareChar> mSearchedChars = new ArrayList<>();\n\n    public InformationWindow(Context context, WindowCoordinator windowCoordinator)\n    {\n        super(context, windowCoordinator, R.layout.window_info);\n\n        mMaxFlingVelocity = ViewConfiguration.get(this.context).getScaledMaximumFlingVelocity();\n        mGestureDetector = new GestureDetector(this.context, this);\n        mInfoWindow = window.findViewById(R.id.info_window);\n        mKanjiGrid = window.findViewById(R.id.kanji_grid);\n        mDictResults = window.findViewById(R.id.dict_results);\n\n        mKanjiGrid.setDependencies(windowCoordinator, this);\n\n        try {\n            mSearcher = new Searcher(context);\n            mSearcher.registerCallback(this);\n        } catch (SQLException e) {\n            e.printStackTrace();\n        }\n\n        show();\n    }\n\n    public void setResult(DisplayData displayData)\n    {\n        mSearchedChars = new ArrayList<>();\n\n        mKanjiGrid.removeAllViews();\n        mKanjiGrid.setText(displayData);\n    }\n\n    public void setResult(String textResult)\n    {\n        List<String> charList = KakuTools.splitTextByChar(textResult);\n        List<ISquareChar> squareCharList = new ArrayList<>();\n        DisplayData displayData = new DisplayData(squareCharList);\n        for (String c : charList) squareCharList.add(new SquareChar(displayData, c));\n        displayData.assignIndicies();\n\n        mKanjiGrid.setText(displayData);\n        performSearch(displayData.getSquareChars().get(0));\n\n        mTextOnlyLookup = true;\n    }\n\n    public void copyText()\n    {\n        ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);\n        ClipData clip = ClipData.newPlainText(null, mKanjiGrid.getText());\n        clipboard.setPrimaryClip(clip);\n\n        hide();\n    }\n\n    @Override\n    public void performSearch(@NotNull ISquareChar squareChar)\n    {\n        Log.d(TAG, squareChar.getChar());\n\n        mKanjiGrid.unhighlightAll(squareChar);\n        mSearcher.search(new SearchInfo(squareChar));\n    }\n\n    /**\n     * InformationWindow does not need to reInit layout as its getDefaultParams() are all relative. Re-initing will cause bugs.\n     */\n    @Override\n    public void reInit(ReinitOptions options)\n    {\n        options.reinitViewLayout = false;\n        super.reInit(options);\n    }\n\n    @Override\n    protected WindowManager.LayoutParams getDefaultParams()\n    {\n        WindowManager.LayoutParams params = new WindowManager.LayoutParams(\n            WindowManager.LayoutParams.MATCH_PARENT,\n            WindowManager.LayoutParams.MATCH_PARENT,\n                Build.VERSION.SDK_INT > 25 ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : WindowManager.LayoutParams.TYPE_PHONE,\n                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,\n            PixelFormat.TRANSLUCENT);\n        params.x = 0;\n        params.y = 0;\n        params.gravity = Gravity.TOP | Gravity.CENTER;\n        params.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING | WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE;\n        return params;\n    }\n\n    @Override\n    public boolean onTouch(MotionEvent e)\n    {\n        mGestureDetector.onTouchEvent(e);\n\n        if (e.getAction() == MotionEvent.ACTION_UP){\n            params.y = 0;\n            windowManager.updateViewLayout(window, params);\n            return true;\n        }\n\n        return false;\n    }\n\n    @Override\n    public void show()\n    {\n        mDictResults.setText(\"\");\n\n        window.setVisibility(View.VISIBLE);\n        params.y = 0; // onScroll changes this value\n        super.show();\n        window.setY(0); // translationY changes this value\n    }\n\n    @Override\n    public void hide()\n    {\n        window.animate().translationY(-getRealDisplaySize().y).setListener(new AnimatorListenerAdapter() {\n            @Override\n            public void onAnimationEnd(Animator animation)\n            {\n                window.setVisibility(View.INVISIBLE);\n\n                if (!mTextOnlyLookup)\n                {\n                    InformationWindow.super.hide();\n                }\n                else\n                {\n                    // hide() may have been called multiple times - this isn't thread-safe but whatever\n                    if (windowCoordinator != null)\n                    {\n                        windowCoordinator.stopAllWindows();\n                    }\n                }\n            }\n        });\n    }\n\n    @Override\n    public void stop()\n    {\n        mSearcher.unregisterCallback();\n        super.stop();\n    }\n\n    @Override\n    public boolean onResize(MotionEvent e)\n    {\n        return false;\n    }\n\n    @Override\n    public boolean onDown(MotionEvent motionEvent)\n    {\n        return true;\n    }\n\n    @Override\n    public boolean onDoubleTap(MotionEvent e)\n    {\n        if (mInfoWindow.getX() < e.getX() && e.getX() < (mInfoWindow.getX() + mInfoWindow.getWidth()) &&\n            mInfoWindow.getY() < e.getY() && e.getY() < (mInfoWindow.getY() + mInfoWindow.getHeight()))\n        {\n            // Do nothing\n        }\n        else\n        {\n            hide();\n        }\n\n        return true;\n    }\n\n    @Override\n    public boolean onSingleTapUp(MotionEvent e)\n    {\n        if (e.getY() < mKanjiGrid.getY() + mKanjiGrid.getHeight())\n        {\n            int triggerAreaSize = getViewWidth() / 8;\n            if (e.getX() > getViewWidth() - triggerAreaSize)\n            {\n                mKanjiGrid.scrollNext();\n            }\n            else if (e.getX() < triggerAreaSize)\n            {\n                mKanjiGrid.scrollPrev();\n            }\n        }\n        else if (mInfoWindow.getX() < e.getX() && e.getX() < (mInfoWindow.getX() + mInfoWindow.getWidth()) &&\n                 mInfoWindow.getY() < e.getY() && e.getY() < (mInfoWindow.getY() + mInfoWindow.getHeight()))\n        {\n            // Do nothing\n        }\n        else\n        {\n            hide();\n        }\n\n        return true;\n    }\n\n    @Override\n    public boolean onScroll(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1)\n    {\n        if (motionEvent == null || motionEvent1 == null){\n            return false;\n        }\n\n        params.y = (int) (motionEvent1.getRawY() - motionEvent.getRawY());\n        if (params.y > 0){\n            params.y = 0;\n        }\n        windowManager.updateViewLayout(window, params);\n\n        return true;\n    }\n\n    @Override\n    public boolean onFling(MotionEvent motionEvent, MotionEvent motionEvent1, float v, float v1)\n    {\n        if (motionEvent == null || motionEvent1 == null){\n            return false;\n        }\n\n        float distanceMoved = motionEvent.getRawY() - motionEvent1.getRawY();\n\n        Log.d(TAG, String.format(\"Fling strength: %f\", v1 / mMaxFlingVelocity));\n        Log.d(TAG, String.format(\"Distance moved: %f\", distanceMoved));\n\n        if ((v1 / mMaxFlingVelocity) < FLICK_THRESHOLD)\n        {\n            hide();\n            return true;\n        }\n\n        return false;\n    }\n\n    @Override\n    public void jmResultsCallback(List<JmSearchResult> results, SearchInfo search)\n    {\n        windowCoordinator.getWindow(Constants.WINDOW_INSTANT_KANJI).hide();\n\n        if (results.size() > 0)\n        {\n            displayResults(results);\n\n            if (search.getSquareChar().getUserTouched() && !mSearchedChars.contains(search.getSquareChar()))\n            {\n                //windowCoordinator.<HistoryWindow>getWindowOfType(Constants.WINDOW_HISTORY).addResult(search.getSquareChar(), results);\n                mSearchedChars.add(search.getSquareChar());\n            }\n        }\n\n        // Highlights words in the window as long as they match\n        int start = search.getIndex() - mKanjiGrid.getOffset();\n        if (results.size() > 0){\n            String kanji = results.get(0).getWord();\n            for (int i = start; i < start + kanji.codePointCount(0, kanji.length()); i++){\n                if (i >= mKanjiGrid.getKanjiViewList().size()){\n                    break;\n                }\n                mKanjiGrid.getKanjiViewList().get(i).highlight();\n            }\n        }\n        else {\n            mKanjiGrid.getKanjiViewList().get(start).highlight();\n        }\n    }\n\n    @Override\n    public void recalculateKanjiViews()\n    {\n        mKanjiGrid.recalculateKanjiViews();\n    }\n\n    private void displayResults(List<JmSearchResult> jmResults)\n    {\n        StringBuilder sb = new StringBuilder();\n\n        for (JmSearchResult jmSearchResult : jmResults)\n        {\n            sb.append(jmSearchResult.getEntry().getKanji());\n\n            if (!jmSearchResult.getEntry().getReadings().isEmpty()){\n                if (Constants.DB_JMDICT_NAME.equals(jmSearchResult.getEntry().getDictionary()))\n                {\n                    sb.append(\" (\");\n                }\n                else {\n                    sb.append(\" \");\n                }\n                sb.append(jmSearchResult.getEntry().getReadings());\n                if (Constants.DB_JMDICT_NAME.equals(jmSearchResult.getEntry().getDictionary())) sb.append(\")\");\n            }\n\n            String deinfReason = jmSearchResult.getDeinfInfo().getReason();\n            if (deinfReason != null && !deinfReason.isEmpty()){\n                sb.append(String.format(\" %s\", deinfReason));\n            }\n\n            sb.append(\"\\n\");\n            sb.append(getMeaning(jmSearchResult.getEntry()));\n            sb.append(\"\\n\\n\");\n        }\n\n        if (sb.length() > 2)\n        {\n            sb.setLength(sb.length() - 2);\n        }\n\n        mDictResults.setText(sb.toString());\n    }\n\n    private String getMeaning(EntryOptimized entry)\n    {\n        String[] meanings = entry.getMeanings().split(\"\\ufffc\", -1);\n        String[] pos = entry.getPos().split(\"\\ufffc\", -1);\n\n        StringBuilder sb = new StringBuilder();\n\n        for (int i = 0; i < meanings.length; i++){\n            if (i != 0){\n                sb.append(\" \");\n            }\n            sb.append(LangUtils.Companion.ConvertIntToCircledNum(i + 1));\n            sb.append(\" \");\n            if (Constants.DB_JMDICT_NAME.equals(entry.getDictionary()) && !pos[i].isEmpty()){\n                sb.append(String.format(\"(%s) \", pos[i]));\n            }\n            sb.append(meanings[i]);\n        }\n\n        return sb.toString();\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/InstantInfoWindow.kt",
    "content": "package ca.fuwafuwa.kaku.Windows\n\nimport android.content.Context\nimport android.graphics.Color\nimport android.util.Log\nimport android.view.MotionEvent\nimport android.view.View.INVISIBLE\nimport android.view.View.VISIBLE\nimport android.widget.FrameLayout\nimport android.widget.LinearLayout\nimport android.widget.TextView\nimport ca.fuwafuwa.kaku.*\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.EntryOptimized\n\nimport ca.fuwafuwa.kaku.Search.JmSearchResult\nimport ca.fuwafuwa.kaku.Search.SearchInfo\nimport ca.fuwafuwa.kaku.Search.Searcher\nimport ca.fuwafuwa.kaku.Windows.Data.DisplayDataOcr\nimport ca.fuwafuwa.kaku.Windows.Data.ISquareChar\nimport ca.fuwafuwa.kaku.Windows.Enums.LayoutPosition\nimport ca.fuwafuwa.kaku.Windows.Interfaces.IRecalculateKanjiViews\nimport ca.fuwafuwa.kaku.Windows.Interfaces.ISearchPerformer\n\nclass InstantInfoWindow(context: Context,\n                        windowCoordinator: WindowCoordinator,\n                        private val instantKanjiWindow: InstantKanjiWindow) : Window(context, windowCoordinator, R.layout.window_instant_info), Searcher.SearchDictDone, IRecalculateKanjiViews, ISearchPerformer\n{\n    private val isBoxHorizontal: Boolean\n        get()\n        {\n            return displayData.boxParams.width > displayData.boxParams.height;\n        }\n\n    private val paddingSize = dpToPx(context, 5)\n\n    private lateinit var layoutPosition: LayoutPosition\n\n    private lateinit var displayData: DisplayDataOcr\n\n    private var searcher: Searcher = Searcher(context)\n\n    private var searchedChars: MutableList<ISquareChar> = mutableListOf()\n\n    private var textInfo = window.findViewById<TextView>(R.id.instant_window_text)\n\n    private var textFrame = window.findViewById<LinearLayout>(R.id.instant_window_text_frame)\n\n    private var updateView = false\n\n    init\n    {\n        searcher.registerCallback(this)\n\n        textFrame.addOnLayoutChangeListener { v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom ->\n            run {\n                if (updateView)\n                {\n                    val width = v.width + dpToPx(context, 10)\n                    val height = v.height + dpToPx(context, 10)\n\n                    if (isBoxHorizontal)\n                    {\n                        calcParamsForHorizontal(width, height)\n                    } else\n                    {\n                        calcParamsForVertical(width, height)\n                    }\n\n                    window.visibility = VISIBLE\n                    windowManager.updateViewLayout(window, params)\n                    updateView = false\n                    Log.d(TAG, \"layoutChanged - InstantInfoWindow\")\n                }\n            }\n        }\n    }\n\n    override fun onDown(e: MotionEvent?): Boolean\n    {\n        instantKanjiWindow.hide()\n        return super.onDown(e)\n    }\n\n    override fun onScroll(e1: MotionEvent?, e2: MotionEvent?, distanceX: Float, distanceY: Float): Boolean\n    {\n        return false\n    }\n\n    override fun onResize(e: MotionEvent?): Boolean\n    {\n        return false\n    }\n\n    override fun show()\n    {\n        synchronized(this)\n        {\n            if (!addedToWindowManager)\n            {\n                textInfo.text = displayData.text\n                textInfo.setTextColor(Color.BLACK)\n\n                if (isBoxHorizontal)\n                {\n                    val topRectHeight = displayData.boxParams.y - statusBarHeight\n                    val bottomRectHeight = realDisplaySize.y - displayData.boxParams.y - displayData.boxParams.height - (realDisplaySize.y - viewHeight - statusBarHeight)\n                    val maxHeight = dpToPx(context, 600)\n                    var height: Int\n\n                    if (topRectHeight > bottomRectHeight){\n                        layoutPosition = LayoutPosition.TOP\n                        height = topRectHeight\n                    }\n                    else {\n                        layoutPosition = LayoutPosition.BOTTOM\n                        height = bottomRectHeight\n                    }\n\n                    height = minOf(height, maxHeight)\n                    calcParamsForHorizontal(dpToPx(context, 400), height)\n                } else\n                {\n                    val leftRectWidth = displayData.boxParams.x\n                    val rightRectWidth = viewWidth - (displayData.boxParams.x + displayData.boxParams.width)\n                    val maxWidth = dpToPx(context, 400)\n                    var width: Int\n\n                    if (leftRectWidth > rightRectWidth)\n                    {\n                        layoutPosition = LayoutPosition.LEFT\n                        width = leftRectWidth\n                    }\n                    else {\n                        layoutPosition = LayoutPosition.RIGHT\n                        width = rightRectWidth\n                    }\n\n                    width = minOf(width, maxWidth)\n                    calcParamsForVertical(width, dpToPx(context, 600))\n                }\n\n                window.visibility = INVISIBLE\n                windowManager.addView(window, params)\n                addedToWindowManager = true\n            }\n        }\n    }\n\n    override fun jmResultsCallback(results: MutableList<JmSearchResult>, search: SearchInfo)\n    {\n        show()\n        updateView = true\n        if (results.size > 0)\n        {\n            if (search.squareChar.userTouched && !searchedChars.contains(search.squareChar))\n            {\n                //windowCoordinator.getWindowOfType<HistoryWindow>(WINDOW_HISTORY).addResult(search.squareChar, results)\n                searchedChars.add(search.squareChar)\n            }\n\n            displayResults(results)\n        }\n        else\n        {\n            textInfo.text = \"No dictionary entry found\"\n        }\n\n        // Highlights words in the window as long as they match\n        val start = search.index - instantKanjiWindow.getKanjiView().offset\n        if (results.size > 0)\n        {\n            val kanji = results[0].word\n            for (i in start until start + kanji.codePointCount(0, kanji.length))\n            {\n                if (i >= instantKanjiWindow.getKanjiView().kanjiViewList.size)\n                {\n                    break\n                }\n                instantKanjiWindow.getKanjiView().kanjiViewList[i].highlight()\n            }\n        } else\n        {\n            instantKanjiWindow.getKanjiView().kanjiViewList[start].highlight()\n        }\n    }\n\n    override fun recalculateKanjiViews()\n    {\n        instantKanjiWindow.recalculateKanjiViews()\n    }\n\n    override fun performSearch(squareChar: ISquareChar)\n    {\n        hide()\n        instantKanjiWindow.getKanjiView().unhighlightAll(squareChar)\n        searcher.search(SearchInfo(squareChar))\n    }\n\n    fun setResult(result: DisplayDataOcr)\n    {\n        displayData = result\n        searchedChars = mutableListOf()\n    }\n\n    private fun changeLayoutForKanjiWindow()\n    {\n        if (instantKanjiWindow.getLayoutPosition() != layoutPosition)\n        {\n            setPadding(paddingSize, paddingSize, paddingSize, paddingSize)\n            return\n        }\n\n        var kanjiWindowSize = if (isBoxHorizontal) instantKanjiWindow.getHeight() else instantKanjiWindow.getWidth()\n\n        when(layoutPosition)\n        {\n            LayoutPosition.TOP ->\n            {\n                kanjiWindowSize -= dpToPx(context, 5)\n                params.y -= kanjiWindowSize\n\n                if (params.y < 0)\n                {\n                    params.height += params.y\n                    params.y = 0\n                }\n\n                setPadding(paddingSize, paddingSize, paddingSize, 0)\n            }\n            LayoutPosition.BOTTOM ->\n            {\n                params.y += kanjiWindowSize\n\n                if (params.y + params.height > viewHeight)\n                {\n                    val overflowHeight = params.y + params.height - viewHeight\n                    params.height -= overflowHeight\n                }\n\n                setPadding(paddingSize, 0, paddingSize, paddingSize)\n            }\n            LayoutPosition.LEFT ->\n            {\n                kanjiWindowSize += dpToPx(context, 5)\n                params.x -= kanjiWindowSize\n\n                if (params.x < 0)\n                {\n                    params.width += params.x\n                    params.x = 0\n                }\n\n                setPadding(paddingSize, paddingSize, 0, paddingSize)\n            }\n            LayoutPosition.RIGHT ->\n            {\n                kanjiWindowSize += dpToPx(context, 5)\n                params.x += kanjiWindowSize\n\n                if (params.x + params.width > realDisplaySize.x)\n                {\n                    val overflowWidth = params.x + params.width - realDisplaySize.x\n                    params.width -= overflowWidth\n                }\n\n                setPadding(0, paddingSize, paddingSize, paddingSize)\n            }\n        }\n    }\n\n    private fun displayResults(jmResults: List<JmSearchResult>)\n    {\n        val sb = StringBuilder()\n\n        for ((entry, deinfInfo) in jmResults)\n        {\n            sb.append(entry.kanji)\n\n            if (!entry.readings.isEmpty())\n            {\n                if (DB_JMDICT_NAME == entry.dictionary)\n                {\n                    sb.append(\" (\")\n                } else\n                {\n                    sb.append(\" \")\n                }\n                sb.append(entry.readings)\n                if (DB_JMDICT_NAME == entry.dictionary) sb.append(\")\")\n            }\n\n            val deinfReason = deinfInfo!!.reason\n            if (deinfReason != null && !deinfReason.isEmpty())\n            {\n                sb.append(String.format(\" %s\", deinfReason))\n            }\n\n            sb.append(\"\\n\")\n            sb.append(getMeaning(entry))\n            sb.append(\"\\n\\n\")\n        }\n\n        if (sb.length > 2)\n        {\n            sb.setLength(sb.length - 2)\n        }\n\n        textInfo.text = sb.toString()\n    }\n\n    private fun getMeaning(entry: EntryOptimized): String\n    {\n        val meanings = entry.meanings.split(\"\\ufffc\".toRegex()).toTypedArray()\n        val pos = entry.pos.split(\"\\ufffc\".toRegex()).toTypedArray()\n\n        val sb = StringBuilder()\n\n        for (i in meanings.indices)\n        {\n            if (i > 2)\n            {\n                sb.append(\" [......]\")\n                break\n            }\n            if (i != 0)\n            {\n                sb.append(\" \")\n            }\n            sb.append(LangUtils.ConvertIntToCircledNum(i + 1))\n            sb.append(\" \")\n            if (DB_JMDICT_NAME == entry.dictionary && !pos[i].isEmpty())\n            {\n                sb.append(String.format(\"(%s) \", pos[i]))\n            }\n            sb.append(meanings[i])\n        }\n\n        return sb.toString()\n    }\n\n    private fun setPadding(l: Int, t: Int, r: Int, b: Int)\n    {\n        val frameLayout = window.findViewById<FrameLayout>(R.id.instant_info_window_layout)\n        frameLayout.setPadding(l, t, r, b)\n    }\n\n    private fun calcParamsForHorizontal(maxWidth: Int, maxHeight: Int)\n    {\n        var xPos = displayData.boxParams.x\n\n        if (xPos + maxWidth > realDisplaySize.x)\n        {\n            xPos = realDisplaySize.x - maxWidth\n        }\n\n        params.width = maxWidth\n\n        if (layoutPosition == LayoutPosition.TOP){\n            params.x = xPos\n            params.y = displayData.boxParams.y - maxHeight - statusBarHeight\n            params.height = maxHeight\n        }\n        else {\n            params.x = xPos\n            params.y = displayData.boxParams.y + displayData.boxParams.height - statusBarHeight\n            params.height = maxHeight\n        }\n\n        changeLayoutForKanjiWindow()\n    }\n\n    private fun calcParamsForVertical(maxWidth: Int, maxHeight: Int)\n    {\n        var yPos = displayData.boxParams.y - statusBarHeight\n\n        if (yPos + maxHeight > realDisplaySize.y){\n            yPos = viewHeight - maxHeight\n        }\n\n        params.height = maxHeight\n\n        if (layoutPosition == LayoutPosition.LEFT)\n        {\n            var xPos = displayData.boxParams.x - maxWidth\n\n            if (xPos < 0)\n            {\n                xPos = 0\n            }\n\n            params.x = xPos\n            params.y = yPos\n            params.width = maxWidth\n        }\n        else {\n            var xPos = displayData.boxParams.x + displayData.boxParams.width\n\n            params.x = xPos\n            params.y = yPos\n            params.width = maxWidth\n        }\n\n        changeLayoutForKanjiWindow()\n    }\n\n    companion object\n    {\n        val TAG = InstantInfoWindow::class.java.name\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/InstantKanjiWindow.kt",
    "content": "package ca.fuwafuwa.kaku.Windows\n\nimport android.content.ClipData\nimport android.content.ClipboardManager\nimport android.content.Context\nimport android.util.Log\nimport android.view.MotionEvent\nimport android.view.View\nimport android.view.View.INVISIBLE\nimport android.widget.LinearLayout\nimport ca.fuwafuwa.kaku.R\nimport ca.fuwafuwa.kaku.Windows.Data.DisplayDataOcr\nimport ca.fuwafuwa.kaku.Windows.Enums.LayoutPosition\nimport ca.fuwafuwa.kaku.Windows.Interfaces.ICopyText\nimport ca.fuwafuwa.kaku.Windows.Interfaces.IRecalculateKanjiViews\nimport ca.fuwafuwa.kaku.Windows.Views.KanjiGridView\nimport ca.fuwafuwa.kaku.dpToPx\n\n\nclass InstantKanjiWindow(context: Context,\n                         windowCoordinator: WindowCoordinator) : Window(context, windowCoordinator, R.layout.window_instant_kanji), IRecalculateKanjiViews, ICopyText\n{\n    private val isBoxHorizontal: Boolean\n        get()\n        {\n            return displayData.boxParams.width > displayData.boxParams.height;\n        }\n\n    private lateinit var displayData: DisplayDataOcr\n\n    private lateinit var layoutPosition: LayoutPosition\n\n    private val kanjiGrid = window.findViewById<View>(R.id.kanji_grid) as KanjiGridView\n\n    private val kanjiFrame = window.findViewById<LinearLayout>(R.id.instant_window_kanji_frame)\n\n    private val instantInfoWindow = InstantInfoWindow(context, windowCoordinator, this)\n\n    private val minHeight = dpToPx(context, 65)\n\n    private val minWidth = dpToPx(context, 65)\n\n    init\n    {\n        kanjiGrid.setDependencies(windowCoordinator, instantInfoWindow)\n\n        kanjiFrame.addOnLayoutChangeListener { v, left, top, right, bottom, oldLeft, oldTop, oldRight, oldBottom ->\n            run {\n                var count = displayData.count + 1\n                if (isBoxHorizontal)\n                {\n                    count = if (count > 8) 8 else count\n                    params.width = dpToPx(context, 37) * count\n                    if (params.height < minHeight)\n                    {\n                        params.height = minHeight\n                    }\n                }\n                else {\n                    count = if (count > 9) 9 else count\n                    params.height = dpToPx(context, 37) * count\n                    if (params.width < minWidth)\n                    {\n                        params.width = minWidth\n                    }\n                }\n\n                when (layoutPosition)\n                {\n                    LayoutPosition.TOP ->\n                    {\n                        params.y = displayData.boxParams.y - (params.height + statusBarHeight)\n                    }\n                    LayoutPosition.BOTTOM ->\n                    {\n                        params.y = displayData.boxParams.y + displayData.boxParams.height - statusBarHeight\n                    }\n                    LayoutPosition.LEFT ->\n                    {\n                        params.x = displayData.boxParams.x - params.width\n                    }\n                    LayoutPosition.RIGHT ->\n                    {\n                        params.x = displayData.boxParams.x + displayData.boxParams.width\n                    }\n                }\n\n                if (isBoxHorizontal)\n                {\n                    calcParamsForHorizontal(params.width)\n                } else\n                {\n                    calcParamsForVertical(params.height)\n                }\n\n                window.visibility = View.VISIBLE\n                windowManager.updateViewLayout(window, params)\n                Log.d(TAG, \"layoutChanged - InstantKanjiWindow\")\n            }\n        }\n    }\n\n    fun getLayoutPosition() : LayoutPosition\n    {\n        return layoutPosition\n    }\n\n    fun getWidth() : Int\n    {\n        return window.width\n    }\n\n    fun getHeight() : Int\n    {\n        return window.height\n    }\n\n    fun setResult(result: DisplayDataOcr)\n    {\n        displayData = result\n        instantInfoWindow.setResult(result)\n        instantInfoWindow.performSearch(displayData.squareChars[0])\n    }\n\n    override fun recalculateKanjiViews()\n    {\n        kanjiGrid.recalculateKanjiViews()\n    }\n\n    override fun copyText()\n    {\n        val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager\n        val clip = ClipData.newPlainText(null, kanjiGrid.getText())\n        clipboard.setPrimaryClip(clip)\n\n        hide()\n    }\n\n    override fun hide()\n    {\n        instantInfoWindow.hide()\n        super.hide()\n    }\n\n    override fun stop()\n    {\n        instantInfoWindow.stop()\n        super.stop()\n    }\n\n    override fun show()\n    {\n        synchronized(this)\n        {\n            if (!addedToWindowManager)\n            {\n                if (isBoxHorizontal)\n                {\n                    kanjiGrid.setRowLimit(1)\n                    calcParamsForHorizontal(dpToPx(context, 300))\n                } else\n                {\n                    kanjiGrid.setRowLimit(2)\n                    calcParamsForVertical(dpToPx(context, 320))\n                }\n\n                kanjiGrid.clearText()\n                kanjiGrid.setText(displayData)\n\n                window.visibility = INVISIBLE\n                windowManager.addView(window, params)\n                addedToWindowManager = true\n            }\n        }\n\n        instantInfoWindow.show()\n    }\n\n    override fun reInit(options: ReinitOptions?)\n    {\n        instantInfoWindow.reInit(options)\n        super.reInit(options)\n    }\n\n    override fun onTouch(e: MotionEvent?): Boolean\n    {\n        return false\n    }\n\n    override fun onScroll(e1: MotionEvent?, e2: MotionEvent?, distanceX: Float, distanceY: Float): Boolean\n    {\n        return false\n    }\n\n    override fun onResize(e: MotionEvent?): Boolean\n    {\n        return false\n    }\n\n    fun getKanjiView() : KanjiGridView\n    {\n        return kanjiGrid\n    }\n\n    private fun calcParamsForHorizontal(maxWidth: Int)\n    {\n        val topRectHeight = displayData.boxParams.y - statusBarHeight\n        val bottomRectHeight = realDisplaySize.y - displayData.boxParams.y - displayData.boxParams.height - (realDisplaySize.y - viewHeight - statusBarHeight)\n\n        var xPos = displayData.boxParams.x\n        var maxWidth = minOf(realDisplaySize.x, maxWidth)\n\n        if (xPos + maxWidth > realDisplaySize.x)\n        {\n            xPos = viewWidth - maxWidth\n        }\n\n        params.width = maxWidth\n\n        val drawOnTop = fun()\n        {\n            params.x = xPos\n            params.y = displayData.boxParams.y - (minHeight + statusBarHeight)\n            params.height = minHeight\n            layoutPosition = LayoutPosition.TOP\n        }\n\n        val drawOnBottom = fun()\n        {\n            params.x = xPos\n            params.y = displayData.boxParams.y + displayData.boxParams.height - statusBarHeight\n            params.height = minHeight\n            layoutPosition = LayoutPosition.BOTTOM\n        }\n\n        if (topRectHeight < bottomRectHeight)\n        {\n            if (topRectHeight > minHeight)\n            {\n                drawOnTop()\n            }\n            else {\n                drawOnBottom()\n            }\n        }\n        else {\n            if (bottomRectHeight > minHeight)\n            {\n                drawOnBottom()\n            }\n            else {\n                drawOnTop()\n            }\n        }\n    }\n\n    private fun calcParamsForVertical(maxHeight: Int)\n    {\n        val leftRectWidth = displayData.boxParams.x\n        val rightRectWidth = viewWidth - (displayData.boxParams.x + displayData.boxParams.width)\n\n        var yPos = displayData.boxParams.y - statusBarHeight\n\n        var maxHeight = minOf(maxHeight, realDisplaySize.y)\n\n        if (yPos + maxHeight > realDisplaySize.y)\n        {\n            yPos = viewHeight - maxHeight\n        }\n\n        params.height = maxHeight\n\n        val drawOnLeftSide = fun()\n        {\n            var xPos = displayData.boxParams.x - minWidth\n\n            if (xPos < 0)\n            {\n                xPos = 0\n            }\n\n            params.x = xPos\n            params.y = yPos\n            params.width = minOf(leftRectWidth, minWidth)\n            layoutPosition = LayoutPosition.LEFT\n        }\n\n        val drawOnRightSide = fun()\n        {\n            var xPos = displayData.boxParams.x + displayData.boxParams.width\n\n            params.x = xPos\n            params.y = yPos\n            params.width = minOf(rightRectWidth, minWidth)\n            layoutPosition = LayoutPosition.RIGHT\n        }\n\n        if (leftRectWidth < rightRectWidth)\n        {\n            if (leftRectWidth > minWidth)\n            {\n                drawOnLeftSide()\n            }\n            else {\n                drawOnRightSide()\n            }\n        }\n        else {\n            if (rightRectWidth > minWidth)\n            {\n                drawOnRightSide()\n            }\n            else {\n                drawOnLeftSide()\n            }\n        }\n    }\n\n    companion object\n    {\n        val TAG = InstantKanjiWindow::class.java.name\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Interfaces/ICopyText.kt",
    "content": "package ca.fuwafuwa.kaku.Windows.Interfaces\n\ninterface ICopyText\n{\n    fun copyText()\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Interfaces/IRecalculateKanjiViews.kt",
    "content": "package ca.fuwafuwa.kaku.Windows.Interfaces\n\ninterface IRecalculateKanjiViews\n{\n    fun recalculateKanjiViews()\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Interfaces/ISearchPerformer.kt",
    "content": "package ca.fuwafuwa.kaku.Windows.Interfaces\n\nimport ca.fuwafuwa.kaku.Windows.Data.DisplayData\nimport ca.fuwafuwa.kaku.Windows.Data.ISquareChar\n\ninterface ISearchPerformer\n{\n    fun performSearch(squareChar: ISquareChar)\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Interfaces/WindowListener.java",
    "content": "package ca.fuwafuwa.kaku.Windows.Interfaces;\n\nimport android.view.GestureDetector;\nimport android.view.MotionEvent;\n\n/**\n * Created by 0xbad1d3a5 on 4/12/2016.\n */\npublic interface WindowListener extends GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {\n    boolean onTouch(MotionEvent e);\n    boolean onResize(MotionEvent e);\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/KanjiChoiceWindow.kt",
    "content": "package ca.fuwafuwa.kaku.Windows\n\nimport android.content.Context\nimport android.graphics.Bitmap\nimport android.graphics.Color\nimport android.graphics.PixelFormat\nimport android.os.Build\nimport android.util.TypedValue\nimport android.view.Gravity\nimport android.view.MotionEvent\nimport android.view.View\nimport android.view.WindowManager\nimport android.widget.ImageView\nimport android.widget.LinearLayout\nimport android.widget.RelativeLayout\nimport android.widget.TextView\nimport androidx.core.content.ContextCompat\nimport ca.fuwafuwa.kaku.LangUtils\nimport ca.fuwafuwa.kaku.Ocr.BoxParams\nimport ca.fuwafuwa.kaku.R\nimport ca.fuwafuwa.kaku.Windows.Data.ISquareChar\nimport ca.fuwafuwa.kaku.Windows.Data.SquareCharOcr\nimport ca.fuwafuwa.kaku.dpToPx\n\nenum class ChoiceResultType\n{\n    EDIT,\n    DELETE,\n    SWAP,\n    NONE\n}\n\nclass KanjiChoiceWindow(context: Context, windowCoordinator: WindowCoordinator) : Window(context, windowCoordinator, R.layout.window_kanji_choice)\n{\n    private val choiceWindow = window.findViewById<RelativeLayout>(R.id.kanji_choice_window)!!\n    private val currentKanjiViews = mutableListOf<View>()\n\n    private lateinit var mKanjiBoxParams : BoxParams\n\n    private var drawnOnTop = false\n\n    /**\n     * KanjiChoiceWindow does not need to reInit layout as its getDefaultParams() are all relative. Re-initing will cause bugs.\n     */\n    override fun reInit(options: Window.ReinitOptions)\n    {\n        options.reinitViewLayout = false\n        super.reInit(options)\n    }\n\n    fun onSquareScrollStart(squareChar: ISquareChar, kanjiBoxParams: BoxParams)\n    {\n        if (squareChar !is SquareCharOcr)\n        {\n            show()\n\n            mKanjiBoxParams = kanjiBoxParams\n            mKanjiBoxParams.y -= statusBarHeight\n\n            return\n        }\n\n        val topRectHeight = kanjiBoxParams.y - statusBarHeight\n        val bottomRectHeight = realDisplaySize.y - kanjiBoxParams.y - kanjiBoxParams.height - (realDisplaySize.y - viewHeight - statusBarHeight)\n\n        if (bottomRectHeight > topRectHeight)\n        {\n            drawnOnTop = false\n            drawOnBottom(squareChar, kanjiBoxParams, calculateBounds(kanjiBoxParams, topRectHeight, bottomRectHeight))\n        }\n        else\n        {\n            drawnOnTop = true\n            drawOnTop(squareChar, kanjiBoxParams, calculateBounds(kanjiBoxParams, topRectHeight, bottomRectHeight))\n        }\n\n        mKanjiBoxParams = kanjiBoxParams\n        mKanjiBoxParams.y -= statusBarHeight\n\n        show()\n    }\n\n    fun onSquareScroll(e: MotionEvent) : Int\n    {\n        var inKanji = false\n\n        for (kanjiView in currentKanjiViews)\n        {\n            val isTextView = kanjiView is TextView\n\n            if (checkForSelection(kanjiView, e) && isTextView)\n            {\n                inKanji = true\n                kanjiView.setBackgroundResource(R.drawable.bg_solid_border_0_blue_black)\n            }\n            else if (isTextView)\n            {\n                kanjiView.setBackgroundResource(R.drawable.bg_solid_border_0_white_black)\n            }\n        }\n\n        return when (getResultTypeForMotionEvent(e, inKanji, drawnOnTop))\n        {\n            ChoiceResultType.EDIT ->\n            {\n                R.drawable.icon_edit\n            }\n            ChoiceResultType.DELETE ->\n            {\n                R.drawable.icon_delete\n            }\n            else ->\n            {\n                R.drawable.icon_swap\n            }\n        }\n    }\n\n    fun onSquareScrollEnd(e: MotionEvent) : Pair<ChoiceResultType, String>\n    {\n        var swappedKanji = \"\"\n\n        for (kanjiView in currentKanjiViews)\n        {\n            if (checkForSelection(kanjiView, e) && kanjiView is TextView)\n            {\n                swappedKanji = kanjiView.text.toString()\n            }\n        }\n\n        removeKanjiViews()\n        hide()\n\n        return Pair(getResultTypeForMotionEvent(e, swappedKanji != \"\", drawnOnTop), swappedKanji)\n    }\n\n    private fun getResultTypeForMotionEvent(e: MotionEvent, inKanji: Boolean, drawnOnTop: Boolean) : ChoiceResultType\n    {\n        if (inKanji)\n        {\n            return ChoiceResultType.SWAP\n        }\n\n        val midpoint = mKanjiBoxParams.x + (mKanjiBoxParams.width / 2)\n        val height = if (drawnOnTop) mKanjiBoxParams.y + mKanjiBoxParams.height + statusBarHeight else mKanjiBoxParams.y + statusBarHeight\n\n        return if (e.rawX < midpoint && heightCheckForResult(e, height, drawnOnTop))\n        {\n            ChoiceResultType.EDIT\n        }\n        else if (e.rawX > midpoint && heightCheckForResult(e, height, drawnOnTop))\n        {\n            ChoiceResultType.DELETE\n        }\n        else\n        {\n            ChoiceResultType.NONE\n        }\n    }\n\n    private fun heightCheckForResult(e: MotionEvent, height: Int, drawnOnTop: Boolean) : Boolean\n    {\n        return if (drawnOnTop) e.rawY > height else e.rawY < height\n    }\n\n    private fun checkForSelection(kanjiView: View, e: MotionEvent): Boolean\n    {\n        var pos = IntArray(2)\n        kanjiView.getLocationOnScreen(pos)\n\n        return pos[0] < e.rawX && e.rawX < pos[0] + kanjiView.width &&\n               pos[1] < e.rawY && e.rawY < pos[1] + kanjiView.height\n    }\n\n    private fun removeKanjiViews()\n    {\n        for (k in currentKanjiViews)\n        {\n            choiceWindow.removeView(k)\n        }\n\n        currentKanjiViews.clear()\n    }\n\n    private fun calculateBounds(kanjiBoxParams: BoxParams, topRectHeight: Int, bottomRectHeight: Int) : BoxParams\n    {\n        val midPoint = kanjiBoxParams.x + (kanjiBoxParams.width / 2)\n        var maxWidth = dpToPx(context, 400)\n        var xPos = 0\n\n        if (realDisplaySize.x > maxWidth)\n        {\n            xPos = midPoint - (maxWidth / 2)\n            if (xPos < 0)\n            {\n                xPos = 0\n            }\n            else if (xPos + maxWidth > realDisplaySize.x)\n            {\n                xPos = realDisplaySize.x - maxWidth\n            }\n        }\n\n        maxWidth = minOf(realDisplaySize.x, maxWidth)\n\n        if (topRectHeight > bottomRectHeight)\n        {\n            return BoxParams(xPos, 0, maxWidth, topRectHeight)\n        }\n        else\n        {\n            return BoxParams(xPos, kanjiBoxParams.y + kanjiBoxParams.height - statusBarHeight, maxWidth, bottomRectHeight)\n        }\n    }\n\n    private fun drawOnBottom(squareChar: SquareCharOcr, kanjiBoxParams: BoxParams, choiceParams: BoxParams)\n    {\n        val kanjiHeight = kanjiBoxParams.height * 2\n        val kanjiWidth = kanjiBoxParams.width * 2\n\n        val outerPadding = dpToPx(context, 10)\n        val startHeight = choiceParams.y + outerPadding\n\n        val drawableWidth = choiceParams.width - outerPadding\n        val minPadding = dpToPx(context, 5)\n        val numColumns = minOf(calculateNumColumns(drawableWidth, kanjiWidth, minPadding), squareChar.allChoices.size + 1)\n        val outerSpacing = (choiceParams.width - (kanjiWidth + minPadding * 2) * numColumns) / 2\n        val innerSpacing = minPadding\n\n        var currColumn = 0\n        var currWidth = choiceParams.x + outerSpacing + innerSpacing\n        var currHeight = startHeight\n\n        drawKanjiImage(squareChar, currWidth, currHeight, kanjiWidth, kanjiHeight)\n        currWidth += kanjiWidth + innerSpacing\n        currColumn++\n\n        for (choice in squareChar.allChoices)\n        {\n            if (currColumn >= numColumns)\n            {\n                currHeight += kanjiHeight + innerSpacing\n                currWidth = choiceParams.x + outerSpacing + innerSpacing\n                currColumn = 0\n            }\n\n            drawKanjiText(choice.first, currWidth, currHeight, kanjiWidth, kanjiHeight)\n            currWidth += kanjiWidth + innerSpacing\n            currColumn++\n        }\n    }\n\n    private fun drawOnTop(squareChar: SquareCharOcr, kanjiBoxParams: BoxParams, choiceParams: BoxParams)\n    {\n        val kanjiHeight = kanjiBoxParams.height * 2\n        val kanjiWidth = kanjiBoxParams.width * 2\n\n        val outerPadding = dpToPx(context, 10)\n        val startHeight = kanjiBoxParams.y - statusBarHeight - kanjiHeight - outerPadding\n\n        val drawableWidth = choiceParams.width - outerPadding\n        val minPadding = dpToPx(context, 5)\n        val numColumns = minOf(calculateNumColumns(drawableWidth, kanjiWidth, minPadding), squareChar.allChoices.size + 1)\n        val outerSpacing = (choiceParams.width - (kanjiWidth + minPadding * 2) * numColumns) / 2\n        val innerSpacing = minPadding\n\n        var currColumn = 0\n        var currWidth = choiceParams.x + outerSpacing + innerSpacing\n        var currHeight = startHeight\n\n        drawKanjiImage(squareChar, currWidth, currHeight, kanjiWidth, kanjiHeight)\n        currWidth += kanjiWidth + innerSpacing\n        currColumn++\n\n        for (choice in squareChar.allChoices)\n        {\n            if (currColumn >= numColumns)\n            {\n                currHeight -= kanjiHeight + innerSpacing\n                currWidth = choiceParams.x + outerSpacing + innerSpacing\n                currColumn = 0\n            }\n\n            drawKanjiText(choice.first, currWidth, currHeight, kanjiWidth, kanjiHeight)\n            currWidth += kanjiWidth + innerSpacing\n            currColumn++\n        }\n    }\n\n    private fun drawKanjiText(kanji: String, x: Int, y: Int, kanjiWidth: Int, kanjiHeight: Int)\n    {\n        val tv = TextView(context)\n        tv.text = kanji\n        tv.gravity = Gravity.CENTER\n        tv.setTextSize(TypedValue.COMPLEX_UNIT_PX, (kanjiWidth / 1.5).toFloat())\n\n        when\n        {\n            LangUtils.IsHiragana(kanji[0]) -> tv.setTextColor(ContextCompat.getColor(context, R.color.kana_pink))\n            LangUtils.IsKatakana(kanji[0]) -> tv.setTextColor(ContextCompat.getColor(context, R.color.kana_blue))\n            LangUtils.IsKanji(kanji[0]) -> tv.setTextColor(Color.BLACK)\n            else -> tv.setTextColor(Color.GRAY)\n        }\n\n        tv.setBackgroundResource(R.drawable.bg_solid_border_0_white_black)\n        tv.width = kanjiWidth\n        tv.height = kanjiHeight\n        tv.x = x.toFloat()\n        tv.y = y.toFloat()\n        choiceWindow.addView(tv)\n        currentKanjiViews.add(tv)\n    }\n\n    private fun drawKanjiImage(squareChar: SquareCharOcr, x: Int, y: Int, kanjiWidth: Int, kanjiHeight: Int)\n    {\n        // Image nonsense\n        val pos = squareChar.bitmapPos\n        val dp10 = dpToPx(context, 10)\n        val orig = squareChar.displayData.bitmap\n        var width = pos[2] - pos[0]\n        var height = pos[3] - pos[1]\n        width = if (width <= 0) 1 else width\n        height = if (height <= 0) 1 else height\n        val bitmapChar = Bitmap.createBitmap(orig, pos[0], pos[1], width, height)\n        val charImage = ImageView(context)\n        charImage.setPadding(dp10, dp10, dp10, dp10)\n        charImage.layoutParams = LinearLayout.LayoutParams(kanjiWidth, kanjiHeight)\n        charImage.x = x.toFloat()\n        charImage.y = y.toFloat()\n        charImage.scaleType = ImageView.ScaleType.FIT_CENTER\n        charImage.cropToPadding = true\n        charImage.setImageBitmap(bitmapChar)\n        charImage.background = context.getDrawable(R.drawable.bg_translucent_border_0_black_black)\n        choiceWindow.addView(charImage)\n        currentKanjiViews.add(charImage)\n    }\n\n    private fun calculateNumColumns(drawableWidth: Int, columnWidth: Int, minPadding: Int) : Int\n    {\n        var count = 0\n        var width = 0\n        val columnAndPadding = columnWidth + (minPadding * 2)\n\n        while ((width + columnAndPadding) < drawableWidth)\n        {\n            width += columnAndPadding\n            count++\n        }\n\n        return count\n    }\n\n\n    override fun onTouch(e: MotionEvent): Boolean\n    {\n        return false\n    }\n\n    override fun onScroll(e1: MotionEvent, e2: MotionEvent, distanceX: Float, distanceY: Float): Boolean\n    {\n        return false\n    }\n\n    override fun onResize(e: MotionEvent): Boolean\n    {\n        return false\n    }\n\n    override fun getDefaultParams(): WindowManager.LayoutParams\n    {\n        val params = WindowManager.LayoutParams(\n                WindowManager.LayoutParams.MATCH_PARENT,\n                WindowManager.LayoutParams.MATCH_PARENT,\n                if (Build.VERSION.SDK_INT > 25) WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY else WindowManager.LayoutParams.TYPE_PHONE,\n                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,\n                PixelFormat.TRANSLUCENT)\n        params.x = 0\n        params.y = 0\n        return params\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/ChoiceEditText.java",
    "content": "package ca.fuwafuwa.kaku.Windows.Views;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.provider.Settings;\nimport android.util.AttributeSet;\nimport android.view.KeyEvent;\nimport android.view.inputmethod.EditorInfo;\nimport android.view.inputmethod.InputMethodManager;\nimport android.widget.EditText;\n\n/**\n * Created by 0xbad1d3a5 on 1/10/2017.\n */\n\n@SuppressLint(\"AppCompatCustomView\")\npublic class ChoiceEditText extends EditText\n{\n    public interface InputDoneListener\n    {\n        void onEditTextInputDone(String input);\n    }\n\n    private static final String TAG = ChoiceEditText.class.getName();\n\n    private InputMethodManager mImeManager;\n    private InputDoneListener mCallback;\n\n    public ChoiceEditText(Context context)\n    {\n        super(context);\n        Init(context);\n    }\n\n    public ChoiceEditText(Context context, AttributeSet attrs)\n    {\n        super(context, attrs);\n        Init(context);\n    }\n\n    public ChoiceEditText(Context context, AttributeSet attrs, int defStyleAttr)\n    {\n        super(context, attrs, defStyleAttr);\n        Init(context);\n    }\n\n    public ChoiceEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)\n    {\n        super(context, attrs, defStyleAttr, defStyleRes);\n        Init(context);\n    }\n\n    private void Init(Context context)\n    {\n        mImeManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);\n        showKeyboard();\n    }\n\n    public void showKeyboard()\n    {\n        post(new Runnable() {\n            @Override\n            public void run() {\n                requestFocus();\n                mImeManager.showSoftInput(ChoiceEditText.this, InputMethodManager.SHOW_FORCED);\n            }\n        });\n    }\n\n    public void setInputDoneCallback(InputDoneListener callback)\n    {\n        mCallback = callback;\n    }\n\n    @Override\n    public void onEditorAction(int actionCode)\n    {\n        if (actionCode == EditorInfo.IME_ACTION_DONE){\n            if (mCallback != null){\n                mImeManager.hideSoftInputFromWindow(getWindowToken(), 0);\n                mCallback.onEditTextInputDone(getText().toString());\n            }\n        }\n        super.onEditorAction(actionCode);\n    }\n\n    @Override\n    public boolean onKeyPreIme(int keyCode, KeyEvent event)\n    {\n        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK){\n            if (mCallback != null){\n                mImeManager.hideSoftInputFromWindow(getWindowToken(), 0);\n                mCallback.onEditTextInputDone(getText().toString());\n            }\n        }\n        return super.onKeyPreIme(keyCode, event);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/ChoiceGridView.java",
    "content": "package ca.fuwafuwa.kaku.Windows.Views;\n\nimport android.content.Context;\nimport android.graphics.Bitmap;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\nimport android.widget.ImageView;\nimport android.widget.TextView;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport ca.fuwafuwa.kaku.KakuTools;\nimport ca.fuwafuwa.kaku.R;\nimport ca.fuwafuwa.kaku.Windows.Data.SquareCharOcr;\nimport kotlin.Pair;\n\n/**\n * Created by 0xbad1d3a5 on 5/5/2016.\n */\npublic class ChoiceGridView extends SquareGridView {\n\n    private static final String TAG = ChoiceGridView.class.getName();\n\n    private Context mContext;\n    private List<TextView> mKanjiChoices;\n\n    public ChoiceGridView(Context context) {\n        super(context);\n        Init(context);\n    }\n\n    public ChoiceGridView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        Init(context);\n    }\n\n    public ChoiceGridView(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        Init(context);\n    }\n\n    public ChoiceGridView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {\n        super(context, attrs, defStyleAttr, defStyleRes);\n        Init(context);\n    }\n\n    private void Init(Context context){\n        mContext = context;\n        setCellSize(100);\n    }\n\n    public void onKanjiViewScrollStart(SquareCharOcr squareChar, MotionEvent e)\n    {\n        mKanjiChoices = new ArrayList<>();\n        setItemCount(squareChar.getAllChoices().size() + 1);\n\n        int[] pos = squareChar.getBitmapPos();\n        if (pos != null){\n            int dp10 = KakuTools.dpToPx(mContext, 10);\n            Bitmap orig = squareChar.getDisplayData().getBitmap();\n            int width = pos[2] - pos[0];\n            int height = pos[3] - pos[1];\n            width = width <= 0 ? 1 : width;\n            height = height <= 0 ? 1 : height;\n            Bitmap bitmapChar = Bitmap.createBitmap(orig, pos[0], pos[1], width, height);\n            KanjiImageView charImage = new KanjiImageView(mContext);\n\n            charImage.setSize(90);\n            charImage.setPadding(dp10, dp10, dp10, dp10);\n            charImage.setScaleType(ImageView.ScaleType.FIT_CENTER);\n            charImage.setCropToPadding(true);\n            charImage.setImageBitmap(bitmapChar);\n            charImage.setBackground(R.drawable.bg_translucent_border_0_black_black);\n            addView(charImage);\n        }\n\n        for (Pair<String, Double> choice : squareChar.getAllChoices()){\n            TextView kanjiText = new TextView(mContext);\n            kanjiText.setWidth(KakuTools.dpToPx(mContext, 90));\n            kanjiText.setTextSize(60);\n            kanjiText.setText(choice.getFirst());\n            kanjiText.setBackgroundResource(R.drawable.bg_solid_border_0_white_black);\n            addView(kanjiText);\n\n            mKanjiChoices.add(kanjiText);\n        }\n\n        setY(e.getRawY());\n    }\n\n    public void onKanjiViewScroll(MotionEvent e1, MotionEvent e2)\n    {\n        if (mKanjiChoices == null){\n            return;\n        }\n\n        for (TextView k : mKanjiChoices){\n            if (checkForSelection(k, e2)){\n                k.setBackgroundResource(R.drawable.bg_solid_border_0_blue_black);\n            }\n            else {\n                k.setBackgroundResource(R.drawable.bg_solid_border_0_white_black);\n            }\n        }\n    }\n\n    public void onKanjiViewScrollEnd(SquareCharOcr squareChar, MotionEvent e){\n\n        if (mKanjiChoices == null){\n            return;\n        }\n\n        for (TextView k : mKanjiChoices){\n            if (checkForSelection(k, e)){\n                squareChar.setChar(k.getText().toString());\n            }\n        }\n\n        removeAllViews();\n        mKanjiChoices = null;\n    }\n\n    private boolean checkForSelection(TextView kanjiView, MotionEvent e){\n\n        int[] pos = new int[2];\n        kanjiView.getLocationInWindow(pos);\n\n        if (pos[0] < e.getRawX() && e.getRawX() < pos[0] + kanjiView.getWidth() &&\n            pos[1] < e.getRawY() && e.getRawY() < pos[1] + kanjiView.getHeight()){\n            return true;\n        }\n        else {\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/ChoiceIconView.java",
    "content": "package ca.fuwafuwa.kaku.Windows.Views;\n\nimport android.annotation.SuppressLint;\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.widget.ImageView;\nimport android.widget.RelativeLayout;\n\nimport ca.fuwafuwa.kaku.KakuTools;\nimport ca.fuwafuwa.kaku.R;\nimport ca.fuwafuwa.kaku.Windows.Enums.ChoiceType;\n\n/**\n * Created by 0xbad1d3a5 on 1/9/2017.\n */\n\n@SuppressLint(\"AppCompatCustomView\")\npublic class ChoiceIconView extends ImageView {\n\n    private Context mContext;\n    private int mStatusBarHeight;\n\n    public ChoiceIconView(Context context) {\n        super(context);\n        Init(context);\n    }\n\n    public ChoiceIconView(Context context, AttributeSet attrs) {\n        super(context, attrs);\n        Init(context);\n    }\n\n    public ChoiceIconView(Context context, AttributeSet attrs, int defStyleAttr) {\n        super(context, attrs, defStyleAttr);\n        Init(context);\n    }\n\n    public ChoiceIconView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {\n        super(context, attrs, defStyleAttr, defStyleRes);\n        Init(context);\n    }\n\n    private void Init(Context context){\n        setLayoutParams(new RelativeLayout.LayoutParams(KakuTools.dpToPx(context, 35), KakuTools.dpToPx(context, 35)));\n    }\n\n    public void onKanjiViewScrollStart(int statusBarHeight, KanjiCharacterView kanjiView, MotionEvent e)\n    {\n        mStatusBarHeight = statusBarHeight;\n        setVisibility(View.VISIBLE);\n    }\n\n    public void onKanjiViewScroll(MotionEvent e1, MotionEvent e2)\n    {\n        switch (getChoiceType(e2)){\n            case EDIT:\n                setImageResource(R.drawable.icon_edit);\n                break;\n            case DELETE:\n                setImageResource(R.drawable.icon_delete);\n                break;\n            case NONE:\n                setImageResource(R.drawable.icon_swap);\n                break;\n        }\n    }\n\n    public ChoiceType onKanjiViewScrollEnd(MotionEvent e){\n\n        setVisibility(INVISIBLE);\n        return getChoiceType(e);\n    }\n\n    private ChoiceType getChoiceType(MotionEvent e){\n\n        int[] pos = new int[2];\n        getLocationInWindow(pos);\n\n        if (e.getRawY() < pos[1] + mStatusBarHeight){\n            int mid =  pos[0] + getWidth() / 2;\n            if (e.getRawX() < mid){\n                return ChoiceType.EDIT;\n            }\n            else {\n                return ChoiceType.DELETE;\n            }\n        }\n\n        return ChoiceType.NONE;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/KanjiCharacterView.kt",
    "content": "package ca.fuwafuwa.kaku.Windows.Views\n\nimport android.content.Context\nimport android.graphics.Color\nimport android.util.AttributeSet\nimport android.util.Log\nimport android.util.TypedValue\nimport android.view.GestureDetector\nimport android.view.Gravity\nimport android.view.MotionEvent\nimport android.view.View\nimport android.widget.FrameLayout\nimport android.widget.ImageView\nimport android.widget.TextView\nimport ca.fuwafuwa.kaku.*\nimport ca.fuwafuwa.kaku.Ocr.BoxParams\nimport ca.fuwafuwa.kaku.Windows.*\nimport ca.fuwafuwa.kaku.Windows.Data.DisplayDataOcr\nimport ca.fuwafuwa.kaku.Windows.Data.ISquareChar\nimport ca.fuwafuwa.kaku.Windows.Interfaces.ICopyText\nimport ca.fuwafuwa.kaku.Windows.Interfaces.IRecalculateKanjiViews\nimport ca.fuwafuwa.kaku.Windows.Interfaces.ISearchPerformer\n\n/**\n * Created by 0xbad1d3a5 on 5/5/2016.\n */\nclass KanjiCharacterView : FrameLayout, GestureDetector.OnGestureListener, IRecalculateKanjiViews\n{\n    private lateinit var mContext: Context\n    private lateinit var mGestureDetector: GestureDetector\n    private lateinit var mWindowCoordinator: WindowCoordinator\n    private lateinit var mSearchPerformer: ISearchPerformer\n    private lateinit var mKanjiChoiceWindow: KanjiChoiceWindow\n    private lateinit var mEditWindow: EditWindow\n    private lateinit var mSquareChar: ISquareChar\n\n    private lateinit var mKanjiTextView: TextView\n    private lateinit var mIconImageView: ImageView\n\n    private var mCellSizePx: Int = 0\n    private var mScrollStartEvent: MotionEvent? = null\n\n    constructor(context: Context) : super(context)\n    {\n        Init(context)\n    }\n\n    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)\n    {\n        Init(context)\n    }\n\n    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)\n    {\n        Init(context)\n    }\n\n    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)\n    {\n        Init(context)\n    }\n\n    private fun Init(context: Context)\n    {\n        mContext = context\n        mGestureDetector = GestureDetector(mContext, this)\n\n        mKanjiTextView = TextView(mContext)\n        mKanjiTextView.gravity = Gravity.CENTER\n        mKanjiTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 20.toFloat())\n        mKanjiTextView.setTextColor(Color.BLACK)\n        addView(mKanjiTextView)\n\n        mIconImageView = ImageView(mContext)\n        mIconImageView.visibility = INVISIBLE\n        addView(mIconImageView)\n    }\n\n    fun getSquareChar(): ISquareChar\n    {\n        return mSquareChar\n    }\n\n    fun setDependencies(windowCoordinator: WindowCoordinator, searchPerformer: ISearchPerformer)\n    {\n        mWindowCoordinator = windowCoordinator\n        mSearchPerformer = searchPerformer\n\n        mKanjiChoiceWindow = mWindowCoordinator.getWindowOfType(WINDOW_KANJI_CHOICE)\n        mEditWindow = mWindowCoordinator.getWindowOfType(WINDOW_EDIT)\n    }\n\n    fun setText(squareChar: ISquareChar)\n    {\n        mSquareChar = squareChar\n        mKanjiTextView.text = squareChar.char\n    }\n\n    fun setCellSize(px: Int)\n    {\n        mCellSizePx = dpToPx(context, pxToDp(context, px) - 2)\n    }\n\n    fun highlight()\n    {\n        background = mContext.getDrawable(R.drawable.bg_translucent_border_0_blue_blue)\n    }\n\n    fun highlightLight()\n    {\n        background = mContext.getDrawable(R.drawable.bg_transparent_border_0_nil_default)\n    }\n\n    fun unhighlight()\n    {\n        background = null\n    }\n\n    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int)\n    {\n        val cellWidthSpec = View.MeasureSpec.makeMeasureSpec(mCellSizePx, View.MeasureSpec.EXACTLY)\n        val cellHeightSpec = View.MeasureSpec.makeMeasureSpec(mCellSizePx, View.MeasureSpec.EXACTLY)\n\n        for (i in 0 until childCount)\n        {\n            getChildAt(i).measure(cellWidthSpec, cellHeightSpec)\n        }\n\n        setMeasuredDimension(mCellSizePx, mCellSizePx)\n    }\n\n    override fun onTouchEvent(e: MotionEvent): Boolean\n    {\n        mGestureDetector.onTouchEvent(e)\n\n        if (e.action == MotionEvent.ACTION_UP)\n        {\n            visibility = View.VISIBLE\n\n            if (mScrollStartEvent != null)\n            {\n                mScrollStartEvent = null\n\n                mKanjiTextView.visibility = View.VISIBLE\n                mIconImageView.visibility = View.INVISIBLE\n\n                val choiceResult = mKanjiChoiceWindow.onSquareScrollEnd(e)\n                when (choiceResult.first)\n                {\n                    ChoiceResultType.SWAP ->\n                    {\n                        mKanjiTextView.text = choiceResult.second\n                        mSquareChar.text = choiceResult.second\n                        recalculateKanjiViews()\n                    }\n                    ChoiceResultType.EDIT ->\n                    {\n                        val window = getProperWindow<Window>()\n                        if (mSquareChar.displayData is DisplayDataOcr)\n                        {\n                            window.hide()\n                        }\n\n                        mEditWindow.setInfo(mSquareChar)\n                        mEditWindow.setInputDoneCallback(this)\n                        mEditWindow.show()\n                    }\n                    ChoiceResultType.DELETE ->\n                    {\n                        mSquareChar.text = \"\"\n                        recalculateKanjiViews()\n                    }\n                    ChoiceResultType.NONE ->\n                    {\n                        // Do nothing\n                    }\n                }\n            }\n        }\n\n        return true\n    }\n\n    override fun recalculateKanjiViews()\n    {\n        val cwindow = getProperWindow<IRecalculateKanjiViews>()\n        cwindow.recalculateKanjiViews()\n\n        val window = getProperWindow<Window>()\n        window.show()\n    }\n\n    override fun onSingleTapUp(e: MotionEvent): Boolean\n    {\n        highlightLight()\n        mSquareChar.userTouched = true\n        mSearchPerformer.performSearch(mSquareChar)\n        return true\n    }\n\n    override fun onScroll(motionEvent: MotionEvent, motionEvent1: MotionEvent, v: Float, v1: Float): Boolean\n    {\n        // scroll event start\n        if (mScrollStartEvent == null)\n        {\n            Log.d(TAG, \"ScrollStart\")\n            mScrollStartEvent = motionEvent\n\n            unhighlight()\n            mKanjiTextView.visibility = View.INVISIBLE\n            mIconImageView.visibility = View.VISIBLE\n            mIconImageView.setImageResource(R.drawable.icon_swap)\n\n            mKanjiChoiceWindow.onSquareScrollStart(mSquareChar, getKanjiBoxParams())\n        }\n        // scroll event continuing\n        else {\n            Log.d(TAG, \"ScrollContinue\")\n            mIconImageView.setImageResource(mKanjiChoiceWindow.onSquareScroll(motionEvent1))\n        }\n\n        return true\n    }\n\n    override fun onDown(motionEvent: MotionEvent): Boolean\n    {\n        return false\n    }\n\n    override fun onFling(motionEvent: MotionEvent, motionEvent1: MotionEvent, v: Float, v1: Float): Boolean\n    {\n        return false\n    }\n\n    override fun onLongPress(motionEvent: MotionEvent)\n    {\n        val window = getProperWindow<ICopyText>()\n        window.copyText()\n    }\n\n    override fun onShowPress(e: MotionEvent?)\n    {\n    }\n\n    private fun <WindowType> getProperWindow() : WindowType\n    {\n        return if (mSquareChar.displayData.instantMode)\n        {\n            mWindowCoordinator.getWindowOfType(WINDOW_INSTANT_KANJI)\n        }\n        else {\n            mWindowCoordinator.getWindowOfType(WINDOW_INFO)\n        }\n    }\n\n    private fun getKanjiBoxParams() : BoxParams\n    {\n        var pos = IntArray(2)\n        getLocationOnScreen(pos)\n        return BoxParams(pos[0], pos[1], width, height)\n    }\n\n    companion object\n    {\n        private val TAG = KanjiCharacterView::class.java.name\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/KanjiGridView.kt",
    "content": "package ca.fuwafuwa.kaku.Windows.Views\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport ca.fuwafuwa.kaku.Windows.Data.DisplayData\nimport ca.fuwafuwa.kaku.Windows.Data.ISquareChar\nimport ca.fuwafuwa.kaku.Windows.Interfaces.IRecalculateKanjiViews\nimport ca.fuwafuwa.kaku.Windows.Interfaces.ISearchPerformer\nimport ca.fuwafuwa.kaku.Windows.WindowCoordinator\nimport java.util.*\n\n\n/**\n * Created by 0xbad1d3a5 on 5/5/2016.\n */\nclass KanjiGridView : SquareGridView, IRecalculateKanjiViews\n{\n    private lateinit var mWindowCoordinator: WindowCoordinator\n    private lateinit var mSearchPerformer: ISearchPerformer\n    private lateinit var mDisplayData: DisplayData\n\n    private var mScrollValue: Int = 0\n\n    private val mKanjiCellSize = squareCellSize\n\n    var offset: Int = 0\n        private set\n\n    val kanjiViewList: List<KanjiCharacterView>\n        get()\n        {\n            val count = childCount\n            val kanjiViewList = ArrayList<KanjiCharacterView>()\n\n            for (i in 0 until count)\n            {\n                kanjiViewList.add(getChildAt(i) as KanjiCharacterView)\n            }\n\n            return kanjiViewList\n        }\n\n    constructor(context: Context) : super(context)\n    {\n    }\n\n    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)\n    {\n    }\n\n    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)\n    {\n    }\n\n    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)\n    {\n    }\n\n    fun setDependencies(windowCoordinator: WindowCoordinator, searchPerformer: ISearchPerformer)\n    {\n        mWindowCoordinator = windowCoordinator\n        mSearchPerformer = searchPerformer\n    }\n\n    fun setText(displayData: DisplayData)\n    {\n        mDisplayData = displayData\n        offset = 0\n\n        ensureViews()\n    }\n\n    fun getText() : String\n    {\n        return mDisplayData.text\n    }\n\n    fun clearText()\n    {\n        removeAllViews()\n        postInvalidate()\n    }\n\n    fun unhighlightAll(squareCharToExclude: ISquareChar)\n    {\n        for (k in kanjiViewList)\n        {\n            if (k.getSquareChar() !== squareCharToExclude) k.unhighlight()\n        }\n    }\n\n    fun unhighlightAll()\n    {\n        for (k in kanjiViewList)\n        {\n            k.unhighlight()\n        }\n    }\n\n    fun scrollNext()\n    {\n        if (offset + maxSquares < mDisplayData.count)\n        {\n            offset += maxSquares\n            mScrollValue = maxSquares\n        }\n\n        ensureViews()\n    }\n\n    fun scrollPrev()\n    {\n        if (offset - mScrollValue >= 0)\n        {\n            offset -= mScrollValue\n        }\n        else\n        {\n            offset = 0\n        }\n\n        ensureViews()\n    }\n\n    override fun recalculateKanjiViews()\n    {\n        mDisplayData.recomputeChars()\n\n        ensureViews()\n    }\n\n    private fun ensureViews()\n    {\n        val kanjiViews = kanjiViewList\n        val numChars = mDisplayData.count - offset\n        val kanjiViewSize = kanjiViews.size\n\n        if (numChars > kanjiViewSize)\n        {\n            addKanjiViews(numChars - kanjiViewSize)\n        } else if (numChars < kanjiViewSize)\n        {\n            removeKanjiViews(kanjiViewSize - numChars)\n        }\n\n        for ((index, squareChar) in mDisplayData.squareChars.subList(offset, mDisplayData.count).withIndex())\n        {\n            val kanjiView = getChildAt(index) as KanjiCharacterView\n            kanjiView.setText(squareChar)\n        }\n\n        setItemCount(numChars)\n        unhighlightAll()\n        postInvalidate()\n    }\n\n    private fun addKanjiViews(count: Int)\n    {\n        for (i in 0 until count)\n        {\n            val kanjiView = KanjiCharacterView(context)\n            kanjiView.setDependencies(mWindowCoordinator, mSearchPerformer)\n            kanjiView.setCellSize(mKanjiCellSize)\n\n            addView(kanjiView)\n        }\n    }\n\n    private fun removeKanjiViews(count: Int)\n    {\n        val childCount = childCount\n        for (i in childCount downTo childCount - count + 1)\n        {\n            removeViewAt(i - 1)\n        }\n    }\n\n    companion object\n    {\n        private val TAG = KanjiGridView::class.java.name\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/KanjiImageView.kt",
    "content": "package ca.fuwafuwa.kaku.Windows.Views\n\nimport android.content.Context\nimport android.graphics.drawable.Drawable\nimport android.util.AttributeSet\nimport android.util.Log\nimport android.widget.ImageView\n\nimport ca.fuwafuwa.kaku.*\n\n/**\n * Created by 0xbad1d3a5 on 1/11/2017.\n */\n\nclass KanjiImageView : ImageView\n{\n    private var mSizePx: Int = 0\n\n    constructor(context: Context) : super(context)\n    {\n    }\n\n    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)\n    {\n    }\n\n    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)\n    {\n    }\n\n    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)\n    {\n    }\n\n    fun setSize(dp: Int)\n    {\n        mSizePx = dpToPx(context, dp)\n        Log.d(TAG, String.format(\"setSize: X: %d Y: %d\", width, height))\n    }\n\n    fun setBackground(id: Int)\n    {\n        val bg = context.getDrawable(id)\n        background = bg\n    }\n\n    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int)\n    {\n        Log.d(TAG, String.format(\"mSizePx: %d\", mSizePx))\n        setMeasuredDimension(mSizePx, mSizePx)\n    }\n\n    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int)\n    {\n        super.onLayout(changed, left, top, right, bottom)\n\n        Log.d(TAG, String.format(\"onLayout: X: %d Y: %d\", width, height))\n    }\n\n    companion object\n    {\n\n        private val TAG = KanjiImageView::class.java.name\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/ResizeView.java",
    "content": "package ca.fuwafuwa.kaku.Windows.Views;\n\nimport android.content.Context;\nimport androidx.core.view.GestureDetectorCompat;\nimport android.util.AttributeSet;\nimport android.view.GestureDetector;\nimport android.view.MotionEvent;\nimport android.widget.LinearLayout;\n\nimport ca.fuwafuwa.kaku.Windows.Interfaces.WindowListener;\n\n/**\n * Created by 0xbad1d3a5 on 4/13/2016.\n */\npublic class ResizeView extends LinearLayout implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener\n{\n    private WindowListener mWindowListener;\n    private GestureDetectorCompat mDetector;\n\n    public ResizeView(Context context)\n    {\n        super(context);\n        init(context);\n    }\n\n    public ResizeView(Context context, AttributeSet attrs)\n    {\n        super(context, attrs);\n        init(context);\n    }\n\n    public ResizeView(Context context, AttributeSet attrs, int defStyleAttr)\n    {\n        super(context, attrs, defStyleAttr);\n        init(context);\n    }\n\n    private void init(Context context)\n    {\n        mDetector = new GestureDetectorCompat(context, this);\n        mDetector.setOnDoubleTapListener(this);\n    }\n\n    public void setWindowListener(WindowListener windowListener)\n    {\n        this.mWindowListener = windowListener;\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent e)\n    {\n        mDetector.onTouchEvent(e);\n\n        return mWindowListener.onResize(e);\n    }\n\n    @Override\n    public boolean onSingleTapConfirmed(MotionEvent e)\n    {\n        return false;\n    }\n\n    @Override\n    public boolean onDoubleTap(MotionEvent e)\n    {\n        return mWindowListener.onDoubleTap(e);\n    }\n\n    @Override\n    public boolean onDoubleTapEvent(MotionEvent e)\n    {\n        return false;\n    }\n\n    @Override\n    public boolean onDown(MotionEvent e)\n    {\n        return false;\n    }\n\n    @Override\n    public void onShowPress(MotionEvent e)\n    {\n    }\n\n    @Override\n    public boolean onSingleTapUp(MotionEvent e)\n    {\n        return false;\n    }\n\n    @Override\n    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)\n    {\n        return false;\n    }\n\n    @Override\n    public void onLongPress(MotionEvent e)\n    {\n    }\n\n    @Override\n    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)\n    {\n        return false;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/SquareGridView.kt",
    "content": "package ca.fuwafuwa.kaku.Windows.Views\n\nimport android.content.Context\nimport android.util.AttributeSet\nimport android.view.View\nimport android.view.ViewGroup\n\nimport ca.fuwafuwa.kaku.*\n\n/**\n * Created by 0xbad1d3a5 on 5/5/2016.\n */\nopen class SquareGridView : ViewGroup\n{\n    protected var squareCellSize = 0\n    protected var maxSquares = 0\n\n    private var mItemCount = 0\n    private var mRowLimit = 0\n    private var mRows = 1\n\n    constructor(context: Context) : super(context)\n    {\n        Init(context)\n    }\n\n    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)\n    {\n        Init(context)\n    }\n\n    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr)\n    {\n        Init(context)\n    }\n\n    constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)\n    {\n        Init(context)\n    }\n\n    private fun Init(context: Context)\n    {\n        squareCellSize = dpToPx(context, 37)\n    }\n\n    fun setCellSize(dp: Int)\n    {\n        squareCellSize = dpToPx(context, dp)\n    }\n\n    fun setItemCount(items: Int)\n    {\n        mItemCount = items\n    }\n\n    fun setRowLimit(rowLimit: Int)\n    {\n        mRowLimit = rowLimit\n    }\n\n    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int)\n    {\n        val cellWidthSpec = View.MeasureSpec.makeMeasureSpec(squareCellSize, View.MeasureSpec.EXACTLY)\n        val cellHeightSpec = View.MeasureSpec.makeMeasureSpec(squareCellSize, View.MeasureSpec.EXACTLY)\n\n        val count = childCount\n        for (index in 0 until count)\n        {\n            val child = getChildAt(index)\n            child.measure(cellWidthSpec, cellHeightSpec)\n        }\n\n        // set width to squareCellSize * count if width is smaller than screen, and just screen width if larger\n        val x = View.resolveSize(squareCellSize * count, widthMeasureSpec)\n        mRows = Math.ceil(mItemCount.toDouble() / (x / squareCellSize).toDouble()).toInt()\n        mRows = if (mRows <= 0) 1 else mRows\n\n        when (mRowLimit)\n        {\n            0 -> { mRows = if (mRows >= 4) 4 else mRows }\n            1 -> { mRows = 1 }\n            2 -> { mRows = if (mRows >= 8) 8 else mRows }\n        }\n\n        val y = View.resolveSize(squareCellSize * mRows, heightMeasureSpec)\n\n        setMeasuredDimension(x, y)\n    }\n\n    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int)\n    {\n        var columns = (r - l) / squareCellSize\n        val xStart = (r - l - squareCellSize * columns) / 2\n        if (columns < 0)\n        {\n            columns = 1\n        }\n\n        var rows = 1\n        var x = xStart\n        var y = 0\n        var i = 0\n        val count = childCount\n        for (index in 0 until count)\n        {\n            val child = getChildAt(index)\n            val w = child.measuredWidth\n            val h = child.measuredHeight\n            val left = x + (squareCellSize - w) / 2\n            val top = y + (squareCellSize - h) / 2\n            child.layout(left, top, left + w, top + h)\n            if (i >= columns - 1)\n            {\n                // advance to next row\n                i = 0\n                x = xStart\n                y += squareCellSize\n                rows++\n                if (rows > mRows)\n                {\n                    break\n                }\n            } else\n            {\n                i++\n                x += squareCellSize\n            }\n        }\n\n        maxSquares = columns * mRows\n    }\n\n    companion object\n    {\n        private val TAG = SquareGridView::class.java.name\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/WindowView.java",
    "content": "package ca.fuwafuwa.kaku.Windows.Views;\n\nimport android.content.Context;\nimport androidx.core.view.GestureDetectorCompat;\nimport android.util.AttributeSet;\nimport android.view.MotionEvent;\nimport android.widget.RelativeLayout;\n\nimport ca.fuwafuwa.kaku.Windows.Interfaces.WindowListener;\n\n/**\n * Created by 0xbad1d3a5 on 4/13/2016.\n */\npublic class WindowView extends RelativeLayout\n{\n    private WindowListener mWindowListener;\n    private GestureDetectorCompat mDetector;\n\n    public WindowView(Context context)\n    {\n        super(context);\n    }\n\n    public WindowView(Context context, AttributeSet attrs)\n    {\n        super(context, attrs);\n    }\n\n    public WindowView(Context context, AttributeSet attrs, int defStyleAttr)\n    {\n        super(context, attrs, defStyleAttr);\n    }\n\n    public void setWindowListener(WindowListener windowListener)\n    {\n        mWindowListener = windowListener;\n    }\n\n    public void setDetector(GestureDetectorCompat detector)\n    {\n        mDetector = detector;\n    }\n\n    @Override\n    public boolean onTouchEvent(MotionEvent e)\n    {\n        if (mDetector.onTouchEvent(e))\n        {\n            return true;\n        }\n\n        return mWindowListener.onTouch(e);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/Window.java",
    "content": "package ca.fuwafuwa.kaku.Windows;\n\nimport android.content.Context;\nimport android.graphics.PixelFormat;\nimport android.graphics.Point;\nimport android.hardware.input.InputManager;\nimport android.os.Build;\nimport androidx.core.view.GestureDetectorCompat;\nimport android.util.Log;\nimport android.view.Gravity;\nimport android.view.LayoutInflater;\nimport android.view.MotionEvent;\nimport android.view.View;\nimport android.view.ViewTreeObserver;\nimport android.view.WindowManager;\nimport android.widget.RelativeLayout;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport ca.fuwafuwa.kaku.Interfaces.Stoppable;\nimport ca.fuwafuwa.kaku.KakuTools;\nimport ca.fuwafuwa.kaku.R;\nimport ca.fuwafuwa.kaku.Windows.Interfaces.WindowListener;\nimport ca.fuwafuwa.kaku.Windows.Views.ResizeView;\nimport ca.fuwafuwa.kaku.Windows.Views.WindowView;\n\nimport static android.content.Context.WINDOW_SERVICE;\n\npublic abstract class Window implements Stoppable, WindowListener {\n\n    private static final String TAG = Window.class.getName();\n\n    public interface OnHeightKnown {\n        void performAction();\n    }\n\n    public static class ReinitOptions\n    {\n        public boolean reinitViewLayout = true;\n    }\n\n    protected final int minSize;\n\n    protected Context context;\n    protected WindowManager windowManager;\n    protected View window;\n    protected WindowManager.LayoutParams params;\n    protected boolean addedToWindowManager;\n    protected WindowCoordinator windowCoordinator;\n\n    private Point mRealDisplaySize;\n    private int mDX;\n    private int mDY;\n    private View mDummyViewForSize;\n    private int mViewHeight;\n    private int mViewWidth;\n    private List<ViewTreeObserver.OnGlobalLayoutListener> mOnHeightKnownListeners;\n\n    private boolean mWindowClosed = false;\n    private long mParamUpdateTimer = System.currentTimeMillis();\n\n    public Window(Context context, WindowCoordinator windowCoordinator, int contentView){\n\n        this.context = context;\n        this.windowCoordinator = windowCoordinator;\n\n        LayoutInflater inflater = (LayoutInflater) this.context.getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);\n\n        windowManager = (WindowManager) this.context.getSystemService(WINDOW_SERVICE);\n        window = inflater.inflate(R.layout.window, null);\n        mRealDisplaySize = getRealDisplaySizeFromContext();\n        params = getDefaultParams();\n        minSize = KakuTools.dpToPx(context, 15);\n        mOnHeightKnownListeners = new ArrayList<>();\n\n        WindowView windowView = window.findViewById(R.id.window_view);\n        ResizeView resizeView = window.findViewById(R.id.resize_view);\n        windowView.setWindowListener(this);\n        resizeView.setWindowListener(this);\n        GestureDetectorCompat detectorCompat = new GestureDetectorCompat(context, this);\n        detectorCompat.setOnDoubleTapListener(this);\n        windowView.setDetector(detectorCompat);\n\n        RelativeLayout relativeLayout = window.findViewById(R.id.content_view);\n        relativeLayout.addView(inflater.inflate(contentView, relativeLayout, false));\n\n        // Hacky way to check if we are fullscreen by inserting a dummy view and seeing if\n        // realDisplaySize matches this view's height. Also determines the drawable view size.\n        WindowManager.LayoutParams heightViewParams = new WindowManager.LayoutParams();\n        heightViewParams.width = WindowManager.LayoutParams.MATCH_PARENT;\n        heightViewParams.height = WindowManager.LayoutParams.MATCH_PARENT;\n        heightViewParams.type = Build.VERSION.SDK_INT > 25 ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : WindowManager.LayoutParams.TYPE_PHONE;\n        heightViewParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;\n        heightViewParams.format = PixelFormat.TRANSPARENT;\n        heightViewParams.gravity = Gravity.END | Gravity.TOP;\n        heightViewParams.alpha = 0.0F;\n        mDummyViewForSize = new View(context);\n        mDummyViewForSize.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()\n        {\n            @Override\n            public void onGlobalLayout()\n            {\n                mViewHeight = mDummyViewForSize.getMeasuredHeight();\n                mViewWidth = mDummyViewForSize.getMeasuredWidth();\n            }\n        });\n\n        windowManager.addView(mDummyViewForSize, heightViewParams);\n    }\n\n    public void reInit(ReinitOptions options)\n    {\n        Log.d(TAG, String.format(\"Window.reInit() for %s called\", this.getClass()));\n\n        synchronized (this)\n        {\n            mRealDisplaySize = getRealDisplaySizeFromContext();\n\n            if (options.reinitViewLayout)\n            {\n                fixBoxBounds();\n\n                if (addedToWindowManager){\n                    windowManager.updateViewLayout(window, params);\n                }\n            }\n        }\n    }\n\n    private Point getRealDisplaySizeFromContext()\n    {\n        Point displaySize = new Point();\n        ((WindowManager) context.getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getRealSize(displaySize);\n        return displaySize;\n    }\n\n    /**\n     * {@link #stop()} MUST be called or the window does not get removed from the android screen\n     * otherwise, the view remains on the screen even after you stop the service.\n     *\n     * If you choose to override {@link #stop()}, you should call super.stop() to remove the view.\n     * Try not to use WindowManager to remove the view yourself, as attempting to remove the view\n     * twice from WindowManager (very possible if you have a touch event closing the window) will\n     * cause a crash.\n     */\n    @Override\n    public void stop()\n    {\n        Log.d(TAG, String.format(\"Window.stop() for %s called\", this.getClass()));\n\n        synchronized (this)\n        {\n            if (mWindowClosed) return;\n\n            for (ViewTreeObserver.OnGlobalLayoutListener listener : mOnHeightKnownListeners)\n            {\n                mDummyViewForSize.getViewTreeObserver().removeOnGlobalLayoutListener(listener);\n            }\n\n            mWindowClosed = true;\n            windowManager.removeView(mDummyViewForSize);\n            windowCoordinator.removeWindow(this);\n            if (addedToWindowManager) windowManager.removeView(window);\n\n            context = null;\n            windowCoordinator = null;\n        }\n    }\n\n    public void show()\n    {\n        Log.d(TAG, String.format(\"Window.show() for %s called, %b\", this.getClass(), addedToWindowManager));\n\n        synchronized (this)\n        {\n            if (!addedToWindowManager)\n            {\n                windowManager.addView(window, params);\n                addedToWindowManager = true;\n            }\n\n            windowManager.updateViewLayout(window, params);\n        }\n    }\n\n    public void hide()\n    {\n        Log.d(TAG, String.format(\"Window.hide() for %s called, %b\", this.getClass(), addedToWindowManager));\n\n        synchronized (this)\n        {\n            if (addedToWindowManager)\n            {\n                windowManager.removeView(window);\n                addedToWindowManager = false;\n            }\n        }\n    }\n\n    /**\n     * Override this and {@link #onScroll} if implementing Window does not need to move around\n     *\n     * @param e MotionEvent for moving the Window\n     * @return Returns whether the MotionEvent was handled\n     */\n    public boolean onTouch(MotionEvent e){\n        switch (e.getAction()) {\n            case MotionEvent.ACTION_DOWN:\n                mDX = params.x - (int) e.getRawX();\n                mDY = params.y - (int) e.getRawY();\n                return true;\n            case MotionEvent.ACTION_UP:\n                fixBoxBounds();\n                windowManager.updateViewLayout(window, params);\n                onUp(e);\n                return true;\n        }\n        return false;\n    }\n\n    /**\n     * See {@link #onTouch}\n     */\n    @Override\n    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {\n\n        if (e1 == null || e2 == null){\n            return false;\n        }\n\n        params.x = mDX + (int) e2.getRawX();\n        params.y = mDY + (int) e2.getRawY();\n        fixBoxBounds();\n        windowManager.updateViewLayout(window, params);\n        return true;\n    }\n\n    /**\n     * Override if your implementing Window needs to deal with this touch event\n     */\n    @Override\n    public boolean onSingleTapConfirmed(MotionEvent e) {\n        return false;\n    }\n\n    /**\n     * Override if your implementing Window needs to deal with this touch event\n     */\n    @Override\n    public boolean onDoubleTap(MotionEvent e) {\n        return false;\n    }\n\n    /**\n     * Override if your implementing Window needs to deal with this touch event\n     */\n    @Override\n    public boolean onDoubleTapEvent(MotionEvent e) {\n        return false;\n    }\n\n    /**\n     * Override if your implementing Window needs to deal with this touch event\n     */\n    public boolean onUp(MotionEvent e){ return false; }\n\n    /**\n     * Override if your implementing Window needs to deal with this touch event\n     */\n    @Override\n    public boolean onDown(MotionEvent e) {\n        return false;\n    }\n\n    /**\n     * Override if your implementing Window needs to deal with this touch event\n     */\n    @Override\n    public void onShowPress(MotionEvent e) {\n    }\n\n    /**\n     * Override if your implementing Window needs to deal with this touch event\n     */\n    @Override\n    public boolean onSingleTapUp(MotionEvent e) {\n        return false;\n    }\n\n    /**\n     * Override if your implementing Window needs to deal with this touch event\n     */\n    @Override\n    public void onLongPress(MotionEvent e) {\n    }\n\n    /**\n     * Override if your implementing Window needs to deal with this touch event\n     */\n    @Override\n    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {\n        return false;\n    }\n\n    /**\n     * Override this if implementing Window does not need to resize.\n     *\n     * Overriding {@link #onTouch} will NOT prevent this event from being triggered as\n     * it is bring triggered from another view (the resize view) at the current moment.\n     *\n     * @param e MotionEvent for resizing the Window\n     * @return Returns whether the MotionEvent was handled\n     */\n    public boolean onResize(MotionEvent e){\n        switch (e.getAction()) {\n            case MotionEvent.ACTION_DOWN:\n                mDX = params.width - (int) e.getRawX();\n                mDY = params.height - (int) e.getRawY();\n                return true;\n            case MotionEvent.ACTION_UP:\n                fixBoxBounds();\n                windowManager.updateViewLayout(window, params);\n                onUp(e);\n                return true;\n            case MotionEvent.ACTION_MOVE:\n                params.width = mDX + (int) e.getRawX();\n                params.height = mDY + (int) e.getRawY();\n                fixBoxBounds();\n                long currTime = System.currentTimeMillis();\n                if (currTime - mParamUpdateTimer > 50){\n                    mParamUpdateTimer = currTime;\n                    windowManager.updateViewLayout(window, params);\n                }\n                return true;\n        }\n        return false;\n    }\n\n    /**\n     * Some Windows requires the drawable view and status bar height to be known so they can position themselves appropriately\n     * Set handler here if that is the case for that window\n     */\n    public void setOnHeightKnownAction(final OnHeightKnown onHeightKnown)\n    {\n        ViewTreeObserver.OnGlobalLayoutListener listener = new ViewTreeObserver.OnGlobalLayoutListener()\n        {\n            @Override\n            public void onGlobalLayout()\n            {\n                onHeightKnown.performAction();\n            }\n        };\n\n        mDummyViewForSize.getViewTreeObserver().addOnGlobalLayoutListener(listener);\n        mOnHeightKnownListeners.add(listener);\n    }\n\n    /**\n     * @return Default LayoutParams for Window\n     */\n    protected WindowManager.LayoutParams getDefaultParams(){\n        WindowManager.LayoutParams params = new WindowManager.LayoutParams();\n        params.width = KakuTools.dpToPx(context, 150);\n        params.height = KakuTools.dpToPx(context, 150);\n        params.type = Build.VERSION.SDK_INT > 25 ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : WindowManager.LayoutParams.TYPE_PHONE;\n        params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;\n        params.format = PixelFormat.TRANSLUCENT;\n        params.alpha = 0.8F;\n        params.x = 0;\n        params.y = 0;\n        params.gravity = Gravity.TOP | Gravity.LEFT;\n        return params;\n    }\n\n    /**\n     * @return Real screen display size\n     */\n    protected Point getRealDisplaySize()\n    {\n        return new Point(mRealDisplaySize);\n    }\n\n    /**\n     * @return System status bar height in pixels. Note that the View MUST have been drawn for this to have any meaning!\n     */\n    protected int getStatusBarHeight()\n    {\n        Log.d(TAG, String.format(\"Window - getStatusBarHeight %d vs %d\", mRealDisplaySize.y, mViewHeight));\n\n        if (mRealDisplaySize.y == mViewHeight)\n        {\n            return 0;\n        }\n\n        int result = 0;\n        int resourceId = context.getResources().getIdentifier(\"status_bar_height\", \"dimen\", \"android\");\n        if (resourceId > 0)\n        {\n            result = context.getResources().getDimensionPixelSize(resourceId);\n        }\n\n        return result;\n    }\n\n    /**\n     * @return The height of portions of the screen the view can be draw on. Note that the View MUST have been drawn for this to have any meaning!\n     */\n    protected int getViewHeight(){\n        return mViewHeight;\n    }\n\n    /**\n     * @return The width of portions of the screen the view can be draw on. Note that the View MUST have been drawn for this to have any meaning!\n     */\n    protected int getViewWidth(){\n        return mViewWidth;\n    }\n\n    /**\n     * Fixes window so that it stays inside the screen even if the user is trying to drag it off screen\n     * Also makes sure that the window size is not smaller than a specified value\n     */\n    private void fixBoxBounds(){\n        if (params.x < 0){\n            params.x = 0;\n        }\n        else if (params.x + params.width > mRealDisplaySize.x) {\n            params.x = mRealDisplaySize.x - params.width;\n        }\n        if (params.y < 0){\n            params.y = 0;\n        }\n        else if (params.y + params.height > mRealDisplaySize.y) {\n            params.y = mRealDisplaySize.y - params.height - getStatusBarHeight();\n        }\n        if (params.width > mRealDisplaySize.x){\n            params.width = mRealDisplaySize.x;\n        }\n        if (params.height > mRealDisplaySize.y){\n            params.height = mRealDisplaySize.y;\n        }\n        if (params.width < minSize){\n            params.width = minSize;\n        }\n        if (params.height < minSize){\n            params.height = minSize;\n        }\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/Windows/WindowCoordinator.kt",
    "content": "package ca.fuwafuwa.kaku.Windows\n\nimport android.content.Context\nimport ca.fuwafuwa.kaku.*\n\n/**\n * It seems like opening and closing a bunch of windows causes Android to start to lag pretty hard.\n * Therefore, we should keep only one instance of each type of window in memory, and show()ing and\n * hide()ing the window when necessary. This class is to help facilitate this communication.\n *\n * Edit: The lag actually might have been caused by a memory leak. But this is here now, so might\n * as well keep it.\n */\nclass WindowCoordinator(private val context: Context)\n{\n    val windows: MutableMap<String, Window> = mutableMapOf()\n\n    private val windowInitMap: Map<String, () -> Window> = mutableMapOf(\n            WINDOW_INFO to fun(): Window { return InformationWindow(context, this) },\n            WINDOW_EDIT to fun(): Window { return EditWindow(context, this) },\n            WINDOW_CAPTURE to fun(): Window { return CaptureWindow(context, this) },\n            WINDOW_INSTANT_KANJI to fun(): Window { return InstantKanjiWindow(context, this) },\n            //WINDOW_HISTORY to fun(): Window { return HistoryWindow(context, this) },\n            WINDOW_KANJI_CHOICE to fun(): Window { return KanjiChoiceWindow(context, this) }\n    )\n\n    fun getWindow(key: String) : Window\n    {\n        if (!windows.containsKey(key))\n        {\n            windows[key] = windowInitMap.getValue(key).invoke()\n        }\n\n        return windows[key]!!\n    }\n\n    fun <WindowType> getWindowOfType(key: String) : WindowType\n    {\n        return getWindow(key) as WindowType\n    }\n\n    /**\n     * Should only be called by {@link Window#stop()} - calling this outside that method may result in a memory leak\n     */\n    fun removeWindow(window: Window)\n    {\n        var key : String? = null\n\n        windows.forEach {\n            if (it.value === window)\n            {\n                key = it.key\n            }\n        }\n\n        if (key != null) windows.remove(key!!)\n    }\n\n    fun hasWindow(key: String) : Boolean\n    {\n        return windows.containsKey(key)\n    }\n\n    fun reinitAllWindows()\n    {\n        windows.forEach { it.value.reInit(Window.ReinitOptions()) }\n    }\n\n    fun stopAllWindows()\n    {\n        val windows = windows.toList()\n        windows.forEach { it.second.stop() }\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/CommonParser.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers;\n\nimport android.content.Context;\nimport android.util.Log;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.HashMap;\n\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.JmDatabaseHelper;\nimport ca.fuwafuwa.kaku.Database.KanjiDict2Database.Kd2DatabaseHelper;\nimport ca.fuwafuwa.kaku.XmlParsers.JmDict.JmParser;\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2Parser;\n\n/**\n * Created by 0xbad1d3a5 on 4/25/2016.\n */\npublic class CommonParser {\n\n    private static final String TAG = CommonParser.class.getName();\n\n    private Context mContext;\n\n    public CommonParser(Context mContext) {\n        this.mContext = mContext;\n    }\n\n    public void parseJmDict() throws Exception {\n        Log.d(TAG, \"INITIALIZING DICTIONARY\");\n        ParserRunnable dictRunnable = new ParserRunnable(mContext);\n        Thread dictThread = new Thread(dictRunnable);\n        dictThread.setDaemon(true);\n        dictThread.start();\n    }\n\n    public static String parseString(XmlPullParser parser) throws IOException, XmlPullParserException {\n\n        if (parser.isEmptyElementTag()){\n            parser.nextToken();\n            return null;\n        }\n\n        StringBuilder sb = new StringBuilder();\n        String XMLTAG = parser.getName();\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n        parser.nextToken();\n\n        while (!XMLTAG.equals(parser.getName())) {\n            switch (parser.getEventType()) {\n                case XmlPullParser.TEXT:\n                    sb.append(parser.getText());\n                    break;\n                case XmlPullParser.ENTITY_REF:\n                    sb.append(parser.getText().trim());\n                    break;\n            }\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.END_TAG, null, XMLTAG);\n        return sb.toString();\n    }\n\n    public static String parseOnlyEntityRef(XmlPullParser parser) throws IOException, XmlPullParserException {\n\n        if (parser.isEmptyElementTag()){\n            parser.nextToken();\n            return null;\n        }\n\n        StringBuilder sb = new StringBuilder();\n        String XMLTAG = parser.getName();\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n        parser.nextToken();\n\n        while (!XMLTAG.equals(parser.getName())) {\n            switch (parser.getEventType()) {\n                case XmlPullParser.ENTITY_REF:\n                    sb.append(parser.getName());\n                    break;\n            }\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.END_TAG, null, XMLTAG);\n        return sb.toString();\n    }\n\n    public static HashMap<String, String> parseAttributes(XmlPullParser parser){\n        HashMap<String, String> attrMap = new HashMap<>();\n        int numAttr = parser.getAttributeCount();\n        for (int i = 0; i < numAttr; i++){\n            attrMap.put(parser.getAttributeName(i), parser.getAttributeValue(i));\n        }\n        return attrMap;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/Interfaces/DictParser.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.Interfaces;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.sql.SQLException;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\n\npublic interface DictParser {\n\n    void parseDict(XmlPullParser parser) throws IOException, XmlPullParserException, SQLException;\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDict/JmConsts.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.JmDict;\n\n/**\n * Created by 0xbad1d3a5 on 4/25/2016.\n */\npublic class JmConsts {\n\n    // Elements\n    public static final String JMDICT = \"JMdict\";\n    public static final String ENTRY = \"entry\";\n    public static final String ENT_SEQ = \"ent_seq\";\n    public static final String K_ELE = \"k_ele\";\n    public static final String KEB = \"keb\";\n    public static final String KE_INF = \"ke_inf\";\n    public static final String KE_PRI = \"ke_pri\";\n    public static final String R_ELE = \"r_ele\";\n    public static final String REB = \"reb\";\n    public static final String RE_NOKANJI = \"re_nokanji\";\n    public static final String RE_RESTR= \"re_restr\";\n    public static final String RE_INF = \"re_inf\";\n    public static final String RE_PRI = \"re_pri\";\n    public static final String SENSE = \"sense\";\n    public static final String STAGK = \"stagk\";\n    public static final String STAGR = \"stagr\";\n    public static final String POS = \"pos\";\n    public static final String XREF = \"xref\";\n    public static final String ANT = \"ant\";\n    public static final String FIELD = \"field\";\n    public static final String MISC = \"misc\";\n    public static final String S_INF = \"s_inf\";\n    public static final String LSOURCE = \"lsource\";\n    public static final String DIAL = \"dial\";\n    public static final String GLOSS = \"gloss\";\n    public static final String EXAMPLE = \"example\";\n\n    // Attributes\n    public static final String XML_LANG = \"lang\";\n    public static final String G_GEND = \"g_gend\";\n    public static final String LS_TYPE = \"ls_type\";\n    public static final String LS_WASEI = \"ls_wasei\";\n\n    // Depreciated by JmDict\n    /*\n    public static final String INFO = \"info\";\n    public static final String LINKS = \"links\";\n    public static final String LINK_TAG = \"link_tag\";\n    public static final String LINK_DESC = \"link_desc\";\n    public static final String LINK_URI = \"link_uri\";\n    public static final String BIBL = \"bibl\";\n    public static final String BIB_TAG = \"bib_tag\";\n    public static final String BIB_TXT = \"bib_txt\";\n    public static final String AUDIT = \"audit\";\n    public static final String UPD_DATE = \"upd_date\";\n    public static final String UPD_DETL = \"upd_detl\";\n    public static final String ETYM = \"etym\";\n    */\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDict/JmDTO/JmEntry.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.JmDict.JmDTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport ca.fuwafuwa.kaku.XmlParsers.CommonParser;\nimport ca.fuwafuwa.kaku.XmlParsers.JmDict.JmConsts;\n\npublic class JmEntry {\n\n    private static final String TAG = JmEntry.class.getName();\n    private static final String XMLTAG = JmConsts.ENTRY;\n\n    private Integer ent_seq = null;\n    private List<JmKEle> k_ele = new ArrayList<>();\n    private List<JmREle> r_ele = new ArrayList<>();\n    private List<JmSense> sense = new ArrayList<>();\n\n    public JmEntry(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n        parser.nextToken();\n\n        while (!XMLTAG.equals(parser.getName())){\n            String name = parser.getName() == null ? \"\" : parser.getName();\n            switch (name) {\n                case JmConsts.ENT_SEQ:\n                    ent_seq = Integer.parseInt(CommonParser.parseString(parser));\n                    break;\n                case JmConsts.K_ELE:\n                    k_ele.add(new JmKEle(parser));\n                    break;\n                case JmConsts.R_ELE:\n                    r_ele.add(new JmREle(parser));\n                    break;\n                case JmConsts.SENSE:\n                    sense.add(new JmSense(parser));\n                    break;\n            }\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.END_TAG, null, XMLTAG);\n    }\n\n    /**\n     * A unique numeric sequence number for each entry\n     */\n    public Integer getEntSeq(){\n        return this.ent_seq;\n    }\n\n    public List<JmKEle> getKEle(){\n        return this.k_ele;\n    }\n\n    public List<JmREle> getREle(){\n        return this.r_ele;\n    }\n\n    public List<JmSense> getSense(){\n        return this.sense;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDict/JmDTO/JmGloss.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.JmDict.JmDTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.HashMap;\n\nimport ca.fuwafuwa.kaku.XmlParsers.CommonParser;\nimport ca.fuwafuwa.kaku.XmlParsers.JmDict.JmConsts;\n\n/**\n * Created by 0xbad1d3a5 on 4/30/2016.\n */\npublic class JmGloss {\n\n    private static final String XMLTAG = JmConsts.GLOSS;\n\n    private String text = null;\n    private String lang = null;\n    private String g_gend = null;\n\n    private boolean isEnglish;\n\n    public JmGloss(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n\n        HashMap<String, String> attrMap = CommonParser.parseAttributes(parser);\n        g_gend = attrMap.get(JmConsts.G_GEND);\n        if (attrMap.get(JmConsts.XML_LANG) == null){\n            lang = \"eng\";\n            isEnglish = true;\n        }\n        else {\n            lang = attrMap.get(JmConsts.XML_LANG);\n            isEnglish = \"eng\".equals(lang);\n        }\n\n        text = CommonParser.parseString(parser);\n    }\n\n    public String toString(){\n        if (\"eng\".equals(lang)){\n            return text;\n        }\n        return \"\";\n    }\n\n    public String getText(){\n        return text;\n    }\n\n    public String getLang(){\n        return lang;\n    }\n\n    public String getGender(){\n        return g_gend;\n    }\n\n    public boolean isEnglish() {\n        return isEnglish;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDict/JmDTO/JmKEle.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.JmDict.JmDTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport ca.fuwafuwa.kaku.XmlParsers.CommonParser;\nimport ca.fuwafuwa.kaku.XmlParsers.JmDict.JmConsts;\n\n/**\n * Created by 0xbad1d3a5 on 4/25/2016.\n */\n\n/**\n * The kanji element, or in its absence, the reading element, is\n * the defining component of each entry.\n * The overwhelming majority of entries will have a single kanji\n * element associated with a word in Japanese. Where there are\n * multiple kanji elements within an entry, they will be orthographical\n * variants of the same word, either using variations in okurigana, or\n * alternative and equivalent kanji. Common \"mis-spellings\" may be\n * included, provided they are associated with appropriate information\n * fields. Synonyms are not included; they may be indicated in the\n * cross-reference field associated with the sense element.\n */\npublic class JmKEle {\n\n    private static final String XMLTAG = JmConsts.K_ELE;\n\n    private String keb = null;\n    private List<String> ke_inf = new ArrayList<>();\n    private List<String> ke_pri = new ArrayList<>();\n\n    public JmKEle(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n        parser.nextToken();\n\n        while (!XMLTAG.equals(parser.getName())){\n            String name = parser.getName() == null ? \"\" : parser.getName();\n            switch(name){\n                case JmConsts.KEB:\n                    keb = CommonParser.parseString(parser);\n                    break;\n                case JmConsts.KE_INF:\n                    ke_inf.add(CommonParser.parseString(parser));\n                    break;\n                case JmConsts.KE_PRI:\n                    ke_pri.add(CommonParser.parseString(parser));\n                    break;\n            }\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.END_TAG, null, XMLTAG);\n    }\n\n    /**\n     * This element will contain a word or short phrase in Japanese\n     * which is written using at least one non-kana character (usually kanji,\n     * but can be other characters). The valid characters are\n     * kanji, kana, related characters such as chouon and kurikaeshi, and\n     * in exceptional cases, letters from other alphabets.\n     */\n    public String getKeb(){\n        return this.keb;\n    }\n\n    /**\n     * This is a coded information field related specifically to the\n     * orthography of the keb, and will typically indicate some unusual\n     * aspect, such as okurigana irregularity.\n     */\n    public List<String> getKeInf(){\n        return this.ke_inf;\n    }\n\n    /**\n     * This and the equivalent re_pri field are provided to record\n     * information about the relative priority of the entry,  and consist\n     * of codes indicating the word appears in various references which\n     * can be taken as an indication of the frequency with which the word\n     * is used. This field is intended for use either by applications which\n     * want to concentrate on entries of  a particular priority, or to\n     * generate subset files.\n     * The current values in this field are:\n     * - news1/2: appears in the \"wordfreq\" file compiled by Alexandre Girardi\n     * from the Mainichi Shimbun. (See the Monash ftp archive for a copy.)\n     * Words in the first 12,000 in that file are marked \"news1\" and words\n     * in the second 12,000 are marked \"news2\".\n     * - ichi1/2: appears in the \"Ichimango goi bunruishuu\", Senmon Kyouiku\n     * Publishing, Tokyo, 1998.  (The entries marked \"ichi2\" were\n     * demoted from ichi1 because they were observed to have low\n     * frequencies in the WWW and newspapers.)\n     * - spec1 and spec2: a small number of words use this marker when they\n     * are detected as being common, but are not included in other lists.\n     * - gai1/2: common loanwords, based on the wordfreq file.\n     * - nfxx: this is an indicator of frequency-of-use ranking in the\n     * wordfreq file. \"xx\" is the number of the set of 500 words in which\n     * the entry can be found, with \"01\" assigned to the first 500, \"02\"\n     * to the second, and so on. (The entries with news1, ichi1, spec1 and\n     * gai1 values are marked with a \"(P)\" in the EDICT and EDICT2\n     * files.)\n     * <p/>\n     * The reason both the kanji and reading elements are tagged is because\n     * on occasions a priority is only associated with a particular\n     * kanji/reading pair.\n     */\n    public List<String> getKePri(){\n        return this.ke_pri;\n    }\n}\n\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDict/JmDTO/JmLsource.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.JmDict.JmDTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.HashMap;\n\nimport ca.fuwafuwa.kaku.XmlParsers.CommonParser;\nimport ca.fuwafuwa.kaku.XmlParsers.JmDict.JmConsts;\n\n/**\n * Created by 0xbad1d3a5 on 4/30/2016.\n */\npublic class JmLsource {\n\n    private static final String XMLTAG = JmConsts.LSOURCE;\n\n    private String text = null;\n    private String lang = null;\n    private String ls_type = null;\n    private String ls_wasei = null;\n\n    public JmLsource(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n\n        HashMap<String, String> attrMap = CommonParser.parseAttributes(parser);\n        lang = attrMap.get(JmConsts.XML_LANG) == null ? \"eng\" : attrMap.get(JmConsts.XML_LANG);\n        ls_type = attrMap.get(JmConsts.LS_TYPE);\n        ls_wasei = attrMap.get(JmConsts.LS_WASEI);\n        text = CommonParser.parseString(parser);\n    }\n\n    public String getText(){\n        return text;\n    }\n\n    public String getLang(){\n        return lang;\n    }\n\n    public String getLsType(){\n        return ls_type;\n    }\n\n    public String getLsWasei(){\n        return ls_wasei;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDict/JmDTO/JmREle.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.JmDict.JmDTO;\n\nimport com.google.common.base.Joiner;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport ca.fuwafuwa.kaku.XmlParsers.CommonParser;\nimport ca.fuwafuwa.kaku.XmlParsers.JmDict.JmConsts;\n\n/**\n * The reading element typically contains the valid readings\n * of the word(s) in the kanji element using modern kanadzukai.\n * Where there are multiple reading elements, they will typically be\n * alternative readings of the kanji element. In the absence of a\n * kanji element, i.e. in the case of a word or phrase written\n * entirely in kana, these elements will define the entry.\n */\npublic class JmREle {\n\n    private static final String XMLTAG = JmConsts.R_ELE;\n\n    private String reb = null;\n    private String re_nokanji = null;\n    private List<String> re_restr = new ArrayList<>();\n    private List<String> re_inf = new ArrayList<>();\n    private List<String> re_pri = new ArrayList<>();\n\n    public JmREle(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n        parser.nextToken();\n\n        while (!XMLTAG.equals(parser.getName())){\n            String name = parser.getName() == null ? \"\" : parser.getName();\n            switch(name){\n                case JmConsts.REB:\n                    reb = CommonParser.parseString(parser);\n                    break;\n                case JmConsts.RE_NOKANJI:\n                    re_nokanji = CommonParser.parseString(parser);\n                    break;\n                case JmConsts.RE_RESTR:\n                    re_restr.add(CommonParser.parseString(parser));\n                    break;\n                case JmConsts.RE_INF:\n                    re_inf.add(CommonParser.parseString(parser));\n                    break;\n                case JmConsts.RE_PRI:\n                    re_pri.add(CommonParser.parseString(parser));\n                    break;\n            }\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.END_TAG, null, XMLTAG);\n    }\n\n    /**\n     * @return String representation of {@link JmREle}\n     */\n    public String toString(){\n        StringBuilder sb = new StringBuilder();\n        sb.append(String.format(\"reb: %s\\n\", reb));\n        sb.append(String.format(\"re_nokanji: %s\\n\", re_nokanji));\n        sb.append(String.format(\"re_restr: [%s]\\n\", Joiner.on(\", \").join(re_restr)));\n        sb.append(String.format(\"re_inf: [%s]\\n\", Joiner.on(\", \").join(re_inf)));\n        sb.append(String.format(\"re_pri: [%s]\\n\", Joiner.on(\", \").join(re_pri)));\n        return sb.toString();\n    }\n\n    /**\n     * this element content is restricted to kana and related\n     * characters such as chouon and kurikaeshi. Kana usage will be\n     * consistent between the keb and reb elements; e.g. if the keb\n     * contains katakana, so too will the reb.\n     */\n    public String getReb(){\n        return this.reb;\n    }\n\n    /**\n     * This element, which will usually have a null value, indicates\n     * that the reb, while associated with the keb, cannot be regarded\n     * as a true reading of the kanji. It is typically used for words\n     * such as foreign place names, gairaigo which can be in kanji or\n     * katakana, etc.\n     */\n    public String getReNoKanji(){\n        return this.re_nokanji;\n    }\n\n    /**\n     * This element is used to indicate when the reading only applies\n     * to a subset of the keb elements in the entry. In its absence, all\n     * readings apply to all kanji elements. The contents of this element\n     * must exactly match those of one of the keb elements.\n     */\n    public List<String> getReRestr(){\n        return this.re_restr;\n    }\n\n    /**\n     * General coded information pertaining to the specific reading.\n     * Typically it will be used to indicate some unusual aspect of\n     * the reading.\n     */\n    public List<String> getReInf(){\n        return this.re_inf;\n    }\n\n    /**\n     * See the comment on ke_pri above.\n     */\n    public List<String> getRePri(){\n        return this.re_pri;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDict/JmDTO/JmSense.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.JmDict.JmDTO;\n\nimport com.google.common.base.Joiner;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\nimport ca.fuwafuwa.kaku.XmlParsers.CommonParser;\nimport ca.fuwafuwa.kaku.XmlParsers.JmDict.JmConsts;\n\n/**\n * The sense element will record the translational equivalent\n * of the Japanese word, plus other related information. Where there\n * are several distinctly different meanings of the word, multiple\n * sense elements will be employed.\n */\npublic class JmSense {\n\n    private static final String XMLTAG = JmConsts.SENSE;\n\n    private List<String> stagk = new ArrayList<>();\n    private List<String> stagr = new ArrayList<>();\n    private HashSet<String> pos = new HashSet<>();\n    private List<String> xref = new ArrayList<>();\n    private List<String> ant = new ArrayList<>();\n    private List<String> field = new ArrayList<>();\n    private List<String> misc = new ArrayList<>();\n    private List<String> s_inf = new ArrayList<>();\n    private List<JmLsource> lsource = new ArrayList<>();\n    private List<String> dial = new ArrayList<>();\n    private List<JmGloss> gloss = new ArrayList<>();\n    private List<String> example = new ArrayList<>();\n\n    public JmSense(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n        parser.nextToken();\n\n        while (!XMLTAG.equals(parser.getName())){\n            String name = parser.getName() == null ? \"\" : parser.getName();\n            switch(name){\n                case JmConsts.STAGK:\n                    stagk.add(CommonParser.parseString(parser));\n                    break;\n                case JmConsts.STAGR:\n                    stagr.add(CommonParser.parseString(parser));\n                    break;\n                case JmConsts.POS:\n                    pos.add(CommonParser.parseOnlyEntityRef(parser));\n                    break;\n                case JmConsts.XREF:\n                    xref.add(CommonParser.parseString(parser));\n                    break;\n                case JmConsts.ANT:\n                    ant.add(CommonParser.parseString(parser));\n                    break;\n                case JmConsts.FIELD:\n                    field.add(CommonParser.parseString(parser));\n                    break;\n                case JmConsts.MISC:\n                    misc.add(CommonParser.parseString(parser));\n                    break;\n                case JmConsts.S_INF:\n                    s_inf.add(CommonParser.parseString(parser));\n                    break;\n                case JmConsts.LSOURCE:\n                    lsource.add(new JmLsource(parser));\n                    break;\n                case JmConsts.DIAL:\n                    dial.add(CommonParser.parseString(parser));\n                    break;\n                case JmConsts.GLOSS:\n                    gloss.add(new JmGloss(parser));\n                    break;\n                case JmConsts.EXAMPLE:\n                    example.add(CommonParser.parseString(parser));\n                    break;\n            }\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.END_TAG, null, XMLTAG);\n    }\n\n    public String toString(){\n        StringBuilder sb = new StringBuilder();\n        sb.append(String.format(\"gloss: [%s]\\n\", Joiner.on(\", \").join(gloss)));\n        return sb.toString();\n    }\n\n    /**\n     * These elements, if present, indicate that the sense is restricted\n     * to the lexeme represented by the keb and/or reb.\n     */\n    public List<String> getStagk(){\n        return this.stagk;\n    }\n    public List<String> getStagr(){\n        return this.stagr;\n    }\n\n    /**\n     * Part-of-speech information about the entry/sense. Should use\n     * appropriate entity codes. In general where there are multiple senses\n     * in an entry, the part-of-speech of an earlier sense will apply to\n     * later senses unless there is a new part-of-speech indicated.\n     */\n    public HashSet<String> getPos(){\n        return this.pos;\n    }\n\n    /**\n     * This element is used to indicate a cross-reference to another\n     * entry with a similar or related meaning or sense. The content of\n     * this element is typically a keb or reb element in another entry. In some\n     * cases a keb will be followed by a reb and/or a sense number to provide\n     * a precise target for the cross-reference. Where this happens, a JIS\n     * \"centre-dot\" (0x2126) is placed between the components of the\n     * cross-reference.\n     */\n    public List<String> getXRef() {\n        return this.xref;\n    }\n\n    /**\n     * This element is used to indicate another entry which is an\n     * antonym of the current entry/sense. The content of this element\n     * must exactly match that of a keb or reb element in another entry.\n     */\n    public List<String> getAnt(){\n        return this.ant;\n    }\n\n    /**\n     * Information about the field of application of the entry/sense.\n     * When absent, general application is implied. Entity coding for\n     * specific fields of application.\n     */\n    public List<String> getField(){\n        return this.field;\n    }\n\n    /**\n     * This element is used for other relevant information about\n     * the entry/sense. As with part-of-speech, information will usually\n     * apply to several senses.\n     */\n    public List<String> getMisc(){\n        return this.misc;\n    }\n\n    /**\n     * The sense-information elements provided for additional\n     * information to be recorded about a sense. Typical usage would\n     * be to indicate such things as level of currency of a sense, the\n     * regional variations, etc.\n     */\n    public List<String> getSInf(){\n        return this.s_inf;\n    }\n\n    /**\n     * This element records the information about the source\n     * language(s) of a loan-word/gairaigo. If the source language is other\n     * than English, the language is indicated by the xml:lang attribute.\n     * The element value (if any) is the source word or phrase.\n     */\n    public List<JmLsource> getLSource(){\n        return this.lsource;\n    }\n\n    /**\n     * For words specifically associated with regional dialects in\n     * Japanese, the entity code for that dialect, e.g. ksb for Kansaiben.\n     */\n    public List<String> getDial(){\n        return this.dial;\n    }\n\n    /**\n     * Within each sense will be one or more \"glosses\", i.e.\n     * target-language words or phrases which are equivalents to the\n     * Japanese word. This element would normally be present, however it\n     * may be omitted in entries which are purely for a cross-reference.\n     *\n     * Note: <!ELEMENT gloss (#PCDATA | pri)*>\n     *       <!ELEMENT pri (#PCDATA)>\n     *       These elements highlight particular target-language words which\n     *       are strongly associated with the Japanese word. The purpose is to\n     *       establish a set of target-language words which can effectively be\n     *       used as head-words in a reverse target-language/Japanese relationship.\n     */\n    public List<JmGloss> getGloss(){\n        return this.gloss;\n    }\n\n    /**\n     * The example elements provide for pairs of short Japanese and\n     * target-language phrases or sentences which exemplify the usage of the\n     * Japanese head-word and the target-language gloss. Words in example\n     * fields would typically not be indexed by a dictionary application.\n     */\n    public List<String> getExample(){\n        return this.example;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDict/JmParser.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.JmDict;\n\nimport android.util.Log;\n\nimport com.google.common.base.Joiner;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.sql.SQLException;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\n\nimport ca.fuwafuwa.kaku.Constants;\nimport ca.fuwafuwa.kaku.Database.DatabaseHelper;\nimport ca.fuwafuwa.kaku.Database.IDatabaseHelper;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.Entry;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.EntryOptimized;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.Kanji;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.KanjiIrregularity;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.KanjiPriority;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.Meaning;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningAdditionalInfo;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningAntonym;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningCrossReference;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningDialect;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningField;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningGloss;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningKanjiRestriction;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningLoanSource;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningMisc;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningPartOfSpeech;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.MeaningReadingRestriction;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.Reading;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.ReadingIrregularity;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.ReadingPriority;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.ReadingRestriction;\nimport ca.fuwafuwa.kaku.LangUtils;\nimport ca.fuwafuwa.kaku.XmlParsers.Interfaces.DictParser;\nimport ca.fuwafuwa.kaku.XmlParsers.JmDict.JmDTO.JmEntry;\nimport ca.fuwafuwa.kaku.XmlParsers.JmDict.JmDTO.JmGloss;\nimport ca.fuwafuwa.kaku.XmlParsers.JmDict.JmDTO.JmKEle;\nimport ca.fuwafuwa.kaku.XmlParsers.JmDict.JmDTO.JmLsource;\nimport ca.fuwafuwa.kaku.XmlParsers.JmDict.JmDTO.JmREle;\nimport ca.fuwafuwa.kaku.XmlParsers.JmDict.JmDTO.JmSense;\n\n/**\n * Created by 0xbad1d3a5 on 4/30/2016.\n */\npublic class JmParser implements DictParser {\n\n    private static final String TAG = JmParser.class.getName();\n\n    private IDatabaseHelper mDbHelper;\n    private int parseCount = 0;\n\n    public JmParser(IDatabaseHelper dbHelper){\n        mDbHelper = dbHelper;\n    }\n\n    @Override\n    public void parseDict(XmlPullParser parser) throws IOException, XmlPullParserException, SQLException {\n\n        while (!JmConsts.JMDICT.equals(parser.getName())){\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.START_TAG, null, JmConsts.JMDICT);\n        parser.nextToken();\n\n        while (!JmConsts.JMDICT.equals(parser.getName())){\n            String name = parser.getName() == null ? \"\" : parser.getName();\n            switch(name){\n                case JmConsts.ENTRY:\n                    parseJmEntry(parser);\n                    break;\n            }\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.END_TAG, null, JmConsts.JMDICT);\n    }\n\n    public void parseJmEntryOptimized(JmEntry jmEntry) throws SQLException {\n\n        List<EntryOptimized> optimizedEntries = new ArrayList<>();\n\n        // May be multiple kanji entries - first entry in k_ele is the primary entry\n        boolean isFirstEntry = true;\n        for (JmKEle kEle : jmEntry.getKEle())\n        {\n            EntryOptimized entryOptimized = new EntryOptimized();\n            entryOptimized.setKanji(kEle.getKeb());\n            entryOptimized.setPriorities(Joiner.on(\",\").join(kEle.getKePri()));\n            optimizedEntries.add(entryOptimized);\n\n            if (isFirstEntry)\n            {\n                entryOptimized.setPrimaryEntry(true);\n            }\n            isFirstEntry = false;\n        }\n\n        // If no kanji entries, the reading entry is the kanji\n        if (optimizedEntries.isEmpty())\n        {\n            for (JmREle rEle : jmEntry.getREle())\n            {\n                EntryOptimized entryOptimized = new EntryOptimized();\n                entryOptimized.setKanji(rEle.getReb());\n                entryOptimized.setOnlyKana(true);\n                entryOptimized.setPriorities(Joiner.on(\",\").join(rEle.getRePri()));\n                optimizedEntries.add(entryOptimized);\n\n                if (isFirstEntry)\n                {\n                    entryOptimized.setPrimaryEntry(true);\n                }\n                isFirstEntry = false;\n            }\n        }\n\n        for (EntryOptimized entryOptimized : optimizedEntries)\n        {\n            String kanji = entryOptimized.getKanji();\n            List<String> eoReadings = new ArrayList<>();\n            List<String> eoMeanings = new ArrayList<>();\n            Set eoPriorities = new HashSet<>(Arrays.asList(entryOptimized.getPriorities().split(\",\")));\n            List<String> eoPos = new ArrayList<>();\n\n            if (!entryOptimized.isOnlyKana())\n            {\n                for (JmREle rEle : jmEntry.getREle())\n                {\n                    List<String> readingRestriction = rEle.getReRestr();\n\n                    if (!readingRestriction.isEmpty() && readingRestriction.contains(kanji))\n                    {\n                        eoReadings.add(rEle.getReb());\n                        eoPriorities.addAll(rEle.getRePri());\n                    }\n                    else if (readingRestriction.isEmpty())\n                    {\n                        eoReadings.add(rEle.getReb());\n                        eoPriorities.addAll(rEle.getRePri());\n                    }\n                }\n            }\n\n            for (JmSense sense : jmEntry.getSense())\n            {\n                List<String> kanjiRestriction = sense.getStagk();\n                List<String> meaningSense = new ArrayList<>();\n\n                StringBuilder fullSense = new StringBuilder();\n\n                if (!kanjiRestriction.isEmpty() && kanjiRestriction.contains(kanji))\n                {\n                    for (JmGloss gloss : sense.getGloss())\n                    {\n                        if (gloss.isEnglish())\n                        {\n                            meaningSense.add(gloss.getText());\n                        }\n                    }\n                }\n                else if (kanjiRestriction.isEmpty())\n                {\n                    for (JmGloss gloss : sense.getGloss())\n                    {\n                        if (gloss.isEnglish())\n                        {\n                            meaningSense.add(gloss.getText());\n                        }\n                    }\n                }\n\n                fullSense.append(Joiner.on(\", \").join(meaningSense));\n\n                eoMeanings.add(fullSense.toString());\n                eoPos.add(Joiner.on(\",\").join(sense.getPos()));\n            }\n\n            eoPriorities.remove(null);\n            eoPriorities.remove(\"\");\n\n            entryOptimized.setReadings(Joiner.on(\", \").join(eoReadings));\n            entryOptimized.setMeanings(Joiner.on(Constants.DB_SPLIT_CHAR).join(eoMeanings));\n            entryOptimized.setPos(Joiner.on(Constants.DB_SPLIT_CHAR).join(eoPos));\n            entryOptimized.setPriorities(Joiner.on(\",\").join(eoPriorities));\n            entryOptimized.setDictionary(Constants.DB_JMDICT_NAME);\n\n            if (eoMeanings.size() != eoPos.size()){\n                throw new RuntimeException();\n            }\n\n            mDbHelper.getDbDao(EntryOptimized.class).create(entryOptimized);\n        }\n    }\n\n    private void parseJmEntry(XmlPullParser parser) throws IOException, XmlPullParserException, SQLException {\n\n        JmEntry jmEntry = new JmEntry(parser);\n\n        // Unneeded for now due to optimized entry\n        /*\n        Entry newEntry = new Entry();\n        newEntry.setId(jmEntry.getEntSeq());\n        mDbHelper.getDbDao(Entry.class).create(newEntry);\n\n        parseJmKanji(jmEntry, newEntry);\n        parseJmMeaning(jmEntry, newEntry);\n        parseJmReading(jmEntry, newEntry);\n        */\n\n        parseJmEntryOptimized(jmEntry);\n\n        if (++parseCount % 100 == 0){\n            Log.d(TAG, String.format(\"Parsed %d entries\", parseCount));\n        }\n    }\n\n    private void parseJmKanji(JmEntry jmEntry, Entry entry) throws SQLException {\n        for (JmKEle jmKanji : jmEntry.getKEle()){\n            Kanji newKanji = new Kanji();\n            newKanji.setFkEntry(entry);\n            newKanji.setKanji(jmKanji.getKeb());\n            mDbHelper.getDbDao(Kanji.class).create(newKanji);\n\n            parseJmKanjiIrregularity(jmKanji, newKanji);\n            parseJmKanjiPriority(jmKanji, newKanji);\n        }\n    }\n\n    private void parseJmKanjiIrregularity(JmKEle jmKEle, Kanji kanji) throws SQLException {\n        for (String jmKeInf : jmKEle.getKeInf()){\n            KanjiIrregularity newKanjiIrregularity = new KanjiIrregularity();\n            newKanjiIrregularity.setFkKanji(kanji);\n            newKanjiIrregularity.setKanjiIrregularity(jmKeInf);\n            mDbHelper.getDbDao(KanjiIrregularity.class).create(newKanjiIrregularity);\n        }\n    }\n\n    private void parseJmKanjiPriority(JmKEle jmKEle, Kanji kanji) throws SQLException {\n        for (String jmKePri : jmKEle.getKePri()){\n            KanjiPriority newKanjiPriority = new KanjiPriority();\n            newKanjiPriority.setFkKanji(kanji);\n            newKanjiPriority.setKanjiPriority(jmKePri);\n            mDbHelper.getDbDao(KanjiPriority.class).create(newKanjiPriority);\n        }\n    }\n\n    private void parseJmMeaning(JmEntry jmEntry, Entry entry) throws SQLException {\n        for (JmSense jmSense : jmEntry.getSense()){\n            Meaning newMeaning = new Meaning();\n            newMeaning.setFkEntry(entry);\n            mDbHelper.getDbDao(Meaning.class).create(newMeaning);\n\n            parseJmMeaningAdditionalInfo(jmSense, newMeaning);\n            parseJmMeaningAntonym(jmSense, newMeaning);\n            parseJmMeaningCrossReference(jmSense, newMeaning);\n            parseJmMeaningDialect(jmSense, newMeaning);\n            parseJmMeaningField(jmSense, newMeaning);\n            parseJmMeaningGloss(jmSense, newMeaning);\n            parseJmMeaningKanjiRestriction(jmSense, newMeaning);\n            parseJmMeaningLoanSource(jmSense, newMeaning);\n            parseJmMeaningMisc(jmSense, newMeaning);\n            parseJmMeaningPartOfSpeech(jmSense, newMeaning);\n            parseJmMeaningReadingRestriction(jmSense, newMeaning);\n        }\n    }\n\n    private void parseJmMeaningAdditionalInfo(JmSense jmSense, Meaning meaning) throws SQLException {\n        for (String jmSInf : jmSense.getSInf()){\n            MeaningAdditionalInfo newMeaningAdditionalInfo = new MeaningAdditionalInfo();\n            newMeaningAdditionalInfo.setFkMeaning(meaning);\n            newMeaningAdditionalInfo.setAdditionalInfo(jmSInf);\n            mDbHelper.getDbDao(MeaningAdditionalInfo.class).create(newMeaningAdditionalInfo);\n        }\n    }\n\n    private void parseJmMeaningAntonym(JmSense jmSense, Meaning meaning) throws SQLException {\n        for (String jmAnt : jmSense.getAnt()){\n            MeaningAntonym newMeaningAntonym = new MeaningAntonym();\n            newMeaningAntonym.setFkMeaning(meaning);\n            newMeaningAntonym.setAntonym(jmAnt);\n            mDbHelper.getDbDao(MeaningAntonym.class).create(newMeaningAntonym);\n        }\n    }\n\n    private void parseJmMeaningCrossReference(JmSense jmSense, Meaning meaning) throws SQLException {\n        for (String jmXRef : jmSense.getXRef()){\n            MeaningCrossReference newMeaningCrossReference = new MeaningCrossReference();\n            newMeaningCrossReference.setFkMeaning(meaning);\n            newMeaningCrossReference.setCrossReference(jmXRef);\n            mDbHelper.getDbDao(MeaningCrossReference.class).create(newMeaningCrossReference);\n        }\n    }\n\n    private void parseJmMeaningDialect(JmSense jmSense, Meaning meaning) throws SQLException {\n        for (String jmDial : jmSense.getDial()){\n            MeaningDialect newMeaningDialect = new MeaningDialect();\n            newMeaningDialect.setFkMeaning(meaning);\n            newMeaningDialect.setDialect(jmDial);\n            mDbHelper.getDbDao(MeaningDialect.class).create(newMeaningDialect);\n        }\n    }\n\n    private void parseJmMeaningField(JmSense jmSense, Meaning meaning) throws SQLException {\n        for (String jmField : jmSense.getField()){\n            MeaningField newMeaningField = new MeaningField();\n            newMeaningField.setFkMeaning(meaning);\n            newMeaningField.setField(jmField);\n            mDbHelper.getDbDao(MeaningField.class).create(newMeaningField);\n        }\n    }\n\n    private void parseJmMeaningGloss(JmSense jmSense, Meaning meaning) throws SQLException {\n        for (JmGloss jmGloss : jmSense.getGloss()){\n            if (jmGloss.getLang().equals(\"eng\")){\n                MeaningGloss newMeaningGloss = new MeaningGloss();\n                newMeaningGloss.setFkMeaning(meaning);\n                newMeaningGloss.setGender(jmGloss.getGender());\n                newMeaningGloss.setGloss(jmGloss.getText());\n                newMeaningGloss.setLang(jmGloss.getLang());\n                mDbHelper.getDbDao(MeaningGloss.class).create(newMeaningGloss);\n            }\n        }\n    }\n\n    private void parseJmMeaningKanjiRestriction(JmSense jmSense, Meaning meaning) throws SQLException {\n        for (String jmStagk : jmSense.getStagk()){\n            MeaningKanjiRestriction newMeaningKanjiRestriction = new MeaningKanjiRestriction();\n            newMeaningKanjiRestriction.setFkMeaning(meaning);\n            newMeaningKanjiRestriction.setKanjiRestriction(jmStagk);\n            mDbHelper.getDbDao(MeaningKanjiRestriction.class).create(newMeaningKanjiRestriction);\n        }\n    }\n\n    private void parseJmMeaningLoanSource(JmSense jmSense, Meaning meaning) throws SQLException {\n        for (JmLsource jmLSource : jmSense.getLSource()){\n            MeaningLoanSource newMeaningLoanSource = new MeaningLoanSource();\n            newMeaningLoanSource.setFkMeaning(meaning);\n            newMeaningLoanSource.setLang(jmLSource.getLang());\n            newMeaningLoanSource.setLoanSource(jmLSource.getText());\n            newMeaningLoanSource.setType(jmLSource.getLsType());\n            newMeaningLoanSource.setWaseieigo(jmLSource.getLsWasei());\n            mDbHelper.getDbDao(MeaningLoanSource.class).create(newMeaningLoanSource);\n        }\n    }\n\n    private void parseJmMeaningMisc(JmSense jmSense, Meaning meaning) throws SQLException {\n        for (String jmMisc : jmSense.getMisc()){\n            MeaningMisc newMeaningMisc = new MeaningMisc();\n            newMeaningMisc.setFkMeaning(meaning);\n            newMeaningMisc.setMisc(jmMisc);\n            mDbHelper.getDbDao(MeaningMisc.class).create(newMeaningMisc);\n        }\n    }\n\n    private void parseJmMeaningPartOfSpeech(JmSense jmSense, Meaning meaning) throws SQLException {\n        for (String jmPos : jmSense.getPos()){\n            MeaningPartOfSpeech newMeaningPartOfSpeech = new MeaningPartOfSpeech();\n            newMeaningPartOfSpeech.setFkMeaning(meaning);\n            newMeaningPartOfSpeech.setPartOfSpeech(jmPos);\n            mDbHelper.getDbDao(MeaningPartOfSpeech.class).create(newMeaningPartOfSpeech);\n        }\n    }\n\n    private void parseJmMeaningReadingRestriction(JmSense jmSense, Meaning meaning) throws SQLException {\n        for (String jmStagr : jmSense.getStagr()){\n            MeaningReadingRestriction newMeaningReadingRestriction = new MeaningReadingRestriction();\n            newMeaningReadingRestriction.setFkMeaning(meaning);\n            newMeaningReadingRestriction.setReadingRestriction(jmStagr);\n            mDbHelper.getDbDao(MeaningReadingRestriction.class).create(newMeaningReadingRestriction);\n        }\n    }\n\n    private void parseJmReading(JmEntry jmEntry, Entry entry) throws SQLException {\n        for (JmREle jmREle : jmEntry.getREle()){\n            Reading newReading = new Reading();\n            newReading.setFkEntry(entry);\n            newReading.setReading(jmREle.getReb());\n            newReading.setFalseReading(jmREle.getReNoKanji());\n            mDbHelper.getDbDao(Reading.class).create(newReading);\n\n            parseJmReadingIrregularity(jmREle, newReading);\n            parseJmReadingPriority(jmREle, newReading);\n            parseJmReadingRestriction(jmREle, newReading);\n        }\n    }\n\n    private void parseJmReadingIrregularity(JmREle jmREle, Reading reading) throws SQLException {\n        for (String jmReInf : jmREle.getReInf()){\n            ReadingIrregularity newReadingIrregularity = new ReadingIrregularity();\n            newReadingIrregularity.setFkReading(reading);\n            newReadingIrregularity.setReadingIrregularity(jmReInf);\n            mDbHelper.getDbDao(ReadingIrregularity.class).create(newReadingIrregularity);\n        }\n    }\n\n    private void parseJmReadingPriority(JmREle jmREle, Reading reading) throws SQLException {\n        for (String jmRePri : jmREle.getRePri()){\n            ReadingPriority newReadingPriority = new ReadingPriority();\n            newReadingPriority.setFkReading(reading);\n            newReadingPriority.setReadingPriority(jmRePri);\n            mDbHelper.getDbDao(ReadingPriority.class).create(newReadingPriority);\n        }\n    }\n    private void parseJmReadingRestriction(JmREle jmREle, Reading reading) throws SQLException {\n        for (String jmReRestr : jmREle.getReRestr()){\n            ReadingRestriction newReadingRestriction = new ReadingRestriction();\n            newReadingRestriction.setFkReading(reading);\n            newReadingRestriction.setReadingRestriction(jmReRestr);\n            mDbHelper.getDbDao(ReadingRestriction.class).create(newReadingRestriction);\n        }\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/KanjiDict2/Kd2Consts.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.KanjiDict2;\n\n/**\n * Created by 0xbad1d3a5 on 11/30/2016.\n */\n\npublic class Kd2Consts {\n\n    // Elements\n    public static final String KANJIDIC2 = \"kanjidic2\";\n    public static final String HEADER = \"header\";\n    public static final String FILE_VERSION = \"file_version\";\n    public static final String DATABASE_VERSION = \"database_version\";\n    public static final String DATE_OF_CREATION = \"date_of_creation\";\n    public static final String CHARACTER = \"character\";\n    public static final String LITERAL = \"literal\";\n    public static final String CODEPOINT = \"codepoint\";\n    public static final String CP_VALUE = \"cp_value\";\n    public static final String RADICAL = \"radical\";\n    public static final String RAD_VALUE = \"rad_value\";\n    public static final String MISC = \"misc\";\n    public static final String GRADE = \"grade\";\n    public static final String STROKE_COUNT = \"stroke_count\";\n    public static final String VARIANT = \"variant\";\n    public static final String FREQ = \"freq\";\n    public static final String RAD_NAME = \"rad_name\";\n    public static final String JLPT = \"jlpt\";\n    public static final String DIC_NUMBER = \"dic_number\";\n    public static final String DIC_REF = \"dic_ref\";\n    public static final String QUERY_CODE = \"query_code\";\n    public static final String Q_CODE = \"q_code\";\n    public static final String READING_MEANING = \"reading_meaning\";\n    public static final String RMGROUP = \"rmgroup\";\n    public static final String READING = \"reading\";\n    public static final String MEANING = \"meaning\";\n    public static final String NANORI = \"nanori\";\n\n    // Attributes\n    public static final String CP_TYPE = \"cp_type\";\n    public static final String RAD_TYPE = \"rad_type\";\n    public static final String VAR_TYPE = \"var_type\";\n    public static final String DR_TYPE = \"dr_type\";\n    public static final String M_VOL = \"m_vol\";\n    public static final String M_PAGE = \"m_page\";\n    public static final String QC_TYPE = \"qc_type\";\n    public static final String SKIP_MISCLASS = \"skip_misclass\";\n    public static final String R_TYPE =  \"r_type\";\n    public static final String ON_TYPE = \"on_type\";\n    public static final String R_STATUS = \"r_status\";\n    public static final String M_LANG = \"m_lang\";\n\n    // Attribute values\n    public static final String R_TYPE_PINYIN = \"pinyin\";\n    public static final String R_TYPE_KOREAN_R = \"korean_r\";\n    public static final String R_TYPE_KOREAN_H = \"korean_h\";\n    public static final String R_TYPE_VIETNAM = \"vietnam\";\n    public static final String R_TYPE_JA_ON = \"ja_on\";\n    public static final String R_TYPE_JA_KUN = \"ja_kun\";\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/KanjiDict2/Kd2DTO/Kd2Character.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\n\nimport ca.fuwafuwa.kaku.XmlParsers.CommonParser;\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2Consts;\n\n/**\n * Created by 0xbad1d3a5 on 11/30/2016.\n */\n\npublic class Kd2Character {\n\n    private static final String XMLTAG = Kd2Consts.CHARACTER;\n\n    private String literal =  null;\n    private Kd2Codepoint codepoint = null;\n    private Kd2Radical radical = null;\n    private Kd2Misc misc = null;\n    private Kd2DicNumber dic_number = null;\n    private Kd2QueryCode query_code = null;\n    private Kd2ReadingMeaning reading_meaning = null;\n\n    public Kd2Character(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n        parser.nextToken();\n\n        while (!XMLTAG.equals(parser.getName())){\n            String name = parser.getName() == null ? \"\" : parser.getName();\n            switch(name){\n                case Kd2Consts.LITERAL:\n                    literal = CommonParser.parseString(parser);\n                    break;\n                case Kd2Consts.CODEPOINT:\n                    codepoint = new Kd2Codepoint(parser);\n                    break;\n                case Kd2Consts.RADICAL:\n                    radical = new Kd2Radical(parser);\n                    break;\n                case Kd2Consts.MISC:\n                    misc = new Kd2Misc(parser);\n                    break;\n                case Kd2Consts.DIC_NUMBER:\n                    dic_number = new Kd2DicNumber(parser);\n                    break;\n                case Kd2Consts.QUERY_CODE:\n                    query_code = new Kd2QueryCode(parser);\n                    break;\n                case Kd2Consts.READING_MEANING:\n                    reading_meaning = new Kd2ReadingMeaning(parser);\n                    break;\n            }\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.END_TAG, null, XMLTAG);\n    }\n\n    public String getLiteral() {\n        return literal;\n    }\n\n    public Kd2Codepoint getCodepoint() {\n        return codepoint;\n    }\n\n    public Kd2Radical getRadical() {\n        return radical;\n    }\n\n    public Kd2Misc getMisc() {\n        return misc;\n    }\n\n    public Kd2DicNumber getDic_number() {\n        return dic_number;\n    }\n\n    public Kd2QueryCode getQuery_code() {\n        return query_code;\n    }\n\n    public Kd2ReadingMeaning getReading_meaning() {\n        return reading_meaning;\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/KanjiDict2/Kd2DTO/Kd2Codepoint.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2Consts;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\npublic class Kd2Codepoint {\n\n    private static final String XMLTAG = Kd2Consts.CODEPOINT;\n\n    private List<Kd2CpValue> cp_value = new ArrayList<>();\n\n    public Kd2Codepoint(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n        parser.nextToken();\n\n        while (!XMLTAG.equals(parser.getName())){\n            String name = parser.getName() == null ? \"\" : parser.getName();\n            switch(name){\n                case Kd2Consts.CP_VALUE:\n                    cp_value.add(new Kd2CpValue(parser));\n                    break;\n            }\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.END_TAG, null, XMLTAG);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/KanjiDict2/Kd2DTO/Kd2CpValue.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.HashMap;\n\nimport ca.fuwafuwa.kaku.XmlParsers.CommonParser;\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2Consts;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\npublic class Kd2CpValue {\n\n    private static final String XMLTAG = Kd2Consts.CP_VALUE;\n\n    private String cp_type = null;\n    private String text = null;\n\n    public Kd2CpValue(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n\n        HashMap<String, String> attrMap = CommonParser.parseAttributes(parser);\n        cp_type = attrMap.get(Kd2Consts.CP_TYPE);\n        text = CommonParser.parseString(parser);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/KanjiDict2/Kd2DTO/Kd2DicNumber.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2Consts;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\npublic class Kd2DicNumber {\n\n    private static final String XMLTAG = Kd2Consts.DIC_NUMBER;\n\n    private List<Kd2DicRef> dic_ref = new ArrayList<>();\n\n    public Kd2DicNumber(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n        parser.nextToken();\n\n        while (!XMLTAG.equals(parser.getName())){\n            String name = parser.getName() == null ? \"\" : parser.getName();\n            switch(name){\n                case Kd2Consts.DIC_REF:\n                    dic_ref.add(new Kd2DicRef(parser));\n                    break;\n            }\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.END_TAG, null, XMLTAG);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/KanjiDict2/Kd2DTO/Kd2DicRef.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.HashMap;\n\nimport ca.fuwafuwa.kaku.XmlParsers.CommonParser;\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2Consts;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\npublic class Kd2DicRef {\n\n    private static final String XMLTAG = Kd2Consts.DIC_REF;\n\n    private String dr_type = null;\n    private String m_vol = null;\n    private String m_page = null;\n    private String text = null;\n\n    public Kd2DicRef(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n\n        HashMap<String, String> attrMap = CommonParser.parseAttributes(parser);\n        dr_type = attrMap.get(Kd2Consts.DR_TYPE);\n        m_vol = attrMap.get(Kd2Consts.M_VOL);\n        m_page = attrMap.get(Kd2Consts.M_PAGE);\n        text = CommonParser.parseString(parser);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/KanjiDict2/Kd2DTO/Kd2Meaning.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.HashMap;\n\nimport ca.fuwafuwa.kaku.XmlParsers.CommonParser;\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2Consts;\n\n/**\n * Created by 0xbad1d3a5 on 12/2/2016.\n */\npublic class Kd2Meaning {\n\n    private static final String XMLTAG = Kd2Consts.MEANING;\n\n    private String m_lang = null;\n    private String text = null;\n\n    public Kd2Meaning(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n\n        HashMap<String, String> attrMap = CommonParser.parseAttributes(parser);\n        m_lang = attrMap.get(Kd2Consts.M_LANG);\n        text = CommonParser.parseString(parser);\n    }\n\n    public String getM_lang() {\n        return m_lang;\n    }\n\n    public String getText() {\n        return text;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/KanjiDict2/Kd2DTO/Kd2Misc.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport ca.fuwafuwa.kaku.XmlParsers.CommonParser;\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2Consts;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\npublic class Kd2Misc {\n\n    private static final String XMLTAG = Kd2Consts.MISC;\n\n    private String grade = null;\n    private List<String> stroke_count = new ArrayList<>();\n    private List<Kd2Variant> variant = new ArrayList<>();\n    private String freq = null;\n    private List<String> rad_name = new ArrayList<>();\n    private String jlpt = null;\n\n    public Kd2Misc(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n        parser.nextToken();\n\n        while (!XMLTAG.equals(parser.getName())){\n            String name = parser.getName() == null ? \"\" : parser.getName();\n            switch(name){\n                case Kd2Consts.GRADE:\n                    grade = CommonParser.parseString(parser);\n                    break;\n                case Kd2Consts.STROKE_COUNT:\n                    stroke_count.add(CommonParser.parseString(parser));\n                    break;\n                case Kd2Consts.VARIANT:\n                    variant.add(new Kd2Variant(parser));\n                    break;\n                case Kd2Consts.FREQ:\n                    freq = CommonParser.parseString(parser);\n                    break;\n                case Kd2Consts.RAD_NAME:\n                    rad_name.add(CommonParser.parseString(parser));\n                    break;\n                case Kd2Consts.JLPT:\n                    jlpt = CommonParser.parseString(parser);\n                    break;\n            }\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.END_TAG, null, XMLTAG);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/KanjiDict2/Kd2DTO/Kd2QCode.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.HashMap;\n\nimport ca.fuwafuwa.kaku.XmlParsers.CommonParser;\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2Consts;\n\n/**\n * Created by 0xbad1d3a5 on 12/2/2016.\n */\npublic class Kd2QCode {\n\n    private static final String XMLTAG = Kd2Consts.Q_CODE;\n\n    private String qc_type = null;\n    private String skip_misclass = null;\n    private String text = null;\n\n    public Kd2QCode(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n\n        HashMap<String, String> attrMap = CommonParser.parseAttributes(parser);\n        qc_type = attrMap.get(Kd2Consts.QC_TYPE);\n        skip_misclass = attrMap.get(Kd2Consts.SKIP_MISCLASS);\n        text = CommonParser.parseString(parser);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/KanjiDict2/Kd2DTO/Kd2QueryCode.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2Consts;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\npublic class Kd2QueryCode {\n\n    private static final String XMLTAG = Kd2Consts.QUERY_CODE;\n\n    List<Kd2QCode> q_code = new ArrayList<>();\n\n    public Kd2QueryCode(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n        parser.nextToken();\n\n        while (!XMLTAG.equals(parser.getName())){\n            String name = parser.getName() == null ? \"\" : parser.getName();\n            switch(name){\n                case Kd2Consts.Q_CODE:\n                    q_code.add(new Kd2QCode(parser));\n                    break;\n            }\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.END_TAG, null, XMLTAG);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/KanjiDict2/Kd2DTO/Kd2RadValue.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.HashMap;\n\nimport ca.fuwafuwa.kaku.XmlParsers.CommonParser;\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2Consts;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\n\npublic class Kd2RadValue {\n\n    private static final String XMLTAG = Kd2Consts.RAD_VALUE;\n\n    private String rad_type = null;\n    private String text = null;\n\n    public Kd2RadValue(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n\n        HashMap<String, String> attrMap = CommonParser.parseAttributes(parser);\n        rad_type = attrMap.get(Kd2Consts.RAD_TYPE);\n        text = CommonParser.parseString(parser);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/KanjiDict2/Kd2DTO/Kd2Radical.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2Consts;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\npublic class Kd2Radical {\n\n    private static final String XMLTAG = Kd2Consts.RADICAL;\n\n    private List<Kd2RadValue> rad_value = new ArrayList<>();\n\n    public Kd2Radical(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n        parser.nextToken();\n\n        while (!XMLTAG.equals(parser.getName())){\n            String name = parser.getName() == null ? \"\" : parser.getName();\n            switch(name){\n                case Kd2Consts.RAD_VALUE:\n                    rad_value.add(new Kd2RadValue(parser));\n            }\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.END_TAG, null, XMLTAG);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/KanjiDict2/Kd2DTO/Kd2Reading.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO;\n\n//import junit.framework.Assert;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.HashMap;\n\nimport ca.fuwafuwa.kaku.XmlParsers.CommonParser;\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2Consts;\n\n/**\n * Created by 0xbad1d3a5 on 12/2/2016.\n */\npublic class Kd2Reading {\n\n    private static final String XMLTAG = Kd2Consts.READING;\n\n    private String r_type = null;\n    private String on_type = null;\n    private String r_status = null;\n    private String text = null;\n\n    public Kd2Reading(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n\n        HashMap<String, String> attrMap = CommonParser.parseAttributes(parser);\n        r_type = attrMap.get(Kd2Consts.R_TYPE);\n        on_type = attrMap.get(Kd2Consts.ON_TYPE);\n        r_status = attrMap.get(Kd2Consts.R_STATUS);\n        text = CommonParser.parseString(parser);\n\n        //Assert.assertNull(\"Depreciated\", on_type);\n        //Assert.assertNull(\"Depreciated\", r_status);\n    }\n\n    public String getR_type() {\n        return r_type;\n    }\n\n    public String getOn_type() {\n        return on_type;\n    }\n\n    public String getR_status() {\n        return r_status;\n    }\n\n    public String getText() {\n        return text;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/KanjiDict2/Kd2DTO/Kd2ReadingMeaning.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport ca.fuwafuwa.kaku.XmlParsers.CommonParser;\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2Consts;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\npublic class Kd2ReadingMeaning {\n\n    private static final String XMLTAG = Kd2Consts.READING_MEANING;\n\n    private List<Kd2RmGroup> rmgroups = new ArrayList<>();\n    private List<String> nanori = new ArrayList<>();\n\n    public Kd2ReadingMeaning(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n        parser.nextToken();\n\n        while (!XMLTAG.equals(parser.getName())){\n            String name = parser.getName() == null ? \"\" : parser.getName();\n            switch(name){\n                case Kd2Consts.RMGROUP:\n                    rmgroups.add(new Kd2RmGroup(parser));\n                    break;\n                case Kd2Consts.NANORI:\n                    nanori.add(CommonParser.parseString(parser));\n                    break;\n            }\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.END_TAG, null, XMLTAG);\n    }\n\n    public List<Kd2RmGroup> getRmGroups(){\n        return rmgroups;\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/KanjiDict2/Kd2DTO/Kd2RmGroup.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.ArrayList;\nimport java.util.List;\n\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2Consts;\n\n/**\n * Created by 0xbad1d3a5 on 12/2/2016.\n */\npublic class Kd2RmGroup {\n\n    private static final String XMLTAG = Kd2Consts.RMGROUP;\n\n    private List<Kd2Reading> readings = new ArrayList<>();\n    private List<Kd2Meaning> meanings = new ArrayList<>();\n\n    public Kd2RmGroup(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n        parser.nextToken();\n\n        while (!XMLTAG.equals(parser.getName())){\n            String name = parser.getName() == null ? \"\" : parser.getName();\n            switch(name){\n                case Kd2Consts.READING:\n                    readings.add(new Kd2Reading(parser));\n                    break;\n                case Kd2Consts.MEANING:\n                    meanings.add(new Kd2Meaning(parser));\n                    break;\n            }\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.END_TAG, null, XMLTAG);\n    }\n\n    public List<Kd2Reading> getReadings() {\n        return readings;\n    }\n\n    public List<Kd2Meaning> getMeanings() {\n        return meanings;\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/KanjiDict2/Kd2DTO/Kd2Variant.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.util.HashMap;\n\nimport ca.fuwafuwa.kaku.XmlParsers.CommonParser;\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2Consts;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\npublic class Kd2Variant {\n\n    private static final String XMLTAG = Kd2Consts.VARIANT;\n\n    private String var_type = null;\n    private String text = null;\n\n    public Kd2Variant(XmlPullParser parser) throws IOException, XmlPullParserException {\n        parser.require(XmlPullParser.START_TAG, null, XMLTAG);\n\n        HashMap<String, String> attrMap = CommonParser.parseAttributes(parser);\n        var_type = attrMap.get(Kd2Consts.VAR_TYPE);\n        text = CommonParser.parseString(parser);\n    }\n}"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/KanjiDict2/Kd2Parser.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers.KanjiDict2;\n\nimport android.util.Log;\n\nimport com.google.common.base.Function;\nimport com.google.common.base.Joiner;\nimport com.google.common.base.Predicate;\nimport com.google.common.collect.Collections2;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.IOException;\nimport java.sql.SQLException;\nimport java.util.Collection;\nimport java.util.List;\n\nimport ca.fuwafuwa.kaku.Constants;\nimport ca.fuwafuwa.kaku.Database.DatabaseHelper;\nimport ca.fuwafuwa.kaku.Database.IDatabaseHelper;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.EntryOptimized;\nimport ca.fuwafuwa.kaku.Database.KanjiDict2Database.Models.CharacterOptimized;\nimport ca.fuwafuwa.kaku.XmlParsers.Interfaces.DictParser;\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO.Kd2Character;\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO.Kd2Meaning;\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO.Kd2Reading;\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2DTO.Kd2RmGroup;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\n\npublic class Kd2Parser implements DictParser {\n\n    private static final String TAG = Kd2Parser.class.getName();\n\n    private IDatabaseHelper mDbHelper;\n    private int parseCount = 0;\n\n    Kd2Parser(IDatabaseHelper dbHelper){\n        mDbHelper = dbHelper;\n    }\n\n    @Override\n    public void parseDict(XmlPullParser parser) throws IOException, XmlPullParserException, SQLException {\n\n        while (!Kd2Consts.KANJIDIC2.equals(parser.getName())){\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.START_TAG, null, Kd2Consts.KANJIDIC2);\n        parser.nextToken();\n        parseHeader(parser);\n\n        while (!Kd2Consts.KANJIDIC2.equals(parser.getName())){\n            String name = parser.getName() == null ? \"\" : parser.getName();\n            switch (name) {\n                case Kd2Consts.CHARACTER:\n                    parseKd2Character(parser);\n                    break;\n            }\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.END_TAG, null, Kd2Consts.KANJIDIC2);\n    }\n\n    // Skip the header, we don't care\n    private void parseHeader(XmlPullParser parser) throws IOException, XmlPullParserException {\n\n        while (!Kd2Consts.HEADER.equals(parser.getName())){\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.START_TAG, null, Kd2Consts.HEADER);\n        parser.nextToken();\n\n        while (!Kd2Consts.HEADER.equals(parser.getName())){\n            parser.nextToken();\n        }\n\n        parser.require(XmlPullParser.END_TAG, null, Kd2Consts.HEADER);\n    }\n\n    private void parseKd2Character(XmlPullParser parser) throws IOException, XmlPullParserException, SQLException {\n\n        Kd2Character kd2Character = new Kd2Character(parser);\n\n        parseKd2CharacterOptimized(kd2Character);\n\n        if (++parseCount % 100 == 0){\n            Log.d(TAG, String.format(\"Parsed %d entries\", parseCount));\n        }\n    }\n\n    private void parseKd2CharacterOptimized(Kd2Character character) throws SQLException {\n\n        if (character.getReading_meaning() == null){\n            return;\n        }\n\n        List<Kd2RmGroup> kd2RmGroups = character.getReading_meaning().getRmGroups();\n\n        for (Kd2RmGroup rmGroup : kd2RmGroups)\n        {\n            EntryOptimized eo = new EntryOptimized();\n\n            eo.setKanji(character.getLiteral());\n            eo.setReadings(String.format(\"(%s) [%s]\", parseKd2CharacterOptimizedOnyomi(rmGroup), parseKd2CharacterOptimizedKunyomi(rmGroup)));\n            eo.setMeanings(parseKd2CharacterOptimizedMeaning(rmGroup));\n            eo.setDictionary(Constants.DB_KANJIDICT_NAME);\n\n            mDbHelper.getDbDao(EntryOptimized.class).create(eo);\n        }\n    }\n\n    private String parseKd2CharacterOptimizedOnyomi(Kd2RmGroup rmGroup){\n\n        Collection<Kd2Reading> onReadings = Collections2.filter(rmGroup.getReadings(), new Predicate<Kd2Reading>() {\n            @Override\n            public boolean apply(Kd2Reading input) {\n                return Kd2Consts.R_TYPE_JA_ON.equals(input.getR_type());\n            }\n        });\n\n        Collection<String> onStringReadings = Collections2.transform(onReadings, new Function<Kd2Reading, String>() {\n            @Override\n            public String apply(Kd2Reading input) {\n                return input.getText();\n            }\n        });\n\n        return Joiner.on(\", \").join(onStringReadings);\n    }\n\n    private String parseKd2CharacterOptimizedKunyomi(Kd2RmGroup rmGroup){\n\n        Collection<Kd2Reading> kunReadings = Collections2.filter(rmGroup.getReadings(), new Predicate<Kd2Reading>() {\n            @Override\n            public boolean apply(Kd2Reading input) {\n                return Kd2Consts.R_TYPE_JA_KUN.equals(input.getR_type());\n            }\n        });\n\n        Collection<String> kunStringReadings = Collections2.transform(kunReadings, new Function<Kd2Reading, String>() {\n            @Override\n            public String apply(Kd2Reading input) {\n                return input.getText();\n            }\n        });\n\n        return Joiner.on(\", \").join(kunStringReadings);\n    }\n\n    private String parseKd2CharacterOptimizedMeaning(Kd2RmGroup rmGroup){\n\n        Collection<Kd2Meaning> meanings = Collections2.filter(rmGroup.getMeanings(), new Predicate<Kd2Meaning>() {\n            @Override\n            public boolean apply(Kd2Meaning input) {\n                return input.getM_lang() == null || \"en\".equals(input.getM_lang());\n            }\n        });\n\n        Collection<String> stringMeanings = Collections2.transform(meanings, new Function<Kd2Meaning, String>() {\n            @Override\n            public String apply(Kd2Meaning input) {\n                return input.getText();\n            }\n        });\n\n        return Joiner.on(Constants.DB_SPLIT_CHAR).join(stringMeanings);\n    }\n}\n"
  },
  {
    "path": "app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/ParserRunnable.java",
    "content": "package ca.fuwafuwa.kaku.XmlParsers;\n\nimport android.content.Context;\nimport android.util.Log;\nimport android.util.Xml;\n\nimport com.j256.ormlite.misc.TransactionManager;\n\nimport org.xmlpull.v1.XmlPullParser;\nimport org.xmlpull.v1.XmlPullParserException;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.FileNotFoundException;\nimport java.lang.reflect.InvocationTargetException;\nimport java.sql.SQLException;\nimport java.util.concurrent.Callable;\n\nimport ca.fuwafuwa.kaku.Database.DatabaseHelper;\nimport ca.fuwafuwa.kaku.Database.DbHelperFactory;\nimport ca.fuwafuwa.kaku.Database.IDatabaseHelper;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.JmDatabaseHelper;\nimport ca.fuwafuwa.kaku.Database.KanjiDict2Database.Kd2DatabaseHelper;\nimport ca.fuwafuwa.kaku.XmlParsers.Interfaces.DictParser;\nimport ca.fuwafuwa.kaku.XmlParsers.JmDict.JmParser;\nimport ca.fuwafuwa.kaku.XmlParsers.KanjiDict2.Kd2Parser;\n\n/**\n * Created by 0xbad1d3a5 on 12/1/2016.\n */\n\npublic class ParserRunnable implements Runnable {\n\n    private static final String TAG = ParserRunnable.class.getName();\n\n    Context mContext;\n    DbHelperFactory mDbHelperFactory;\n\n    public ParserRunnable(Context context) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, FileNotFoundException\n    {\n        mContext = context;\n        mDbHelperFactory = new DbHelperFactory(context);\n    }\n\n    @Override\n    public void run()\n    {\n        try\n        {\n            parseDictionary(JmDatabaseHelper.class, JmParser.class, \"JMdict_e.xml\");\n            parseDictionary(Kd2DatabaseHelper.class, Kd2Parser.class, \"kanjidic2.xml\");\n        } catch (Exception e)\n        {\n            e.printStackTrace();\n        }\n    }\n\n    private void parseDictionary(Class dbHelperClass, Class dictParserClass, String fileName) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, FileNotFoundException, XmlPullParserException, SQLException\n    {\n        long startTime = System.currentTimeMillis();\n\n        DatabaseHelper mDbHelper = mDbHelperFactory.instance(dbHelperClass);\n        final DictParser mDictParser = (DictParser) dictParserClass.getConstructor(IDatabaseHelper.class).newInstance(mDbHelper);\n        FileInputStream mDictXml = new FileInputStream(new File(mContext.getFilesDir(), fileName));\n\n        final XmlPullParser mParser = Xml.newPullParser();\n        mDbHelper.deleteDatabase();\n        mParser.setInput(mDictXml, null);\n\n        TransactionManager.callInTransaction(mDbHelper.getConnectionSource(), new Callable<Void>() {\n            @Override\n            public Void call() throws Exception {\n                mDictParser.parseDict(mParser);\n                return null;\n            }\n        });\n\n        Log.d(TAG, String.format(\"FINISHED DICT, TOOK %d\", System.currentTimeMillis() - startTime));\n    }\n}\n"
  },
  {
    "path": "app/src/main/res/anim/fade_repeat.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<alpha xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:fromAlpha=\"0.0\"\n    android:toAlpha=\"1.0\"\n    android:duration=\"500\"\n    android:repeatCount=\"infinite\"\n    android:repeatMode=\"reverse\"\n    />"
  },
  {
    "path": "app/src/main/res/anim/slide_in.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<translate xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:duration=\"250\"\n    android:fromYDelta=\"-100%\"\n    android:toYDelta=\"0%\"\n     />"
  },
  {
    "path": "app/src/main/res/drawable/bg_solid_border_0_blue_black.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:shape=\"rectangle\">\n    <stroke\n        android:width=\"1dp\"\n        android:color=\"@color/PrimaryDark\"/>\n    <solid android:color=\"@color/blue_solid_highlight\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/bg_solid_border_0_white_black.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:shape=\"rectangle\">\n    <stroke\n        android:width=\"1dp\"\n        android:color=\"@color/PrimaryDark\"/>\n    <solid android:color=\"@android:color/white\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/bg_solid_border_corners_0_white_black_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"#CABBBBBB\"/>\n            <corners android:radius=\"2dp\" />\n        </shape>\n    </item>\n\n    <item\n        android:left=\"1dp\"\n        android:right=\"1dp\"\n        android:top=\"1dp\"\n        android:bottom=\"1dp\">\n        <shape android:shape=\"rectangle\">\n            <solid android:color=\"@android:color/white\"/>\n            <corners android:radius=\"1dp\" />\n        </shape>\n    </item>\n</layer-list>"
  },
  {
    "path": "app/src/main/res/drawable/bg_translucent_border_0_black_black.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:shape=\"rectangle\">\n    <stroke\n        android:width=\"1dp\"\n        android:color=\"@color/PrimaryDark\"/>\n    <solid android:color=\"@color/black100a\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/bg_translucent_border_0_blue_blue.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:shape=\"rectangle\">\n    <corners\n        android:radius=\"0dp\"/>\n    <stroke\n        android:width=\"1dp\"\n        android:color=\"@color/blue_dark\"/>\n    <solid android:color=\"@color/blue_dark_translucent\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/bg_transparent_border_0_nil_black.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:shape=\"rectangle\">\n    <stroke\n        android:width=\"1dp\"\n        android:color=\"@color/black100a\"/>\n    <solid android:color=\"@android:color/transparent\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/bg_transparent_border_0_nil_default.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:shape=\"rectangle\">\n    <corners\n        android:radius=\"0dp\"/>\n    <stroke\n        android:width=\"1dp\"\n        android:color=\"@color/blue_dark\"/>\n    <solid android:color=\"@android:color/transparent\"/>\n</shape>"
  },
  {
    "path": "app/src/main/res/drawable/bg_transparent_border_0_nil_ready.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<layer-list xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <item>\n        <shape\n               android:shape=\"rectangle\">\n            <corners\n                android:radius=\"0dp\"/>\n            <stroke\n                android:width=\"1dp\"\n                android:color=\"@color/blue_dark\"/>\n            <solid android:color=\"@android:color/transparent\"/>\n        </shape>\n    </item>\n    <item>\n        <shape\n            android:shape=\"rectangle\">\n            <corners\n                android:radius=\"0dp\"/>\n            <stroke\n                android:width=\"1px\"\n                android:color=\"@color/red_capture_window_ready\"/>\n            <solid android:color=\"@android:color/transparent\"/>\n        </shape>\n    </item>\n</layer-list>"
  },
  {
    "path": "app/src/main/res/drawable-anydpi/icon_delete.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"33.6\"\n    android:viewportHeight=\"33.6\"\n    android:tint=\"#C80000\">\n  <group android:translateX=\"4.8\"\n      android:translateY=\"4.8\">\n      <path\n          android:fillColor=\"#FF000000\"\n          android:pathData=\"M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z\"/>\n  </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable-anydpi/icon_edit.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"33.6\"\n    android:viewportHeight=\"33.6\"\n    android:tint=\"#C80000\">\n  <group android:translateX=\"4.8\"\n      android:translateY=\"4.8\">\n      <path\n          android:fillColor=\"#FF000000\"\n          android:pathData=\"M3,17.25V21h3.75L17.81,9.94l-3.75,-3.75L3,17.25zM20.71,7.04c0.39,-0.39 0.39,-1.02 0,-1.41l-2.34,-2.34c-0.39,-0.39 -1.02,-0.39 -1.41,0l-1.83,1.83 3.75,3.75 1.83,-1.83z\"/>\n  </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/drawable-anydpi/icon_swap.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"33.6\"\n    android:viewportHeight=\"33.6\"\n    android:tint=\"#C80000\">\n  <group android:translateX=\"4.8\"\n      android:translateY=\"4.8\">\n      <path\n          android:fillColor=\"#FF000000\"\n          android:pathData=\"M6.99,11L3,15l3.99,4v-3H14v-2H6.99v-3zM21,9l-3.99,-4v3H10v2h7.01v3L21,9z\"/>\n  </group>\n</vector>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_beta.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".BetaActivity\"\n    android:background=\"@android:color/black\"\n    android:orientation=\"vertical\">\n\n    <TextView\n        android:id=\"@+id/hello\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"0dp\"\n        android:layout_marginStart=\"24dp\"\n        android:text=\"Hello, 画 Beta User!\"\n        android:textColor=\"@android:color/white\"\n        android:gravity=\"center_vertical\"\n        android:textSize=\"25sp\"\n        android:layout_weight=\"1\" />\n\n    <ScrollView\n        android:id=\"@+id/scroll_message\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"5\"\n        android:paddingLeft=\"24dp\"\n        android:paddingRight=\"24dp\">\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"@string/beta_screen\"\n            android:textColor=\"@android:color/white\"\n            android:textSize=\"14sp\" />\n    </ScrollView>\n\n    <LinearLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"0dp\"\n        android:orientation=\"horizontal\"\n        android:layout_weight=\"1\">\n        <Button\n            android:id=\"@+id/beta_button_email\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_margin=\"20dp\"\n            android:layout_gravity=\"center_vertical\"\n            android:text=\"E-mail Dev\" />\n        <View\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:layout_weight=\"1\" />\n        <Button\n            android:id=\"@+id/beta_button_start\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_margin=\"20dp\"\n            android:layout_gravity=\"center_vertical\"\n            android:text=\"Start Kaku\" />\n    </LinearLayout>\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/activity_main.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n<fragment\n    android:id=\"@+id/main_fragment\"\n    android:name=\"ca.fuwafuwa.kaku.MainStartFragment\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" />\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/activity_passthrough.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\" />\n"
  },
  {
    "path": "app/src/main/res/layout/activity_tutorial.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n\n    android:orientation=\"vertical\">\n\n    <com.google.android.material.tabs.TabLayout\n        android:id=\"@+id/tab_indicator\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"10dp\"\n        app:tabMaxWidth=\"0dp\"\n        app:tabGravity=\"fill\"\n        app:tabMode=\"fixed\"\n        app:tabIndicatorHeight=\"10dp\"\n        app:tabBackground=\"@android:color/background_dark\"\n        app:tabIndicatorColor=\"@android:color/darker_gray\"/>\n\n    <androidx.viewpager.widget.ViewPager\n        android:id=\"@+id/container\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        app:layout_behavior=\"@string/appbar_scrolling_view_behavior\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/dialog_rating_stars.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"horizontal\"\n    android:gravity=\"center\">\n    <TextView\n        android:id=\"@+id/dialog_rating_star1\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"5dp\"\n        android:layout_marginLeft=\"5dp\"\n        android:layout_marginRight=\"5dp\"\n        android:textSize=\"40sp\"\n        android:text=\"☆\"/>\n    <TextView\n        android:id=\"@+id/dialog_rating_star2\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"5dp\"\n        android:layout_marginLeft=\"5dp\"\n        android:layout_marginRight=\"5dp\"\n        android:textSize=\"40sp\"\n        android:text=\"☆\"/>\n    <TextView\n        android:id=\"@+id/dialog_rating_star3\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"5dp\"\n        android:layout_marginLeft=\"5dp\"\n        android:layout_marginRight=\"5dp\"\n        android:textSize=\"40sp\"\n        android:text=\"☆\"/>\n    <TextView\n        android:id=\"@+id/dialog_rating_star4\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"5dp\"\n        android:layout_marginLeft=\"5dp\"\n        android:layout_marginRight=\"5dp\"\n        android:textSize=\"40sp\"\n        android:text=\"☆\"/>\n    <TextView\n        android:id=\"@+id/dialog_rating_star5\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"5dp\"\n        android:layout_marginLeft=\"5dp\"\n        android:layout_marginRight=\"5dp\"\n        android:textSize=\"40sp\"\n        android:text=\"☆\"/>\n</LinearLayout>\n"
  },
  {
    "path": "app/src/main/res/layout/fragment_end.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:background=\"@color/Primary\"\n    tools:context=\".TutorialWelcomeFragment\">\n\n    <LinearLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintVertical_bias=\"0.25\">\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_horizontal\"\n            android:text=\"画\"\n            android:textColor=\"@color/PrimaryDark\"\n            android:textSize=\"200dp\" />\n\n        <TextView\n            android:layout_width=\"300dp\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Enjoy Kaku!\"\n            android:textColor=\"@color/PrimaryDark\"\n            android:textSize=\"32dp\" />\n\n        <TextView\n            android:id=\"@+id/tutorial_end_text\"\n            android:layout_width=\"300dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"20dp\"\n            android:text=\"Good luck in your Japanese journey. The road will be long and hard, but it will be worth it.\"\n            android:textColor=\"@color/PrimaryDark\"\n            android:textSize=\"20dp\" />\n\n        <Button\n            android:id=\"@+id/tutorial_end_start_kaku\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_horizontal\"\n            android:layout_marginTop=\"30dp\"\n            android:text=\"Start Kaku\"/>\n    </LinearLayout>\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_start.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:background=\"@color/Primary\"\n    tools:context=\".MainStartFragment\">\n\n    <TextView\n        android:id=\"@+id/kaku_logo\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_horizontal\"\n        android:text=\"画\"\n        android:textColor=\"@color/PrimaryDark\"\n        android:textSize=\"150sp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\" />\n\n    <TextView\n        android:id=\"@+id/kaku_title\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_horizontal\"\n        android:text=\"Japanese OCR Dictionary\"\n        android:textColor=\"@color/PrimaryDark\"\n        android:textSize=\"20sp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/kaku_logo\" />\n\n    <TextView\n        android:id=\"@+id/kaku_tutorial\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_horizontal\"\n        android:layout_marginTop=\"10dp\"\n        android:padding=\"10dp\"\n        android:text=\"Tap Here to View Tutorial\"\n        android:textColor=\"@color/blue_dark\"\n        android:textSize=\"12sp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/kaku_title\" />\n\n    <TextView\n        android:id=\"@+id/kaku_github\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_horizontal\"\n        android:padding=\"10dp\"\n        android:text=\"Dev? GitHub Here\"\n        android:textColor=\"@color/blue_dark\"\n        android:textSize=\"12sp\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toBottomOf=\"@+id/kaku_tutorial\" />\n\n    <TextView\n        android:id=\"@+id/support_text\"\n        android:layout_width=\"300dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_horizontal\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        android:layout_marginBottom=\"15dp\"\n        android:gravity=\"center\"\n        android:text=\"@string/kaku_loading\"\n        android:textColor=\"@color/PrimaryDark\"\n        android:textSize=\"12sp\"\n        app:layout_constraintBottom_toBottomOf=\"@+id/horizontal_line\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\" />\n\n    <FrameLayout\n        android:id=\"@+id/frameLayout\"\n        android:layout_width=\"300dp\"\n        android:layout_height=\"4dp\"\n        android:layout_marginStart=\"8dp\"\n        android:layout_marginEnd=\"8dp\"\n        app:layout_constraintBottom_toTopOf=\"@+id/horizontal_line\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\">\n\n        <ProgressBar\n            android:id=\"@+id/progress_bar\"\n            style=\"?android:attr/progressBarStyleHorizontal\"\n            android:layout_width=\"300dp\"\n            android:layout_height=\"32dp\"\n            android:layout_gravity=\"center\"\n            android:indeterminate=\"true\"\n            android:indeterminateOnly=\"false\" />\n    </FrameLayout>\n\n    <FrameLayout\n        android:id=\"@+id/horizontal_line\"\n        android:layout_width=\"300dp\"\n        android:layout_height=\"1dp\"\n        android:background=\"@android:color/black\"\n        app:layout_constraintBottom_toTopOf=\"@+id/promoView\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\">\n    </FrameLayout>\n\n    <FrameLayout\n        android:id=\"@+id/promoView\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"25dp\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\">\n        <ImageView\n            android:id=\"@+id/saeView\"\n            android:layout_width=\"300dp\"\n            android:layout_height=\"250dp\"\n            android:background=\"@android:color/holo_red_dark\"/>\n        <com.google.android.gms.ads.AdView xmlns:ads=\"http://schemas.android.com/apk/res-auto\"\n            android:id=\"@+id/adView\"\n            android:layout_width=\"300dp\"\n            android:layout_height=\"250dp\"\n            android:background=\"@android:color/darker_gray\"\n            ads:adSize=\"MEDIUM_RECTANGLE\"\n            ads:adUnitId=\"@string/ads_unit_id_test\"\n            app:layout_constraintBottom_toBottomOf=\"parent\"\n            app:layout_constraintEnd_toEndOf=\"parent\"\n            app:layout_constraintStart_toStartOf=\"parent\"/>\n    </FrameLayout>\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_tutorial.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:background=\"@color/Primary\">\n\n    <VideoView\n            android:id=\"@+id/instruction_video_view\"\n            android:layout_marginTop=\"20dp\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"0dp\"\n            android:layout_gravity=\"center_horizontal\"\n            tools:ignore=\"Suspicious0dp\" />\n\n    <View\n        android:layout_width=\"0dp\"\n        android:layout_height=\"0dp\"\n        android:layout_weight=\"1\"/>\n\n    <LinearLayout\n        android:id=\"@+id/tutorial_buttons\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_gravity=\"center_horizontal\"\n        android:orientation=\"horizontal\">\n        <View\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:layout_weight=\"4\" />\n        <Button\n            android:id=\"@+id/tutorial_button_explain\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_margin=\"15dp\"\n            android:layout_gravity=\"center_vertical\"\n            android:text=\"Explain\" />\n        <!--\n        <View\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:layout_weight=\"1\" />\n        <Button\n            android:id=\"@+id/tutorial_button_next\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_margin=\"10dp\"\n            android:layout_gravity=\"center_vertical\"\n            android:enabled=\"false\"\n            android:text=\"Next\" />\n            -->\n        <View\n            android:layout_width=\"0dp\"\n            android:layout_height=\"0dp\"\n            android:layout_weight=\"4\" />\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/fragment_welcome.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<androidx.constraintlayout.widget.ConstraintLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\"\n    android:background=\"@color/Primary\"\n    tools:context=\".TutorialWelcomeFragment\">\n\n    <LinearLayout\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:orientation=\"vertical\"\n        app:layout_constraintBottom_toBottomOf=\"parent\"\n        app:layout_constraintEnd_toEndOf=\"parent\"\n        app:layout_constraintStart_toStartOf=\"parent\"\n        app:layout_constraintTop_toTopOf=\"parent\"\n        app:layout_constraintVertical_bias=\"0.25\">\n\n        <TextView\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_gravity=\"center_horizontal\"\n            android:text=\"画\"\n            android:textColor=\"@color/PrimaryDark\"\n            android:textSize=\"200dp\" />\n\n        <TextView\n            android:layout_width=\"300dp\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Welcome to Kaku!\"\n            android:textColor=\"@color/PrimaryDark\"\n            android:textSize=\"28dp\" />\n\n        <TextView\n            android:layout_width=\"300dp\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"20dp\"\n            android:text=\"Please take the next few minutes to read through the tutorial and familiarize yourself with Kaku. There's a lot to learn!\\n\\nTo begin, slide right.\"\n            android:textColor=\"@color/PrimaryDark\"\n            android:textSize=\"20dp\" />\n    </LinearLayout>\n\n</androidx.constraintlayout.widget.ConstraintLayout>"
  },
  {
    "path": "app/src/main/res/layout/window.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ca.fuwafuwa.kaku.Windows.Views.WindowView\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/window_view\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n    <RelativeLayout\n        android:id=\"@+id/content_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\" />\n    <ca.fuwafuwa.kaku.Windows.Views.ResizeView\n        android:id=\"@+id/resize_view\"\n        android:layout_width=\"40dp\"\n        android:layout_height=\"40dp\"\n        android:layout_alignParentBottom=\"true\"\n        android:layout_alignParentRight=\"true\" />\n</ca.fuwafuwa.kaku.Windows.Views.WindowView>"
  },
  {
    "path": "app/src/main/res/layout/window_capture.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n    <RelativeLayout\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"@drawable/bg_transparent_border_0_nil_default\" />\n    <RelativeLayout\n        android:id=\"@+id/capture_box\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"@drawable/bg_transparent_border_0_nil_ready\" />\n    <ImageView\n        android:id=\"@+id/capture_image\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:padding=\"1dp\" />\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/window_edit.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:orientation=\"vertical\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:id=\"@+id/edit_text_linear_layout\">\n\n    <ImageView\n        android:id=\"@+id/edit_kanji_image\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:background=\"@android:color/white\"\n        android:scaleType=\"fitCenter\"\n        android:layout_above=\"@+id/edit_text\" />\n\n    <ca.fuwafuwa.kaku.Windows.Views.ChoiceEditText\n        android:id=\"@+id/edit_text\"\n        android:imeOptions=\"flagNoExtractUi\"\n        android:maxLines=\"1\"\n        android:inputType=\"text\"\n        android:padding=\"10dp\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:focusable=\"true\"\n        android:hint=\"Handwrite Here\"\n        android:textColor=\"@android:color/black\"\n        android:background=\"@android:color/white\"\n        android:layout_alignParentBottom=\"true\"/>\n\n</RelativeLayout>"
  },
  {
    "path": "app/src/main/res/layout/window_history.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/history_window_container\"\n    android:animateLayoutChanges=\"false\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:orientation=\"vertical\">\n\n    <LinearLayout\n        android:id=\"@+id/history_window_kanji\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"30dp\"\n        android:orientation=\"horizontal\"\n        android:layout_marginTop=\"5dp\"\n        android:layout_marginLeft=\"5dp\"\n        android:layout_marginRight=\"5dp\"\n        android:background=\"@drawable/bg_solid_border_corners_0_white_black_round\">\n\n        <HorizontalScrollView\n            android:id=\"@+id/past_kanji_scroll_view\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"wrap_content\"\n            android:layout_weight=\"1\"\n            android:scrollbars=\"none\">\n            <LinearLayout\n                android:id=\"@+id/past_kanji\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:orientation=\"horizontal\">\n            </LinearLayout>\n        </HorizontalScrollView>\n\n        <TextView\n            android:id=\"@+id/history_window_layout_button\"\n            android:textColor=\"@android:color/black\"\n            android:layout_width=\"30dp\"\n            android:layout_height=\"30dp\"\n            android:background=\"@drawable/bg_solid_border_corners_0_white_black_round\"\n            android:textSize=\"10dp\"\n            android:padding=\"5dp\"\n            android:gravity=\"center\"\n            android:text=\"▼\"/>\n\n    </LinearLayout>\n\n    <LinearLayout\n        android:id=\"@+id/history_window_results\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\"\n        android:background=\"@drawable/bg_solid_border_corners_0_white_black_round\">\n        <TextView\n            android:padding=\"5dp\"\n            android:id=\"@+id/history_dict_result\"\n            android:textColor=\"@android:color/black\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\" />\n    </LinearLayout>\n\n</LinearLayout>"
  },
  {
    "path": "app/src/main/res/layout/window_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n\n    <LinearLayout\n        android:id=\"@+id/info_window\"\n        android:orientation=\"vertical\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"wrap_content\"\n        android:layout_marginTop=\"10dp\"\n        android:layout_marginLeft=\"10dp\"\n        android:layout_marginRight=\"10dp\"\n        android:layout_marginBottom=\"100dp\"\n        android:background=\"@drawable/bg_solid_border_corners_0_white_black_round\">\n\n        <LinearLayout\n            android:orientation=\"vertical\"\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:layout_marginLeft=\"5dp\"\n            android:layout_marginRight=\"5dp\"\n            android:layout_marginBottom=\"5dp\">\n\n            <LinearLayout\n                android:orientation=\"vertical\"\n                android:layout_width=\"match_parent\"\n                android:layout_height=\"match_parent\"\n                android:layout_margin=\"10dp\">\n\n                <ca.fuwafuwa.kaku.Windows.Views.KanjiGridView\n                    android:id=\"@+id/kanji_grid\"\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"wrap_content\"\n                    android:layout_margin=\"5dp\" />\n\n                <ScrollView\n                    android:layout_width=\"match_parent\"\n                    android:layout_height=\"0dp\"\n                    android:layout_weight=\"1\"\n                    android:layout_margin=\"5dp\"\n                    android:animateLayoutChanges=\"true\"\n                    android:scrollbars=\"vertical\">\n\n                    <LinearLayout\n                        android:id=\"@+id/info_text\"\n                        android:animateLayoutChanges=\"true\"\n                        android:orientation=\"vertical\"\n                        android:layout_width=\"match_parent\"\n                        android:layout_height=\"wrap_content\">\n                        <TextSwitcher\n                            android:id=\"@+id/dict_results\"\n                            android:measureAllChildren=\"false\"\n                            android:animateLayoutChanges=\"true\"\n                            android:inAnimation=\"@anim/slide_in\"\n                            android:layout_width=\"wrap_content\"\n                            android:layout_height=\"wrap_content\">\n                            <TextView\n                                android:textColor=\"@android:color/black\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\" />\n                            <TextView\n                                android:textColor=\"@android:color/black\"\n                                android:layout_width=\"wrap_content\"\n                                android:layout_height=\"wrap_content\" />\n                        </TextSwitcher>\n\n                    </LinearLayout>\n\n                </ScrollView>\n\n            </LinearLayout>\n\n        </LinearLayout>\n\n    </LinearLayout>\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/window_instant_info.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:id=\"@+id/instant_info_window_layout\"\n    android:paddingTop=\"5dp\"\n    android:paddingBottom=\"5dp\"\n    android:paddingLeft=\"5dp\"\n    android:paddingRight=\"5dp\">\n\n    <LinearLayout\n        android:id=\"@+id/instant_window_text_frame\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:background=\"@drawable/bg_solid_border_corners_0_white_black_round\">\n\n        <TextView\n            android:id=\"@+id/instant_window_text\"\n            android:layout_margin=\"5dp\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:background=\"@android:color/transparent\"\n            android:text=\"TEST\"/>\n\n    </LinearLayout>\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/window_instant_kanji.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<FrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    android:id=\"@+id/instant_kanji_window_layout\"\n    android:padding=\"5dp\">\n\n    <LinearLayout\n        android:id=\"@+id/instant_window_kanji_frame\"\n        android:layout_height=\"wrap_content\"\n        android:layout_width=\"wrap_content\"\n        android:background=\"@drawable/bg_solid_border_corners_0_white_black_round\">\n\n    <ca.fuwafuwa.kaku.Windows.Views.KanjiGridView\n        android:id=\"@+id/kanji_grid\"\n        android:layout_width=\"wrap_content\"\n        android:layout_height=\"wrap_content\"\n        android:layout_margin=\"5dp\"/>\n\n    </LinearLayout>\n\n</FrameLayout>"
  },
  {
    "path": "app/src/main/res/layout/window_kanji_choice.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:id=\"@+id/kanji_choice_window\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\">\n</RelativeLayout>\n"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@mipmap/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@mipmap/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "app/src/main/res/values/colors.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"Primary\">#FFFFFF</color>\n    <color name=\"Accent\">#FF4081</color>\n    <color name=\"ic_launcher_background\">#FFFFFF</color>\n\n    <color name=\"PrimaryDark\">#000000</color>\n    <color name=\"AccentDark\">#FF4081</color>\n\n    <color name=\"important\">#ff0000</color>\n\n    <color name=\"black100a\">#64000000</color>\n    <color name=\"translucent\">#22000000</color>\n    <color name=\"info_window_color\">#AA000000</color>\n    <color name=\"blue_dark\">#0064ff</color>\n    <color name=\"blue_dark_translucent\">#330064ff</color>\n    <color name=\"blue_solid_highlight\">#cce0ff</color>\n    <color name=\"red_capture_window_ready\">#ffd50000</color>\n\n    <color name=\"kana_pink\">#C71585</color>\n    <color name=\"kana_blue\">#0000CD</color>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/dimens.xml",
    "content": "<resources>\n    <!-- Default screen margins, per the Android Design guidelines. -->\n    <dimen name=\"activity_horizontal_margin\">16dp</dimen>\n    <dimen name=\"activity_vertical_margin\">16dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">Kaku</string>\n    <string name=\"support_text\">\"Like Kaku? Rate the app!\"</string>\n    <string name=\"kaku_loading\">Kaku is loading…</string>\n    <string name=\"beta_screen\">\"Thanks for installing the beta version of Kaku! If you didn't intend to install the beta version, I highly recommend that you go to the Play Store and leave the beta program - the beta version of Kaku may be unstable and more prone to bugs. If you are not in the beta program and but still seeing this message, please let me know right away by e-mailing me below!\n\nIf you run into issues (i.e., constant crashes or graphical glitches) in the beta, please let me know at 0xbad1d3a5@gmail.com! Feedback and suggestions are also welcome!\n\nBETA UPDATES:\n\nvLATEST\n- Revert Tesseract library update as that was causing vertical OCR recognition issues\n- Fresh build from clone\n\nv1.3.72\n- Emergency fix for Android 12\n- Update Tesseract libraries\n\nv1.3.66\n- Stop screen capture when device is put to sleep\n- Minor bugfixes\n\nv1.3.62\n- Updating beta version of Kaku will longer remove the icon from the home screen after this update\n- Improve artist text\n\nv1.3.59\n- Temporarily disable ads\n\nv1.3.56\n- Minor bugfixes\n- Added dialog in tutorial explaining Kaku's permissions\n\nv1.3.55\n- No Kaku updates, just backend changes\n- Bump Kotlin version, use Triple-T for automated Play Console uploads\n\nv1.3.47\n- Fix minor crashes in Kaku\n\nv1.3.46\n- Improve recognition of commonly mis-recognized kana such as ー or 一\n- Improved normal mode so that the entire sentence can be copied, tap the sides of the normal mode window to scroll\n\nv1.3.45\n- Improve recognition of commonly mis-recognized kana such as く or し\n\nv1.3.43\n- Add similar kana to swap quick text action in case that OCR engine doesn't give that recommendation\n\nv1.3.42\n- Reduce size of tutorial videos\n\nv1.3.40\n- Revamped tutorial and shows on first start of the app\n- Fix minor bugs\n\nv1.3.38\n- Fixed entry ranking issue with dictionary - less common readings of a kanji will rank lower.\n- Fixed icon placement bug with select-to-swap actions in certain cases when the status bar / navigation bar is showing.\n\nv1.3.37\n- Removed history window. Not ready for prime time and I didn't particularly find it useful.\n- Added ability to completely hide Kaku's capture window through the notification.\n\nv1.3.34\n- Added history window. This window shows previous kanji that you have looked up.\n- You can now share text to Kaku to trigger the popup window as well.\n\nv1.3.33\n- One ad added to start screen. Sorry! But it's to help support development. It should be fairly out of the way, but let me know if it causes problems.\n- Adding the ad does get rid of the 'Close Capture Window' button, but a reminder to all that you can close Kaku by simply tapping on Kaku's notification in the status bar. If you are unable to close Kaku because the notification is missing, please send me an e-mail!\n- Fixed instant mode rotation bug where positioning was incorrect after device rotation.\n- Fixed bug where Kaku does not start on some devices (particularly Xiaomi devices).\n\nv1.3.32\n- Instant Mode window positioning logic has been implemented. If things look off here, please let me know!\n\nNote that if you try to leave feedback on the Play Store as a beta user, it is not shown to all users.\"</string>\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <!--<item name=\"colorPrimary\">@color/colorPrimary</item>\n        <item name=\"colorPrimaryDark\">@color/colorPrimaryDark</item>\n        <item name=\"colorAccent\">@color/colorAccent</item>-->\n    </style>\n\n</resources>\n"
  },
  {
    "path": "app/src/main/res/values-w820dp/dimens.xml",
    "content": "<resources>\n    <!-- Example customization of dimensions originally defined in res/values/dimens.xml\n         (such as screen margins) for screens with more than 820dp of available width. This\n         would include 7\" and 10\" devices in landscape (~960dp and ~1280dp respectively). -->\n    <dimen name=\"activity_horizontal_margin\">64dp</dimen>\n</resources>\n"
  },
  {
    "path": "app/src/test/java/ca/fuwafuwa/kaku/ExampleUnitTest.java",
    "content": "package ca.fuwafuwa.kaku;\n\nimport android.util.Xml;\n\nimport com.atilika.kuromoji.ipadic.Token;\nimport com.atilika.kuromoji.ipadic.Tokenizer;\n\nimport org.junit.Test;\nimport java.util.List;\n\nimport ca.fuwafuwa.kaku.Deinflictor.PosMap;\n\n/**\n * To work on unit tests, switch the Test Artifact in the Build Variants view.\n */\npublic class ExampleUnitTest {\n\n    private String GetTokenString(Token token){\n        return String.format(\"%s,%s,%s,%s,%s,%s,%s,%s,%s\",\n                PosMap.Companion.GetPosMapVal(token.getPartOfSpeechLevel1()),\n                PosMap.Companion.GetPosMapVal(token.getPartOfSpeechLevel2()),\n                PosMap.Companion.GetPosMapVal(token.getPartOfSpeechLevel3()),\n                PosMap.Companion.GetPosMapVal(token.getPartOfSpeechLevel4()),\n                PosMap.Companion.GetPosMapVal(token.getConjugationType()),\n                PosMap.Companion.GetPosMapVal(token.getConjugationForm()),\n                token.getBaseForm(),\n                token.getReading(),\n                token.getPronunciation());\n    }\n\n    @Test\n    public void test(){\n        Tokenizer tokenizer = new Tokenizer();\n        List<Token> tokens = tokenizer.tokenize(\"ずっと側にいてくれてありがとう。\");\n        for (Token token : tokens) {\n            System.out.println(token.getSurface() + \"\\t\" + GetTokenString(token));\n        }\n    }\n\n    @Test\n    public void TestCircledNum(){\n        for (int i = 1; i <= 100; i++){\n            System.out.println(LangUtils.Companion.ConvertIntToCircledNum(i));\n        }\n    }\n}"
  },
  {
    "path": "app/src/test/java/ca/fuwafuwa/kaku/GenerateDictionary.java",
    "content": "package ca.fuwafuwa.kaku;\n\nimport android.util.Xml;\n\nimport com.j256.ormlite.dao.Dao;\nimport com.j256.ormlite.dao.DaoManager;\nimport com.j256.ormlite.jdbc.JdbcConnectionSource;\nimport com.j256.ormlite.support.ConnectionSource;\nimport com.j256.ormlite.table.TableUtils;\n\nimport org.junit.Test;\nimport org.kxml2.io.KXmlParser;\nimport org.xmlpull.v1.XmlPullParser;\n\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\nimport java.sql.SQLException;\n\nimport ca.fuwafuwa.kaku.Database.IDatabaseHelper;\nimport ca.fuwafuwa.kaku.Database.JmDictDatabase.Models.EntryOptimized;\nimport ca.fuwafuwa.kaku.XmlParsers.JmDict.JmParser;\n\npublic class GenerateDictionary\n{\n    class DatabaseHelperImpl implements IDatabaseHelper {\n\n        ConnectionSource mConnectionSource;\n\n        DatabaseHelperImpl(ConnectionSource connectionSource){\n            mConnectionSource = connectionSource;\n        }\n\n        @Override\n        public <T> Dao<T, Integer> getDbDao(Class clazz) throws SQLException\n        {\n            return DaoManager.createDao(mConnectionSource, clazz);\n        }\n    }\n\n    /**\n     * This isn't actually a test, it generates the SQLite dictionary for the Kaku app\n     * I'm just too lazy to have it be in another project so it's in this here as a\n     * test instead. Sorry.\n     *\n     * Wtf fuck Android this doesn't even work.\n     *\n     * @throws Exception\n     */\n    @Test\n    public void generateDic() throws Exception {\n\n        String dbPath = \"D:/Dev/KakuFiles/kaku_edict.sqlite\";\n        String xmlPath = \"D:/Dev/KakuFiles/JMdictOriginal.xml\";\n        String databaseUrl = String.format(\"jdbc:sqlite:%s\", dbPath);\n\n        Files.deleteIfExists(Paths.get(dbPath));\n\n        FileInputStream mDictXml = new FileInputStream(xmlPath);\n        XmlPullParser mParser = new KXmlParser();\n        mParser.setInput(mDictXml, null);\n\n        ConnectionSource connectionSource = null;\n        try\n        {\n            connectionSource = new JdbcConnectionSource(databaseUrl);\n            TableUtils.createTable(connectionSource, EntryOptimized.class);\n\n            DatabaseHelperImpl dbHelper = new DatabaseHelperImpl(connectionSource);\n\n            JmParser jmParser = new JmParser(dbHelper);\n            jmParser.parseDict(mParser);\n        } finally {\n            if (connectionSource != null) {\n                connectionSource.close();\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "build.gradle",
    "content": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\nbuildscript {\n    ext.kotlin_version = '1.5.0'\n    repositories {\n        google()\n        mavenCentral()\n     }\n    dependencies {\n        classpath 'com.android.tools.build:gradle:7.1.3'\n        classpath \"org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version\"\n\n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n\nallprojects {\n    repositories {\n        mavenCentral()\n        maven { url 'https://jitpack.io' }\n        google()\n    }\n}\n\ntask clean(type: Delete) {\n    delete rootProject.buildDir\n}\n"
  },
  {
    "path": "fastlane/metadata/android/en-US/full_description.txt",
    "content": "Kaku is a fast, powerful Japanese dictionary that stays on top of all your apps. It uses optical character recognition (OCR) technology to recognize kanji on the device screen for you (rather than the slowww tedious process of looking up individual characters manually), making it perfect for Japanese learners who want to study by reading raw manga, play untranslated games, and so on without the hassle of switching apps."
  },
  {
    "path": "fastlane/metadata/android/en-US/short_description.txt",
    "content": "Japanese OCR Dictionary"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "#Sat Mar 20 03:53:32 PDT 2021\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-7.2-bin.zip\n"
  },
  {
    "path": "gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx10248m -XX:MaxPermSize=256m\n# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\nandroid.enableJetifier=true\nandroid.useAndroidX=true"
  },
  {
    "path": "gradlew",
    "content": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start up script for UN*X\n##\n##############################################################################\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS=\"\"\n\nAPP_NAME=\"Gradle\"\nAPP_BASE_NAME=`basename \"$0\"`\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=\"maximum\"\n\nwarn ( ) {\n    echo \"$*\"\n}\n\ndie ( ) {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n}\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\ncase \"`uname`\" in\n  CYGWIN* )\n    cygwin=true\n    ;;\n  Darwin* )\n    darwin=true\n    ;;\n  MINGW* )\n    msys=true\n    ;;\nesac\n\n# Attempt to set APP_HOME\n# Resolve links: $0 may be a link\nPRG=\"$0\"\n# Need this for relative symlinks.\nwhile [ -h \"$PRG\" ] ; do\n    ls=`ls -ld \"$PRG\"`\n    link=`expr \"$ls\" : '.*-> \\(.*\\)$'`\n    if expr \"$link\" : '/.*' > /dev/null; then\n        PRG=\"$link\"\n    else\n        PRG=`dirname \"$PRG\"`\"/$link\"\n    fi\ndone\nSAVED=\"`pwd`\"\ncd \"`dirname \\\"$PRG\\\"`/\" >/dev/null\nAPP_HOME=\"`pwd -P`\"\ncd \"$SAVED\" >/dev/null\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=\"$JAVA_HOME/jre/sh/java\"\n    else\n        JAVACMD=\"$JAVA_HOME/bin/java\"\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=\"java\"\n    which java >/dev/null 2>&1 || die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\nfi\n\n# Increase the maximum file descriptors if we can.\nif [ \"$cygwin\" = \"false\" -a \"$darwin\" = \"false\" ] ; then\n    MAX_FD_LIMIT=`ulimit -H -n`\n    if [ $? -eq 0 ] ; then\n        if [ \"$MAX_FD\" = \"maximum\" -o \"$MAX_FD\" = \"max\" ] ; then\n            MAX_FD=\"$MAX_FD_LIMIT\"\n        fi\n        ulimit -n $MAX_FD\n        if [ $? -ne 0 ] ; then\n            warn \"Could not set maximum file descriptor limit: $MAX_FD\"\n        fi\n    else\n        warn \"Could not query maximum file descriptor limit: $MAX_FD_LIMIT\"\n    fi\nfi\n\n# For Darwin, add options to specify how the application appears in the dock\nif $darwin; then\n    GRADLE_OPTS=\"$GRADLE_OPTS \\\"-Xdock:name=$APP_NAME\\\" \\\"-Xdock:icon=$APP_HOME/media/gradle.icns\\\"\"\nfi\n\n# For Cygwin, switch paths to Windows format before running java\nif $cygwin ; then\n    APP_HOME=`cygpath --path --mixed \"$APP_HOME\"`\n    CLASSPATH=`cygpath --path --mixed \"$CLASSPATH\"`\n    JAVACMD=`cygpath --unix \"$JAVACMD\"`\n\n    # We build the pattern for arguments to be converted via cygpath\n    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`\n    SEP=\"\"\n    for dir in $ROOTDIRSRAW ; do\n        ROOTDIRS=\"$ROOTDIRS$SEP$dir\"\n        SEP=\"|\"\n    done\n    OURCYGPATTERN=\"(^($ROOTDIRS))\"\n    # Add a user-defined pattern to the cygpath arguments\n    if [ \"$GRADLE_CYGPATTERN\" != \"\" ] ; then\n        OURCYGPATTERN=\"$OURCYGPATTERN|($GRADLE_CYGPATTERN)\"\n    fi\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    i=0\n    for arg in \"$@\" ; do\n        CHECK=`echo \"$arg\"|egrep -c \"$OURCYGPATTERN\" -`\n        CHECK2=`echo \"$arg\"|egrep -c \"^-\"`                                 ### Determine if an option\n\n        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition\n            eval `echo args$i`=`cygpath --path --ignore --mixed \"$arg\"`\n        else\n            eval `echo args$i`=\"\\\"$arg\\\"\"\n        fi\n        i=$((i+1))\n    done\n    case $i in\n        (0) set -- ;;\n        (1) set -- \"$args0\" ;;\n        (2) set -- \"$args0\" \"$args1\" ;;\n        (3) set -- \"$args0\" \"$args1\" \"$args2\" ;;\n        (4) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" ;;\n        (5) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" ;;\n        (6) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" ;;\n        (7) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" ;;\n        (8) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" ;;\n        (9) set -- \"$args0\" \"$args1\" \"$args2\" \"$args3\" \"$args4\" \"$args5\" \"$args6\" \"$args7\" \"$args8\" ;;\n    esac\nfi\n\n# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules\nfunction splitJvmOpts() {\n    JVM_OPTS=(\"$@\")\n}\neval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\nJVM_OPTS[${#JVM_OPTS[*]}]=\"-Dorg.gradle.appname=$APP_BASE_NAME\"\n\nexec \"$JAVACMD\" \"${JVM_OPTS[@]}\" -classpath \"$CLASSPATH\" org.gradle.wrapper.GradleWrapperMain \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@if \"%DEBUG%\" == \"\" @echo off\n@rem ##########################################################################\n@rem\n@rem  Gradle startup script for Windows\n@rem\n@rem ##########################################################################\n\n@rem Set local scope for the variables with windows NT shell\nif \"%OS%\"==\"Windows_NT\" setlocal\n\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nset DEFAULT_JVM_OPTS=\n\nset DIRNAME=%~dp0\nif \"%DIRNAME%\" == \"\" set DIRNAME=.\nset APP_BASE_NAME=%~n0\nset APP_HOME=%DIRNAME%\n\n@rem Find java.exe\nif defined JAVA_HOME goto findJavaFromJavaHome\n\nset JAVA_EXE=java.exe\n%JAVA_EXE% -version >NUL 2>&1\nif \"%ERRORLEVEL%\" == \"0\" goto init\n\necho.\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:findJavaFromJavaHome\nset JAVA_HOME=%JAVA_HOME:\"=%\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\n\nif exist \"%JAVA_EXE%\" goto init\n\necho.\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\necho.\necho Please set the JAVA_HOME variable in your environment to match the\necho location of your Java installation.\n\ngoto fail\n\n:init\n@rem Get command-line arguments, handling Windowz variants\n\nif not \"%OS%\" == \"Windows_NT\" goto win9xME_args\nif \"%@eval[2+2]\" == \"4\" goto 4NT_args\n\n:win9xME_args\n@rem Slurp the command line arguments.\nset CMD_LINE_ARGS=\nset _SKIP=2\n\n:win9xME_args_slurp\nif \"x%~1\" == \"x\" goto execute\n\nset CMD_LINE_ARGS=%*\ngoto execute\n\n:4NT_args\n@rem Get arguments from the 4NT Shell from JP Software\nset CMD_LINE_ARGS=%$\n\n:execute\n@rem Setup the command line\n\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\n\n@rem Execute Gradle\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%\n\n:end\n@rem End local scope for the variables with windows NT shell\nif \"%ERRORLEVEL%\"==\"0\" goto mainEnd\n\n:fail\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\nrem the _cmd.exe /c_ return code!\nif  not \"\" == \"%GRADLE_EXIT_CONSOLE%\" exit 1\nexit /b 1\n\n:mainEnd\nif \"%OS%\"==\"Windows_NT\" endlocal\n\n:omega\n"
  },
  {
    "path": "projectFilesBackup/.idea/workspace.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"AndroidLayouts\">\n    <shared>\n      <config />\n    </shared>\n    <layouts>\n      <layout url=\"file://$PROJECT_DIR$/app/src/main/res/layout/info_window.xml\">\n        <config>\n          <theme>@style/AppTheme</theme>\n        </config>\n      </layout>\n    </layouts>\n  </component>\n  <component name=\"AndroidLogFilters\">\n    <option name=\"TOOL_WINDOW_CONFIGURED_FILTER\" value=\"Show only selected application\" />\n  </component>\n  <component name=\"ChangeListManager\">\n    <list default=\"true\" id=\"d62e88b6-443c-4675-8a14-b994ea4b677c\" name=\"Default\" comment=\"\">\n      <change type=\"NEW\" beforePath=\"\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Search/Searcher.java\" />\n      <change type=\"NEW\" beforePath=\"\" afterPath=\"$PROJECT_DIR$/app/src/main/res/drawable/shape_white.xml\" />\n      <change type=\"DELETED\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/DbOpenHelper.java\" afterPath=\"\" />\n      <change type=\"DELETED\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/DictContract.java\" afterPath=\"\" />\n      <change type=\"DELETED\" beforePath=\"$PROJECT_DIR$/app/src/main/res/drawable/info_button_selector.xml\" afterPath=\"\" />\n      <change type=\"DELETED\" beforePath=\"$PROJECT_DIR$/app/src/main/res/drawable/shape_round_corners_black.xml\" afterPath=\"\" />\n      <change type=\"DELETED\" beforePath=\"$PROJECT_DIR$/app/src/main/res/drawable/shape_round_corners_translucent.xml\" afterPath=\"\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/.idea/gradle.xml\" afterPath=\"$PROJECT_DIR$/.idea/gradle.xml\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/build.gradle\" afterPath=\"$PROJECT_DIR$/app/build.gradle\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/DatabaseHelper.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/DatabaseHelper.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/Entry.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/Entry.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/Kanji.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/Kanji.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/KanjiIrregularity.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/KanjiIrregularity.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/KanjiPriority.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/KanjiPriority.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/Meaning.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/Meaning.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningAdditionalInfo.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningAdditionalInfo.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningAntonym.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningAntonym.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningCrossReference.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningCrossReference.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningDialect.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningDialect.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningField.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningField.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningGloss.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningGloss.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningKanjiRestriction.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningKanjiRestriction.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningLoanSource.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningLoanSource.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningMisc.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningMisc.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningPartOfSpeech.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningPartOfSpeech.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningReadingRestriction.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningReadingRestriction.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/Reading.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/Reading.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/ReadingIrregularity.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/ReadingIrregularity.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/ReadingPriority.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/ReadingPriority.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/ReadingRestriction.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/ReadingRestriction.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/KakuTools.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/KakuTools.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/CaptureWindow.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/CaptureWindow.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/InformationWindow.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/InformationWindow.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/KanjiCharacterView.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/KanjiCharacterView.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/KanjiGridView.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/KanjiGridView.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDictThread.java\" afterPath=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDictThread.java\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/res/layout/info_window.xml\" afterPath=\"$PROJECT_DIR$/app/src/main/res/layout/info_window.xml\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/res/values/colors.xml\" afterPath=\"$PROJECT_DIR$/app/src/main/res/values/colors.xml\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/app/src/main/res/values/styles.xml\" afterPath=\"$PROJECT_DIR$/app/src/main/res/values/styles.xml\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/build.gradle\" afterPath=\"$PROJECT_DIR$/build.gradle\" />\n      <change type=\"MODIFICATION\" beforePath=\"$PROJECT_DIR$/gradle/wrapper/gradle-wrapper.properties\" afterPath=\"$PROJECT_DIR$/gradle/wrapper/gradle-wrapper.properties\" />\n    </list>\n    <ignored path=\"Kaku.iws\" />\n    <ignored path=\".idea/workspace.xml\" />\n    <option name=\"EXCLUDED_CONVERTED_TO_IGNORED\" value=\"true\" />\n    <option name=\"TRACKING_ENABLED\" value=\"true\" />\n    <option name=\"SHOW_DIALOG\" value=\"false\" />\n    <option name=\"HIGHLIGHT_CONFLICTS\" value=\"true\" />\n    <option name=\"HIGHLIGHT_NON_ACTIVE_CHANGELIST\" value=\"false\" />\n    <option name=\"LAST_RESOLUTION\" value=\"IGNORE\" />\n  </component>\n  <component name=\"ChangesViewManager\" flattened_view=\"true\" show_ignored=\"false\" />\n  <component name=\"CoverageDataManager\">\n    <SUITE FILE_PATH=\"coverage/Kaku$ExampleUnitTest_wtfXmlSrsly.coverage\" NAME=\"ExampleUnitTest.wtfXmlSrsly Coverage Results\" MODIFIED=\"1461731679611\" SOURCE_PROVIDER=\"com.intellij.coverage.DefaultCoverageFileProvider\" RUNNER=\"idea\" COVERAGE_BY_TEST_ENABLED=\"false\" COVERAGE_TRACING_ENABLED=\"false\">\n      <FILTER>ca.fuwafuwa.kaku.*</FILTER>\n    </SUITE>\n  </component>\n  <component name=\"CreatePatchCommitExecutor\">\n    <option name=\"PATCH_PATH\" value=\"\" />\n  </component>\n  <component name=\"DockManager\">\n    <window id=\"1\">\n      <content type=\"file-editors\">\n        <state>\n          <leaf SIDE_TABS_SIZE_LIMIT_KEY=\"300\">\n            <file leaf-file-name=\"DatabaseHelper.java\" pinned=\"false\" current-in-tab=\"false\">\n              <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/DatabaseHelper.java\">\n                <provider selected=\"true\" editor-type-id=\"text-editor\">\n                  <state vertical-scroll-proportion=\"0.0\">\n                    <caret line=\"70\" column=\"51\" selection-start-line=\"70\" selection-start-column=\"51\" selection-end-line=\"70\" selection-end-column=\"51\" />\n                    <folding />\n                  </state>\n                </provider>\n              </entry>\n            </file>\n            <file leaf-file-name=\"InformationWindow.java\" pinned=\"false\" current-in-tab=\"true\">\n              <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/InformationWindow.java\">\n                <provider selected=\"true\" editor-type-id=\"text-editor\">\n                  <state vertical-scroll-proportion=\"0.619403\">\n                    <caret line=\"163\" column=\"0\" selection-start-line=\"163\" selection-start-column=\"0\" selection-end-line=\"163\" selection-end-column=\"0\" />\n                    <folding>\n                      <element signature=\"imports\" expanded=\"true\" />\n                      <element signature=\"method#onKanjiViewScroll#0;class#InformationWindow#0\" expanded=\"false\" />\n                      <element signature=\"method#getDefaultParams#0;class#InformationWindow#0\" expanded=\"false\" />\n                      <element signature=\"method#stop#0;class#InformationWindow#0\" expanded=\"false\" />\n                      <element signature=\"method#onDown#0;class#InformationWindow#0\" expanded=\"false\" />\n                      <element signature=\"method#onShowPress#0;class#InformationWindow#0\" expanded=\"false\" />\n                      <element signature=\"method#onSingleTapUp#0;class#InformationWindow#0\" expanded=\"false\" />\n                      <element signature=\"method#onScroll#0;class#InformationWindow#0\" expanded=\"false\" />\n                      <element signature=\"method#onLongPress#0;class#InformationWindow#0\" expanded=\"false\" />\n                      <element signature=\"method#onFling#0;class#InformationWindow#0\" expanded=\"false\" />\n                    </folding>\n                  </state>\n                </provider>\n              </entry>\n            </file>\n            <file leaf-file-name=\"KanjiGridView.java\" pinned=\"false\" current-in-tab=\"false\">\n              <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/KanjiGridView.java\">\n                <provider selected=\"true\" editor-type-id=\"text-editor\">\n                  <state vertical-scroll-proportion=\"0.0\">\n                    <caret line=\"19\" column=\"0\" selection-start-line=\"19\" selection-start-column=\"0\" selection-end-line=\"19\" selection-end-column=\"0\" />\n                    <folding>\n                      <element signature=\"method#onMeasure#0;class#KanjiGridView#0\" expanded=\"false\" />\n                      <element signature=\"method#onLayout#0;class#KanjiGridView#0\" expanded=\"false\" />\n                    </folding>\n                  </state>\n                </provider>\n              </entry>\n            </file>\n          </leaf>\n        </state>\n      </content>\n    </window>\n  </component>\n  <component name=\"ErrorTreeViewConfiguration\">\n    <option name=\"autoscrollToSource\" value=\"true\" />\n    <option name=\"IS_AUTOSCROLL_TO_SOURCE\" value=\"true\" />\n  </component>\n  <component name=\"ExecutionTargetManager\" SELECTED_TARGET=\"default_target\" />\n  <component name=\"ExternalProjectsManager\">\n    <system id=\"GRADLE\">\n      <state>\n        <projects_view>\n          <tree_state>\n            <PATH>\n              <PATH_ELEMENT>\n                <option name=\"myItemId\" value=\"\" />\n                <option name=\"myItemType\" value=\"com.intellij.openapi.externalSystem.view.ExternalProjectsStructure$RootNode\" />\n              </PATH_ELEMENT>\n              <PATH_ELEMENT>\n                <option name=\"myItemId\" value=\"Kaku\" />\n                <option name=\"myItemType\" value=\"com.intellij.openapi.externalSystem.view.ProjectNode\" />\n              </PATH_ELEMENT>\n            </PATH>\n          </tree_state>\n        </projects_view>\n      </state>\n    </system>\n  </component>\n  <component name=\"FavoritesManager\">\n    <favorites_list name=\"Kaku\" />\n  </component>\n  <component name=\"FileEditorManager\">\n    <leaf SIDE_TABS_SIZE_LIMIT_KEY=\"300\">\n      <file leaf-file-name=\"Entry.java\" pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/Entry.java\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state vertical-scroll-proportion=\"0.0\">\n              <caret line=\"69\" column=\"16\" selection-start-line=\"69\" selection-start-column=\"16\" selection-end-line=\"69\" selection-end-column=\"16\" />\n              <folding>\n                <element signature=\"imports\" expanded=\"true\" />\n              </folding>\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file leaf-file-name=\"CaptureWindow.java\" pinned=\"false\" current-in-tab=\"true\">\n        <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/CaptureWindow.java\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state vertical-scroll-proportion=\"0.6378254\">\n              <caret line=\"60\" column=\"18\" selection-start-line=\"60\" selection-start-column=\"18\" selection-end-line=\"60\" selection-end-column=\"18\" />\n              <folding />\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file leaf-file-name=\"TesseractThread.java\" pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/TesseractThread.java\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state vertical-scroll-proportion=\"0.0\">\n              <caret line=\"40\" column=\"0\" selection-start-line=\"40\" selection-start-column=\"0\" selection-end-line=\"40\" selection-end-column=\"0\" />\n              <folding />\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file leaf-file-name=\"Window.java\" pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/Window.java\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state vertical-scroll-proportion=\"0.0\">\n              <caret line=\"36\" column=\"0\" selection-start-line=\"36\" selection-start-column=\"0\" selection-end-line=\"36\" selection-end-column=\"0\" />\n              <folding />\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file leaf-file-name=\"MainActivity.java\" pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/MainActivity.java\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state vertical-scroll-proportion=\"0.0\">\n              <caret line=\"7\" column=\"13\" selection-start-line=\"7\" selection-start-column=\"13\" selection-end-line=\"7\" selection-end-column=\"13\" />\n              <folding />\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file leaf-file-name=\"MainService.java\" pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/MainService.java\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state vertical-scroll-proportion=\"0.0\">\n              <caret line=\"143\" column=\"41\" selection-start-line=\"143\" selection-start-column=\"41\" selection-end-line=\"143\" selection-end-column=\"41\" />\n              <folding />\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file leaf-file-name=\"CommonParser.java\" pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/CommonParser.java\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state vertical-scroll-proportion=\"0.0\">\n              <caret line=\"32\" column=\"50\" selection-start-line=\"32\" selection-start-column=\"50\" selection-end-line=\"32\" selection-end-column=\"50\" />\n              <folding />\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file leaf-file-name=\"Searcher.java\" pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Search/Searcher.java\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state vertical-scroll-proportion=\"0.0\">\n              <caret line=\"46\" column=\"0\" selection-start-line=\"46\" selection-start-column=\"0\" selection-end-line=\"46\" selection-end-column=\"0\" />\n              <folding>\n                <element signature=\"imports\" expanded=\"true\" />\n              </folding>\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file leaf-file-name=\"JmDictThread.java\" pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDictThread.java\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state vertical-scroll-proportion=\"0.0\">\n              <caret line=\"130\" column=\"0\" selection-start-line=\"130\" selection-start-column=\"0\" selection-end-line=\"130\" selection-end-column=\"0\" />\n              <folding />\n            </state>\n          </provider>\n        </entry>\n      </file>\n      <file leaf-file-name=\"JmGloss.java\" pinned=\"false\" current-in-tab=\"false\">\n        <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDTO/JmGloss.java\">\n          <provider selected=\"true\" editor-type-id=\"text-editor\">\n            <state vertical-scroll-proportion=\"0.0\">\n              <caret line=\"42\" column=\"18\" selection-start-line=\"42\" selection-start-column=\"18\" selection-end-line=\"42\" selection-end-column=\"18\" />\n              <folding />\n            </state>\n          </provider>\n        </entry>\n      </file>\n    </leaf>\n  </component>\n  <component name=\"FileTemplateManagerImpl\">\n    <option name=\"RECENT_TEMPLATES\">\n      <list>\n        <option value=\"Interface\" />\n        <option value=\"layoutResourceFile_vertical\" />\n        <option value=\"resourceFile\" />\n        <option value=\"Class\" />\n      </list>\n    </option>\n  </component>\n  <component name=\"Git.Settings\">\n    <option name=\"RECENT_GIT_ROOT_PATH\" value=\"$PROJECT_DIR$\" />\n  </component>\n  <component name=\"GradleBuildTreeViewConfiguration\">\n    <option name=\"SHOW_GENERIC_MESSAGES\" value=\"false\" />\n  </component>\n  <component name=\"GradleLocalSettings\">\n    <option name=\"availableProjects\">\n      <map>\n        <entry>\n          <key>\n            <ExternalProjectPojo>\n              <option name=\"name\" value=\"Kaku\" />\n              <option name=\"path\" value=\"$PROJECT_DIR$\" />\n            </ExternalProjectPojo>\n          </key>\n          <value>\n            <list>\n              <ExternalProjectPojo>\n                <option name=\"name\" value=\":app\" />\n                <option name=\"path\" value=\"$PROJECT_DIR$/app\" />\n              </ExternalProjectPojo>\n              <ExternalProjectPojo>\n                <option name=\"name\" value=\"Kaku\" />\n                <option name=\"path\" value=\"$PROJECT_DIR$\" />\n              </ExternalProjectPojo>\n            </list>\n          </value>\n        </entry>\n      </map>\n    </option>\n    <option name=\"availableTasks\">\n      <map>\n        <entry key=\"$PROJECT_DIR$\">\n          <value>\n            <list>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays all buildscript dependencies declared in root project 'Kaku'.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"buildEnvironment\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"clean\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the components produced by root project 'Kaku'. [incubating]\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"components\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays all dependencies declared in root project 'Kaku'.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"dependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the insight into a specific dependency in root project 'Kaku'.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"dependencyInsight\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays a help message.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"help\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Initializes a new Gradle build. [incubating]\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"init\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the configuration model of root project 'Kaku'. [incubating]\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"model\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the sub-projects of root project 'Kaku'.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"projects\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the properties of root project 'Kaku'.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"properties\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the tasks runnable from root project 'Kaku' (some of the displayed tasks may belong to subprojects).\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"tasks\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Generates Gradle wrapper files. [incubating]\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"wrapper\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the Android dependencies of the project.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"androidDependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles all variants of all applications and secondary packages.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"assemble\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles all the Test applications.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"assembleAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles all Debug builds.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"assembleDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"assembleDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"assembleDebugUnitTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles all Release builds.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"assembleRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"assembleReleaseUnitTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles and tests this project.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"build\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles and tests this project and all projects that depend on it.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"buildDependents\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles and tests this project and all projects it depends on.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"buildNeeded\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs all checks.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"check\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"checkDebugManifest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"checkReleaseManifest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileDebugAidl\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileDebugAndroidTestAidl\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileDebugAndroidTestJavaWithJavac\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileDebugAndroidTestNdk\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileDebugAndroidTestRenderscript\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileDebugAndroidTestShaders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileDebugAndroidTestSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileDebugJavaWithJavac\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileDebugNdk\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileDebugRenderscript\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileDebugShaders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileDebugSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileDebugUnitTestJavaWithJavac\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileDebugUnitTestSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileLint\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileReleaseAidl\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileReleaseJavaWithJavac\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileReleaseNdk\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileReleaseRenderscript\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileReleaseShaders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileReleaseSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileReleaseUnitTestJavaWithJavac\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"compileReleaseUnitTestSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Installs and runs instrumentation tests for all flavors on connected devices.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"connectedAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs all device checks on currently connected devices.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"connectedCheck\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Installs and runs the tests for debug on connected devices.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"connectedDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Installs and runs instrumentation tests using all Device Providers.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"deviceAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs all device checks using Device Providers and Test Servers.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"deviceCheck\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"generateDebugAndroidTestAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"generateDebugAndroidTestBuildConfig\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"generateDebugAndroidTestResValues\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"generateDebugAndroidTestResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"generateDebugAndroidTestSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"generateDebugAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"generateDebugBuildConfig\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"generateDebugResValues\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"generateDebugResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"generateDebugSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"generateReleaseAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"generateReleaseBuildConfig\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"generateReleaseResValues\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"generateReleaseResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"generateReleaseSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"incrementalDebugAndroidTestJavaCompilationSafeguard\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"incrementalDebugJavaCompilationSafeguard\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"incrementalDebugUnitTestJavaCompilationSafeguard\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"incrementalReleaseJavaCompilationSafeguard\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"incrementalReleaseUnitTestJavaCompilationSafeguard\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Installs the Debug build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"installDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Installs the android (on device) tests for the Debug build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"installDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"jarDebugClasses\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"jarReleaseClasses\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs lint on all variants.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"lint\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs lint on the Debug build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"lintDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs lint on the Release build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"lintRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs lint on just the fatal issues in the Release build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"lintVitalRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"mergeDebugAndroidTestAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"mergeDebugAndroidTestJniLibFolders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"mergeDebugAndroidTestResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"mergeDebugAndroidTestShaders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"mergeDebugAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"mergeDebugJniLibFolders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"mergeDebugResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"mergeDebugShaders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"mergeReleaseAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"mergeReleaseJniLibFolders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"mergeReleaseResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"mergeReleaseShaders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Creates a version of android.jar that's suitable for unit tests.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"mockableAndroidJar\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"packageDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"packageDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"packageRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"preBuild\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"preDebugAndroidTestBuild\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"preDebugBuild\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"preDebugUnitTestBuild\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"prePackageMarkerForDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"prePackageMarkerForDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"prePackageMarkerForRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"preReleaseBuild\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"preReleaseUnitTestBuild\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Prepare com.android.support:animated-vector-drawable:23.2.1\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"prepareComAndroidSupportAnimatedVectorDrawable2321Library\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Prepare com.android.support:appcompat-v7:23.2.1\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"prepareComAndroidSupportAppcompatV72321Library\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Prepare com.android.support:support-v4:23.2.1\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"prepareComAndroidSupportSupportV42321Library\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Prepare com.android.support:support-vector-drawable:23.2.1\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"prepareComAndroidSupportSupportVectorDrawable2321Library\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Prepare com.rmtheis:tess-two:5.4.1\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"prepareComRmtheisTessTwo541Library\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"prepareDebugAndroidTestDependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"prepareDebugDependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"prepareDebugUnitTestDependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"prepareReleaseDependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"prepareReleaseUnitTestDependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"processDebugAndroidTestJavaRes\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"processDebugAndroidTestManifest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"processDebugAndroidTestResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"processDebugJavaRes\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"processDebugManifest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"processDebugResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"processDebugUnitTestJavaRes\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"processReleaseJavaRes\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"processReleaseManifest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"processReleaseResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"processReleaseUnitTestJavaRes\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the signing info for each variant.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"signingReport\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Prints out all the source sets defined in this project.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"sourceSets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Run unit tests for all variants.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"test\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Run unit tests for the debug build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"testDebugUnitTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Run unit tests for the release build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"testReleaseUnitTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"transformClassesWithDexForDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"transformClassesWithDexForDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"transformClassesWithDexForRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"transformNative_libsWithMergeJniLibsForDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"transformNative_libsWithMergeJniLibsForDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"transformNative_libsWithMergeJniLibsForRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"transformResourcesWithMergeJavaResForDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"transformResourcesWithMergeJavaResForDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"transformResourcesWithMergeJavaResForDebugUnitTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"transformResourcesWithMergeJavaResForRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"transformResourcesWithMergeJavaResForReleaseUnitTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Uninstall all applications.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"uninstallAll\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Uninstalls the Debug build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"uninstallDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Uninstalls the android (on device) tests for the Debug build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"uninstallDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Uninstalls the Release build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"uninstallRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"validateDebugSigning\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$\" />\n                <option name=\"name\" value=\"zipalignDebug\" />\n              </ExternalTaskPojo>\n            </list>\n          </value>\n        </entry>\n        <entry key=\"$PROJECT_DIR$/app\">\n          <value>\n            <list>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the Android dependencies of the project.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"androidDependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles all variants of all applications and secondary packages.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"assemble\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles all the Test applications.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"assembleAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles all Debug builds.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"assembleDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"assembleDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"assembleDebugUnitTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles all Release builds.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"assembleRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"assembleReleaseUnitTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles and tests this project.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"build\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles and tests this project and all projects that depend on it.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"buildDependents\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays all buildscript dependencies declared in project ':app'.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"buildEnvironment\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Assembles and tests this project and all projects it depends on.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"buildNeeded\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs all checks.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"check\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"checkDebugManifest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"checkReleaseManifest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Deletes the build directory.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"clean\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugAidl\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugAndroidTestAidl\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugAndroidTestJavaWithJavac\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugAndroidTestNdk\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugAndroidTestRenderscript\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugAndroidTestShaders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugAndroidTestSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugJavaWithJavac\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugNdk\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugRenderscript\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugShaders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugUnitTestJavaWithJavac\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileDebugUnitTestSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileLint\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileReleaseAidl\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileReleaseJavaWithJavac\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileReleaseNdk\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileReleaseRenderscript\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileReleaseShaders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileReleaseSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileReleaseUnitTestJavaWithJavac\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"compileReleaseUnitTestSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the components produced by project ':app'. [incubating]\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"components\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Installs and runs instrumentation tests for all flavors on connected devices.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"connectedAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs all device checks on currently connected devices.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"connectedCheck\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Installs and runs the tests for debug on connected devices.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"connectedDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays all dependencies declared in project ':app'.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"dependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the insight into a specific dependency in project ':app'.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"dependencyInsight\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Installs and runs instrumentation tests using all Device Providers.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"deviceAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs all device checks using Device Providers and Test Servers.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"deviceCheck\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugAndroidTestAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugAndroidTestBuildConfig\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugAndroidTestResValues\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugAndroidTestResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugAndroidTestSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugBuildConfig\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugResValues\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateDebugSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateReleaseAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateReleaseBuildConfig\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateReleaseResValues\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateReleaseResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"generateReleaseSources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays a help message.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"help\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"incrementalDebugAndroidTestJavaCompilationSafeguard\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"incrementalDebugJavaCompilationSafeguard\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"incrementalDebugUnitTestJavaCompilationSafeguard\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"incrementalReleaseJavaCompilationSafeguard\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"incrementalReleaseUnitTestJavaCompilationSafeguard\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Installs the Debug build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"installDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Installs the android (on device) tests for the Debug build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"installDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"jarDebugClasses\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"jarReleaseClasses\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs lint on all variants.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"lint\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs lint on the Debug build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"lintDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs lint on the Release build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"lintRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Runs lint on just the fatal issues in the Release build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"lintVitalRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeDebugAndroidTestAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeDebugAndroidTestJniLibFolders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeDebugAndroidTestResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeDebugAndroidTestShaders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeDebugAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeDebugJniLibFolders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeDebugResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeDebugShaders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeReleaseAssets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeReleaseJniLibFolders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeReleaseResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mergeReleaseShaders\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Creates a version of android.jar that's suitable for unit tests.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"mockableAndroidJar\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the configuration model of project ':app'. [incubating]\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"model\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"packageDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"packageDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"packageRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"preBuild\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"preDebugAndroidTestBuild\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"preDebugBuild\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"preDebugUnitTestBuild\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"prePackageMarkerForDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"prePackageMarkerForDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"prePackageMarkerForRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"preReleaseBuild\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"preReleaseUnitTestBuild\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Prepare com.android.support:animated-vector-drawable:23.2.1\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"prepareComAndroidSupportAnimatedVectorDrawable2321Library\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Prepare com.android.support:appcompat-v7:23.2.1\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"prepareComAndroidSupportAppcompatV72321Library\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Prepare com.android.support:support-v4:23.2.1\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"prepareComAndroidSupportSupportV42321Library\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Prepare com.android.support:support-vector-drawable:23.2.1\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"prepareComAndroidSupportSupportVectorDrawable2321Library\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Prepare com.rmtheis:tess-two:5.4.1\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"prepareComRmtheisTessTwo541Library\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"prepareDebugAndroidTestDependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"prepareDebugDependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"prepareDebugUnitTestDependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"prepareReleaseDependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"prepareReleaseUnitTestDependencies\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processDebugAndroidTestJavaRes\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processDebugAndroidTestManifest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processDebugAndroidTestResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processDebugJavaRes\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processDebugManifest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processDebugResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processDebugUnitTestJavaRes\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processReleaseJavaRes\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processReleaseManifest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processReleaseResources\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"processReleaseUnitTestJavaRes\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the sub-projects of project ':app'.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"projects\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the properties of project ':app'.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"properties\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the signing info for each variant.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"signingReport\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Prints out all the source sets defined in this project.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"sourceSets\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Displays the tasks runnable from project ':app'.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"tasks\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Run unit tests for all variants.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"test\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Run unit tests for the debug build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"testDebugUnitTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Run unit tests for the release build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"testReleaseUnitTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"transformClassesWithDexForDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"transformClassesWithDexForDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"transformClassesWithDexForRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"transformNative_libsWithMergeJniLibsForDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"transformNative_libsWithMergeJniLibsForDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"transformNative_libsWithMergeJniLibsForRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"transformResourcesWithMergeJavaResForDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"transformResourcesWithMergeJavaResForDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"transformResourcesWithMergeJavaResForDebugUnitTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"transformResourcesWithMergeJavaResForRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"transformResourcesWithMergeJavaResForReleaseUnitTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Uninstall all applications.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"uninstallAll\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Uninstalls the Debug build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"uninstallDebug\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Uninstalls the android (on device) tests for the Debug build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"uninstallDebugAndroidTest\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"description\" value=\"Uninstalls the Release build.\" />\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"uninstallRelease\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"validateDebugSigning\" />\n              </ExternalTaskPojo>\n              <ExternalTaskPojo>\n                <option name=\"linkedExternalProjectPath\" value=\"$PROJECT_DIR$/app\" />\n                <option name=\"name\" value=\"zipalignDebug\" />\n              </ExternalTaskPojo>\n            </list>\n          </value>\n        </entry>\n      </map>\n    </option>\n    <option name=\"modificationStamps\">\n      <map>\n        <entry key=\"$PROJECT_DIR$\" value=\"4406885891331\" />\n      </map>\n    </option>\n    <option name=\"projectBuildClasspath\">\n      <map>\n        <entry key=\"$PROJECT_DIR$\">\n          <value>\n            <ExternalProjectBuildClasspathPojo>\n              <option name=\"modulesBuildClasspath\">\n                <map>\n                  <entry key=\"$PROJECT_DIR$\">\n                    <value>\n                      <ExternalModuleBuildClasspathPojo>\n                        <option name=\"entries\">\n                          <list>\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle/2.1.3/gradle-2.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-core/2.1.3/gradle-core-2.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder/2.1.3/builder-2.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint/25.1.3/lint-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/transform-api/2.0.0-deprecated-use-gradle-api/transform-api-2.0.0-deprecated-use-gradle-api.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-api/2.1.3/gradle-api-2.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/compilerCommon/2.1.3/compilerCommon-2.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-gradle/5.2.1/proguard-gradle-5.2.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-gradle/5.2.1/proguard-gradle-5.2.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/jacoco/org.jacoco.core/0.7.6.201602180812/org.jacoco.core-0.7.6.201602180812.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-model/2.1.3/builder-model-2.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-test-api/2.1.3/builder-test-api-2.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdklib/25.1.3/sdklib-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdk-common/25.1.3/sdk-common-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/common/25.1.3/common-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/manifest-merger/25.1.3/manifest-merger-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/ddms/ddmlib/25.1.3/ddmlib-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jack/jack-api/0.10.0/jack-api-0.10.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jill/jill-api/0.10.0/jill-api-0.10.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/squareup/javawriter/2.5.0/javawriter-2.5.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/squareup/javawriter/2.5.0/javawriter-2.5.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-checks/25.1.3/lint-checks-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/annotations/25.1.3/annotations-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/guava/guava/17.0/guava-17.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/guava/guava/17.0/guava-17.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/baseLibrary/2.1.3/baseLibrary-2.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4/4.5/antlr4-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-io/commons-io/2.4/commons-io-2.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-io/commons-io/2.4/commons-io-2.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-base/5.2.1/proguard-base-5.2.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-base/5.2.1/proguard-base-5.2.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-debug-all/5.0.4/asm-debug-all-5.0.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/layoutlib/layoutlib-api/25.1.3/layoutlib-api-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/dvlib/25.1.3/dvlib-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/repository/25.1.3/repository-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/code/gson/gson/2.2.4/gson-2.2.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/code/gson/gson/2.2.4/gson-2.2.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpmime/4.1/httpmime-4.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpmime/4.1/httpmime-4.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-api/25.1.3/lint-api-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4-runtime/4.5/antlr4-runtime-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4-annotations/4.5/antlr4-annotations-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/antlr-runtime/3.5.2/antlr-runtime-3.5.2.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/ST4/4.0.8/ST4-4.0.8.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/intellij/annotations/12.0/annotations-12.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/intellij/annotations/12.0/annotations-12.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpcore/4.1/httpcore-4.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpcore/4.1/httpcore-4.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-codec/commons-codec/1.4/commons-codec-1.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-codec/commons-codec/1.4/commons-codec-1.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/external/lombok/lombok-ast/0.2.3/lombok-ast-0.2.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/external/lombok/lombok-ast/0.2.3/lombok-ast-0.2.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/abego/treelayout/org.abego.treelayout.core/1.0.1/org.abego.treelayout.core-1.0.1.jar\" />\n                          </list>\n                        </option>\n                        <option name=\"path\" value=\"$PROJECT_DIR$\" />\n                      </ExternalModuleBuildClasspathPojo>\n                    </value>\n                  </entry>\n                  <entry key=\"$PROJECT_DIR$/app\">\n                    <value>\n                      <ExternalModuleBuildClasspathPojo>\n                        <option name=\"entries\">\n                          <list>\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle/2.1.3/gradle-2.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-core/2.1.3/gradle-core-2.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder/2.1.3/builder-2.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint/25.1.3/lint-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/transform-api/2.0.0-deprecated-use-gradle-api/transform-api-2.0.0-deprecated-use-gradle-api.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-api/2.1.3/gradle-api-2.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/compilerCommon/2.1.3/compilerCommon-2.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-gradle/5.2.1/proguard-gradle-5.2.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-gradle/5.2.1/proguard-gradle-5.2.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/jacoco/org.jacoco.core/0.7.6.201602180812/org.jacoco.core-0.7.6.201602180812.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-model/2.1.3/builder-model-2.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-test-api/2.1.3/builder-test-api-2.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdklib/25.1.3/sdklib-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdk-common/25.1.3/sdk-common-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/common/25.1.3/common-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/manifest-merger/25.1.3/manifest-merger-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/ddms/ddmlib/25.1.3/ddmlib-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jack/jack-api/0.10.0/jack-api-0.10.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jill/jill-api/0.10.0/jill-api-0.10.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/squareup/javawriter/2.5.0/javawriter-2.5.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/squareup/javawriter/2.5.0/javawriter-2.5.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-checks/25.1.3/lint-checks-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/annotations/25.1.3/annotations-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/guava/guava/17.0/guava-17.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/guava/guava/17.0/guava-17.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/baseLibrary/2.1.3/baseLibrary-2.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4/4.5/antlr4-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-io/commons-io/2.4/commons-io-2.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-io/commons-io/2.4/commons-io-2.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-base/5.2.1/proguard-base-5.2.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-base/5.2.1/proguard-base-5.2.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-debug-all/5.0.4/asm-debug-all-5.0.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/layoutlib/layoutlib-api/25.1.3/layoutlib-api-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/dvlib/25.1.3/dvlib-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/repository/25.1.3/repository-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/code/gson/gson/2.2.4/gson-2.2.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/code/gson/gson/2.2.4/gson-2.2.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpmime/4.1/httpmime-4.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpmime/4.1/httpmime-4.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-api/25.1.3/lint-api-25.1.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4-runtime/4.5/antlr4-runtime-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4-annotations/4.5/antlr4-annotations-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/antlr-runtime/3.5.2/antlr-runtime-3.5.2.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/ST4/4.0.8/ST4-4.0.8.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/intellij/annotations/12.0/annotations-12.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/intellij/annotations/12.0/annotations-12.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpcore/4.1/httpcore-4.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpcore/4.1/httpcore-4.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-codec/commons-codec/1.4/commons-codec-1.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-codec/commons-codec/1.4/commons-codec-1.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/external/lombok/lombok-ast/0.2.3/lombok-ast-0.2.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/external/lombok/lombok-ast/0.2.3/lombok-ast-0.2.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/abego/treelayout/org.abego.treelayout.core/1.0.1/org.abego.treelayout.core-1.0.1.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.rmtheis/tess-two/5.4.1/6634a9e0f4263ad04f936c3e952732a6a29886d/tess-two-5.4.1.aar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/19.0/6ce200f6b23222af3d8abb6b6459e6c44f4bb0e9/guava-19.0.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.j256.ormlite/ormlite-android/4.48/afa06f539a4026c10b247386312aa67404b80a16/ormlite-android-4.48.jar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.7/751f548c85fa49f330cecbb1875893f971b33c4e/gson-2.7.jar\" />\n                            <option value=\"$PROJECT_DIR$/../../AndroidSDK/extras/android/m2repository/com/android/support/appcompat-v7/23.2.1/appcompat-v7-23.2.1.aar\" />\n                            <option value=\"$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.j256.ormlite/ormlite-core/4.48/e579bd2905d0399af5029aaaf9817d5fa0ca88a5/ormlite-core-4.48.jar\" />\n                            <option value=\"$PROJECT_DIR$/../../AndroidSDK/extras/android/m2repository/com/android/support/support-v4/23.2.1/support-v4-23.2.1.aar\" />\n                            <option value=\"$PROJECT_DIR$/../../AndroidSDK/extras/android/m2repository/com/android/support/animated-vector-drawable/23.2.1/animated-vector-drawable-23.2.1.aar\" />\n                            <option value=\"$PROJECT_DIR$/../../AndroidSDK/extras/android/m2repository/com/android/support/support-vector-drawable/23.2.1/support-vector-drawable-23.2.1.aar\" />\n                            <option value=\"$PROJECT_DIR$/../../AndroidSDK/extras/android/m2repository/com/android/support/support-annotations/23.2.1/support-annotations-23.2.1.jar\" />\n                          </list>\n                        </option>\n                        <option name=\"path\" value=\"$PROJECT_DIR$/app\" />\n                      </ExternalModuleBuildClasspathPojo>\n                    </value>\n                  </entry>\n                  <entry key=\"$PROJECT_DIR$/javax.xml.stream-1.0.1\">\n                    <value>\n                      <ExternalModuleBuildClasspathPojo>\n                        <option name=\"entries\">\n                          <list>\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle/2.1.0/gradle-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-core/2.1.0/gradle-core-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/jacoco/org.jacoco.core/0.7.4.201502262128/org.jacoco.core-0.7.4.201502262128-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/jacoco/org.jacoco.core/0.7.4.201502262128/org.jacoco.core-0.7.4.201502262128.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-api/2.1.0/gradle-api-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint/25.1.0/lint-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/compilerCommon/2.1.0/compilerCommon-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-gradle/5.2.1/proguard-gradle-5.2.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-gradle/5.2.1/proguard-gradle-5.2.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/transform-api/2.0.0-deprecated-use-gradle-api/transform-api-2.0.0-deprecated-use-gradle-api.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder/2.1.0/builder-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-debug-all/5.0.1/asm-debug-all-5.0.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-debug-all/5.0.1/asm-debug-all-5.0.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/guava/guava/17.0/guava-17.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/guava/guava/17.0/guava-17.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/annotations/25.1.0/annotations-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-checks/25.1.0/lint-checks-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4/4.5/antlr4-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-io/commons-io/2.4/commons-io-2.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-io/commons-io/2.4/commons-io-2.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/baseLibrary/2.1.0/baseLibrary-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-base/5.2.1/proguard-base-5.2.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-base/5.2.1/proguard-base-5.2.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-model/2.1.0/builder-model-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/common/25.1.0/common-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/ddms/ddmlib/25.1.0/ddmlib-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdklib/25.1.0/sdklib-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/squareup/javawriter/2.5.0/javawriter-2.5.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/squareup/javawriter/2.5.0/javawriter-2.5.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-test-api/2.1.0/builder-test-api-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdk-common/25.1.0/sdk-common-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/manifest-merger/25.1.0/manifest-merger-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jack/jack-api/0.10.0/jack-api-0.10.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jill/jill-api/0.10.0/jill-api-0.10.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-api/25.1.0/lint-api-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4-runtime/4.5/antlr4-runtime-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4-annotations/4.5/antlr4-annotations-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/antlr-runtime/3.5.2/antlr-runtime-3.5.2.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/ST4/4.0.8/ST4-4.0.8.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/repository/25.1.0/repository-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpmime/4.1/httpmime-4.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpmime/4.1/httpmime-4.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/code/gson/gson/2.2.4/gson-2.2.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/code/gson/gson/2.2.4/gson-2.2.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/dvlib/25.1.0/dvlib-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/layoutlib/layoutlib-api/25.1.0/layoutlib-api-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/external/lombok/lombok-ast/0.2.3/lombok-ast-0.2.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/external/lombok/lombok-ast/0.2.3/lombok-ast-0.2.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/abego/treelayout/org.abego.treelayout.core/1.0.1/org.abego.treelayout.core-1.0.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpcore/4.1/httpcore-4.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpcore/4.1/httpcore-4.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-codec/commons-codec/1.4/commons-codec-1.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-codec/commons-codec/1.4/commons-codec-1.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/intellij/annotations/12.0/annotations-12.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/intellij/annotations/12.0/annotations-12.0.jar\" />\n                          </list>\n                        </option>\n                        <option name=\"path\" value=\"$PROJECT_DIR$/javax.xml.stream-1.0.1\" />\n                      </ExternalModuleBuildClasspathPojo>\n                    </value>\n                  </entry>\n                  <entry key=\"$PROJECT_DIR$/simple-xml-2.7.1\">\n                    <value>\n                      <ExternalModuleBuildClasspathPojo>\n                        <option name=\"entries\">\n                          <list>\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle/2.1.0/gradle-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-core/2.1.0/gradle-core-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/jacoco/org.jacoco.core/0.7.4.201502262128/org.jacoco.core-0.7.4.201502262128-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/jacoco/org.jacoco.core/0.7.4.201502262128/org.jacoco.core-0.7.4.201502262128.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-api/2.1.0/gradle-api-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint/25.1.0/lint-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/compilerCommon/2.1.0/compilerCommon-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-gradle/5.2.1/proguard-gradle-5.2.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-gradle/5.2.1/proguard-gradle-5.2.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/transform-api/2.0.0-deprecated-use-gradle-api/transform-api-2.0.0-deprecated-use-gradle-api.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder/2.1.0/builder-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-debug-all/5.0.1/asm-debug-all-5.0.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-debug-all/5.0.1/asm-debug-all-5.0.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/guava/guava/17.0/guava-17.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/guava/guava/17.0/guava-17.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/annotations/25.1.0/annotations-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-checks/25.1.0/lint-checks-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4/4.5/antlr4-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-io/commons-io/2.4/commons-io-2.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-io/commons-io/2.4/commons-io-2.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/baseLibrary/2.1.0/baseLibrary-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-base/5.2.1/proguard-base-5.2.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-base/5.2.1/proguard-base-5.2.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-model/2.1.0/builder-model-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/common/25.1.0/common-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/ddms/ddmlib/25.1.0/ddmlib-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdklib/25.1.0/sdklib-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/squareup/javawriter/2.5.0/javawriter-2.5.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/squareup/javawriter/2.5.0/javawriter-2.5.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-test-api/2.1.0/builder-test-api-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdk-common/25.1.0/sdk-common-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/manifest-merger/25.1.0/manifest-merger-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jack/jack-api/0.10.0/jack-api-0.10.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jill/jill-api/0.10.0/jill-api-0.10.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-api/25.1.0/lint-api-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4-runtime/4.5/antlr4-runtime-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4-annotations/4.5/antlr4-annotations-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/antlr-runtime/3.5.2/antlr-runtime-3.5.2.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/ST4/4.0.8/ST4-4.0.8.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/repository/25.1.0/repository-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpmime/4.1/httpmime-4.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpmime/4.1/httpmime-4.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/code/gson/gson/2.2.4/gson-2.2.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/code/gson/gson/2.2.4/gson-2.2.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/dvlib/25.1.0/dvlib-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/layoutlib/layoutlib-api/25.1.0/layoutlib-api-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/external/lombok/lombok-ast/0.2.3/lombok-ast-0.2.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/external/lombok/lombok-ast/0.2.3/lombok-ast-0.2.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/abego/treelayout/org.abego.treelayout.core/1.0.1/org.abego.treelayout.core-1.0.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpcore/4.1/httpcore-4.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpcore/4.1/httpcore-4.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-codec/commons-codec/1.4/commons-codec-1.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-codec/commons-codec/1.4/commons-codec-1.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/intellij/annotations/12.0/annotations-12.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/intellij/annotations/12.0/annotations-12.0.jar\" />\n                          </list>\n                        </option>\n                        <option name=\"path\" value=\"$PROJECT_DIR$/simple-xml-2.7.1\" />\n                      </ExternalModuleBuildClasspathPojo>\n                    </value>\n                  </entry>\n                  <entry key=\"$PROJECT_DIR$/testjavax.xml.parsers\">\n                    <value>\n                      <ExternalModuleBuildClasspathPojo>\n                        <option name=\"entries\">\n                          <list>\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle/2.1.0/gradle-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-core/2.1.0/gradle-core-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/jacoco/org.jacoco.core/0.7.4.201502262128/org.jacoco.core-0.7.4.201502262128-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/jacoco/org.jacoco.core/0.7.4.201502262128/org.jacoco.core-0.7.4.201502262128.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-api/2.1.0/gradle-api-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint/25.1.0/lint-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/compilerCommon/2.1.0/compilerCommon-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-gradle/5.2.1/proguard-gradle-5.2.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-gradle/5.2.1/proguard-gradle-5.2.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/transform-api/2.0.0-deprecated-use-gradle-api/transform-api-2.0.0-deprecated-use-gradle-api.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder/2.1.0/builder-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-debug-all/5.0.1/asm-debug-all-5.0.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-debug-all/5.0.1/asm-debug-all-5.0.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/guava/guava/17.0/guava-17.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/guava/guava/17.0/guava-17.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/annotations/25.1.0/annotations-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-checks/25.1.0/lint-checks-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4/4.5/antlr4-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-io/commons-io/2.4/commons-io-2.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-io/commons-io/2.4/commons-io-2.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/baseLibrary/2.1.0/baseLibrary-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-base/5.2.1/proguard-base-5.2.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-base/5.2.1/proguard-base-5.2.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-model/2.1.0/builder-model-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/common/25.1.0/common-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/ddms/ddmlib/25.1.0/ddmlib-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdklib/25.1.0/sdklib-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/squareup/javawriter/2.5.0/javawriter-2.5.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/squareup/javawriter/2.5.0/javawriter-2.5.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-test-api/2.1.0/builder-test-api-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdk-common/25.1.0/sdk-common-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/manifest-merger/25.1.0/manifest-merger-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jack/jack-api/0.10.0/jack-api-0.10.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jill/jill-api/0.10.0/jill-api-0.10.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-api/25.1.0/lint-api-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4-runtime/4.5/antlr4-runtime-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4-annotations/4.5/antlr4-annotations-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/antlr-runtime/3.5.2/antlr-runtime-3.5.2.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/ST4/4.0.8/ST4-4.0.8.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/repository/25.1.0/repository-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpmime/4.1/httpmime-4.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpmime/4.1/httpmime-4.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/code/gson/gson/2.2.4/gson-2.2.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/code/gson/gson/2.2.4/gson-2.2.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/dvlib/25.1.0/dvlib-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/layoutlib/layoutlib-api/25.1.0/layoutlib-api-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/external/lombok/lombok-ast/0.2.3/lombok-ast-0.2.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/external/lombok/lombok-ast/0.2.3/lombok-ast-0.2.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/abego/treelayout/org.abego.treelayout.core/1.0.1/org.abego.treelayout.core-1.0.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpcore/4.1/httpcore-4.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpcore/4.1/httpcore-4.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-codec/commons-codec/1.4/commons-codec-1.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-codec/commons-codec/1.4/commons-codec-1.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/intellij/annotations/12.0/annotations-12.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/intellij/annotations/12.0/annotations-12.0.jar\" />\n                          </list>\n                        </option>\n                        <option name=\"path\" value=\"$PROJECT_DIR$/testjavax.xml.parsers\" />\n                      </ExternalModuleBuildClasspathPojo>\n                    </value>\n                  </entry>\n                  <entry key=\"$PROJECT_DIR$/testjavax.xml.steam\">\n                    <value>\n                      <ExternalModuleBuildClasspathPojo>\n                        <option name=\"entries\">\n                          <list>\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle/2.1.0/gradle-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-core/2.1.0/gradle-core-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/jacoco/org.jacoco.core/0.7.4.201502262128/org.jacoco.core-0.7.4.201502262128-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/jacoco/org.jacoco.core/0.7.4.201502262128/org.jacoco.core-0.7.4.201502262128.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-commons/5.0.3/asm-commons-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/gradle-api/2.1.0/gradle-api-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint/25.1.0/lint-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/compilerCommon/2.1.0/compilerCommon-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm/5.0.3/asm-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-gradle/5.2.1/proguard-gradle-5.2.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-gradle/5.2.1/proguard-gradle-5.2.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/transform-api/2.0.0-deprecated-use-gradle-api/transform-api-2.0.0-deprecated-use-gradle-api.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder/2.1.0/builder-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-debug-all/5.0.1/asm-debug-all-5.0.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-debug-all/5.0.1/asm-debug-all-5.0.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-tree/5.0.3/asm-tree-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/guava/guava/17.0/guava-17.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/guava/guava/17.0/guava-17.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/annotations/25.1.0/annotations-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-checks/25.1.0/lint-checks-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/eclipse/jdt/core/compiler/ecj/4.4.2/ecj-4.4.2.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/googlecode/juniversalchardet/juniversalchardet/1.0.3/juniversalchardet-1.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4/4.5/antlr4-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-io/commons-io/2.4/commons-io-2.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-io/commons-io/2.4/commons-io-2.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/databinding/baseLibrary/2.1.0/baseLibrary-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-base/5.2.1/proguard-base-5.2.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/proguard/proguard-base/5.2.1/proguard-base-5.2.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-model/2.1.0/builder-model-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/common/25.1.0/common-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/ddms/ddmlib/25.1.0/ddmlib-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcprov-jdk15on/1.48/bcprov-jdk15on-1.48.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdklib/25.1.0/sdklib-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/squareup/javawriter/2.5.0/javawriter-2.5.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/squareup/javawriter/2.5.0/javawriter-2.5.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/builder-test-api/2.1.0/builder-test-api-2.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/sdk-common/25.1.0/sdk-common-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/build/manifest-merger/25.1.0/manifest-merger-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jack/jack-api/0.10.0/jack-api-0.10.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/bouncycastle/bcpkix-jdk15on/1.48/bcpkix-jdk15on-1.48.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/jill/jill-api/0.10.0/jill-api-0.10.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/ow2/asm/asm-analysis/5.0.3/asm-analysis-5.0.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/lint/lint-api/25.1.0/lint-api-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4-runtime/4.5/antlr4-runtime-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/tunnelvisionlabs/antlr4-annotations/4.5/antlr4-annotations-4.5.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/antlr-runtime/3.5.2/antlr-runtime-3.5.2.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/antlr/ST4/4.0.8/ST4-4.0.8.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/repository/25.1.0/repository-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpclient/4.1.1/httpclient-4.1.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpmime/4.1/httpmime-4.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpmime/4.1/httpmime-4.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/code/gson/gson/2.2.4/gson-2.2.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/google/code/gson/gson/2.2.4/gson-2.2.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/commons/commons-compress/1.8.1/commons-compress-1.8.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/dvlib/25.1.0/dvlib-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/layoutlib/layoutlib-api/25.1.0/layoutlib-api-25.1.0.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/external/lombok/lombok-ast/0.2.3/lombok-ast-0.2.3-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/android/tools/external/lombok/lombok-ast/0.2.3/lombok-ast-0.2.3.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/abego/treelayout/org.abego.treelayout.core/1.0.1/org.abego.treelayout.core-1.0.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpcore/4.1/httpcore-4.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/org/apache/httpcomponents/httpcore/4.1/httpcore-4.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-logging/commons-logging/1.1.1/commons-logging-1.1.1.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-codec/commons-codec/1.4/commons-codec-1.4-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/commons-codec/commons-codec/1.4/commons-codec-1.4.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/intellij/annotations/12.0/annotations-12.0-sources.jar\" />\n                            <option value=\"$APPLICATION_HOME_DIR$/gradle/m2repository/com/intellij/annotations/12.0/annotations-12.0.jar\" />\n                          </list>\n                        </option>\n                        <option name=\"path\" value=\"$PROJECT_DIR$/testjavax.xml.steam\" />\n                      </ExternalModuleBuildClasspathPojo>\n                    </value>\n                  </entry>\n                </map>\n              </option>\n              <option name=\"name\" value=\"app\" />\n              <option name=\"projectBuildClasspath\">\n                <list>\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/ant-1.9.6.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/ant-launcher-1.9.6.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-base-services-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-base-services-groovy-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-cli-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-core-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-docs-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-installation-beacon-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-jvm-services-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-launcher-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-logging-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-messaging-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-model-core-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-model-groovy-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-native-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-open-api-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-process-services-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-resources-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-tooling-api-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-ui-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/gradle-wrapper-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/groovy-all-2.4.4.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-announce-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-antlr-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-build-comparison-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-build-init-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-code-quality-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-dependency-management-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-diagnostics-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-ear-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-ide-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-ide-native-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-ide-play-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-ivy-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-jacoco-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-javascript-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-jetty-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-language-groovy-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-language-java-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-language-jvm-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-language-native-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-language-scala-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-maven-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-osgi-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-platform-base-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-platform-jvm-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-platform-native-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-platform-play-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-plugin-development-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-plugin-use-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-plugins-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-publish-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-reporting-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-resources-http-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-resources-s3-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-resources-sftp-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-scala-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-signing-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-sonar-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-test-kit-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-testing-base-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-testing-jvm-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-testing-native-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/gradle-tooling-api-builders-2.14.1.jar\" />\n                  <option value=\"$APPLICATION_HOME_DIR$/gradle/gradle-2.14.1/lib/plugins/ivy-2.2.0.jar\" />\n                  <option value=\"$PROJECT_DIR$/buildSrc/src/main/java\" />\n                  <option value=\"$PROJECT_DIR$/buildSrc/src/main/groovy\" />\n                </list>\n              </option>\n            </ExternalProjectBuildClasspathPojo>\n          </value>\n        </entry>\n      </map>\n    </option>\n    <option name=\"externalProjectsViewState\">\n      <projects_view />\n    </option>\n  </component>\n  <component name=\"IdeDocumentHistory\">\n    <option name=\"CHANGED_PATHS\">\n      <list>\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/KanjiPriModel.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningModel.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/ReadingModel.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/KanjiInf.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/ReadingInf.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/KanjiPri.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/ReadingPri.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/ReadingRestr.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/DbOpenHelper.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/CommonParser.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDTO/JmDict.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDTO/JmEntry.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDTO/JmSense.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmConsts.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDTO/JmGloss.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDTO/JmLsource.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/KanjiIrregularity.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/KanjiPriority.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/Meaning.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/Reading.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/ReadingIrregularity.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/ReadingPriority.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/ReadingRestriction.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningAdditionalInfo.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningAntonym.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningCrossReference.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningDialect.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningField.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningGloss.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningKanjiRestriction.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningLoanSource.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningMisc.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningPartOfSpeech.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningReadingRestriction.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/res/drawable/shape_round_corners_black.xml\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/res/drawable/shape_white.xml\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/res/layout/info_window.xml\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/res/values/colors.xml\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/KanjiCharacterView.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/KanjiGridView.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/DatabaseHelper.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/res/values/styles.xml\" />\n        <option value=\"$PROJECT_DIR$/app/build.gradle\" />\n        <option value=\"$PROJECT_DIR$/build.gradle\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/InformationWindow.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/KakuTools.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/Kanji.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Search/Searcher.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/Entry.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDictThread.java\" />\n        <option value=\"$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/CaptureWindow.java\" />\n      </list>\n    </option>\n  </component>\n  <component name=\"ProjectFrameBounds\">\n    <option name=\"x\" value=\"-7\" />\n    <option name=\"y\" value=\"30\" />\n    <option name=\"width\" value=\"1934\" />\n    <option name=\"height\" value=\"2137\" />\n  </component>\n  <component name=\"ProjectInspectionProfilesVisibleTreeState\">\n    <entry key=\"Project Default\">\n      <profile-state>\n        <expanded-state>\n          <State>\n            <id />\n          </State>\n        </expanded-state>\n        <selected-state>\n          <State>\n            <id>Android</id>\n          </State>\n        </selected-state>\n      </profile-state>\n    </entry>\n  </component>\n  <component name=\"ProjectLevelVcsManager\" settingsEditedManually=\"true\">\n    <OptionsSetting value=\"true\" id=\"Add\" />\n    <OptionsSetting value=\"true\" id=\"Remove\" />\n    <OptionsSetting value=\"true\" id=\"Checkout\" />\n    <OptionsSetting value=\"true\" id=\"Update\" />\n    <OptionsSetting value=\"true\" id=\"Status\" />\n    <OptionsSetting value=\"true\" id=\"Edit\" />\n    <ConfirmationsSetting value=\"2\" id=\"Add\" />\n    <ConfirmationsSetting value=\"0\" id=\"Remove\" />\n  </component>\n  <component name=\"ProjectView\">\n    <navigator currentView=\"AndroidView\" proportions=\"\" version=\"1\">\n      <flattenPackages />\n      <showMembers />\n      <showModules />\n      <showLibraryContents />\n      <hideEmptyPackages />\n      <abbreviatePackageNames />\n      <autoscrollToSource />\n      <autoscrollFromSource />\n      <sortByType />\n      <manualOrder />\n      <foldersAlwaysOnTop value=\"true\" />\n    </navigator>\n    <panes>\n      <pane id=\"PackagesPane\">\n        <subPane>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PackageViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PackageViewModuleNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n        </subPane>\n      </pane>\n      <pane id=\"Scratches\" />\n      <pane id=\"Scope\">\n        <subPane subId=\"Project Files\">\n          <PATH>\n            <PATH_ELEMENT USER_OBJECT=\"Root\">\n              <option name=\"myItemId\" value=\"\" />\n              <option name=\"myItemType\" value=\"\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT USER_OBJECT=\"Root\">\n              <option name=\"myItemId\" value=\"\" />\n              <option name=\"myItemType\" value=\"\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT USER_OBJECT=\"app\">\n              <option name=\"myItemId\" value=\"\" />\n              <option name=\"myItemType\" value=\"\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT USER_OBJECT=\"app\">\n              <option name=\"myItemId\" value=\"\" />\n              <option name=\"myItemType\" value=\"\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT USER_OBJECT=\"Root\">\n              <option name=\"myItemId\" value=\"\" />\n              <option name=\"myItemType\" value=\"\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT USER_OBJECT=\"app\">\n              <option name=\"myItemId\" value=\"\" />\n              <option name=\"myItemType\" value=\"\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT USER_OBJECT=\"app\">\n              <option name=\"myItemId\" value=\"\" />\n              <option name=\"myItemType\" value=\"\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT USER_OBJECT=\"src\">\n              <option name=\"myItemId\" value=\"\" />\n              <option name=\"myItemType\" value=\"\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT USER_OBJECT=\"test/java\">\n              <option name=\"myItemId\" value=\"\" />\n              <option name=\"myItemType\" value=\"\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT USER_OBJECT=\"ca/fuwafuwa/kaku\">\n              <option name=\"myItemId\" value=\"\" />\n              <option name=\"myItemType\" value=\"\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT USER_OBJECT=\"Root\">\n              <option name=\"myItemId\" value=\"\" />\n              <option name=\"myItemType\" value=\"\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT USER_OBJECT=\"app\">\n              <option name=\"myItemId\" value=\"\" />\n              <option name=\"myItemType\" value=\"\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT USER_OBJECT=\"app\">\n              <option name=\"myItemId\" value=\"\" />\n              <option name=\"myItemType\" value=\"\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT USER_OBJECT=\"src\">\n              <option name=\"myItemId\" value=\"\" />\n              <option name=\"myItemType\" value=\"\" />\n            </PATH_ELEMENT>\n          </PATH>\n        </subPane>\n      </pane>\n      <pane id=\"AndroidView\">\n        <subPane>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Gradle Scripts\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidBuildScriptsGroupNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidModuleNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidModuleNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"java\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidSourceTypeNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidModuleNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"java\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidSourceTypeNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidPsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidModuleNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"java\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidSourceTypeNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidPsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"XmlParsers\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidModuleNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"java\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidSourceTypeNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidPsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Windows\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidModuleNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"java\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidSourceTypeNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidPsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Windows\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Views\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidModuleNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"java\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidSourceTypeNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidPsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Windows\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Interfaces\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidModuleNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"java\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidSourceTypeNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidPsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Search\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidModuleNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"java\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidSourceTypeNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidPsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Interfaces\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidModuleNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"java\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidSourceTypeNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidPsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Database\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidModuleNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"java\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidSourceTypeNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"kaku\" />\n              <option name=\"myItemType\" value=\"com.android.tools.idea.navigator.nodes.AndroidPsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Database\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Models\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n        </subPane>\n      </pane>\n      <pane id=\"ProjectPane\">\n        <subPane>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"External Libraries\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.ExternalLibrariesNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"src\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"src\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"main\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"src\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"main\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"java\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"src\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"main\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"java\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"XmlParsers\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"Kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"app\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"src\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"main\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"java\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"kaku\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"XmlParsers\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"JmDTO\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n        </subPane>\n      </pane>\n    </panes>\n  </component>\n  <component name=\"PropertiesComponent\">\n    <property name=\"android.sdk.path\" value=\"$PROJECT_DIR$/../../AndroidSDK\" />\n    <property name=\"settings.editor.selected.configurable\" value=\"preferences.lookFeel\" />\n    <property name=\"settings.editor.splitter.proportion\" value=\"0.2\" />\n    <property name=\"device.picker.selection\" value=\"APU0215C02007621\" />\n    <property name=\"last_opened_file_path\" value=\"$PROJECT_DIR$/../StandOut-master\" />\n    <property name=\"UI_DESIGNER_EDITOR_MODE.CaptureAnalysis.SHOW\" value=\"false\" />\n    <property name=\"SearchEverywhereHistoryKey\" value=\"&#9;FILE&#9;file://D:/Android/Projects/Kaku/app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDictThread.java&#10;line num&#9;ACTION&#9;EditorToggleShowLineNumbers\" />\n    <property name=\"android.project.structure.last.selected\" value=\"SDK Location\" />\n    <property name=\"android.project.structure.proportion\" value=\"0.15\" />\n    <property name=\"AndroidTargetDevices\" value=\"HT4AJJT04447\" />\n    <property name=\"NetworkMonitor.position\" value=\"3\" />\n    <property name=\"GpuMonitor.position\" value=\"2\" />\n    <property name=\"DEBUGGABLE_DEVICE\" value=\"huawei-nexus_6p-5VT7N15A17000907\" />\n    <property name=\"DEBUGGABLE_PROCESS\" value=\"ca.fuwafuwa.kaku\" />\n    <property name=\"SHOW_ALL_PROCESSES\" value=\"false\" />\n  </component>\n  <component name=\"RecentsManager\">\n    <key name=\"MoveClassesOrPackagesDialog.RECENTS_KEY\">\n      <recent name=\"ca.fuwafuwa.kaku.Windows.Views\" />\n      <recent name=\"ca.fuwafuwa.kaku.Views\" />\n      <recent name=\"ca.fuwafuwa.kaku.Interfaces\" />\n      <recent name=\"ca.fuwafuwa.kaku.Windows.Interfaces\" />\n      <recent name=\"ca.fuwafuwa.kaku.XmlParsers.JmDTO\" />\n    </key>\n    <key name=\"CreateClassDialog.RecentsKey\">\n      <recent name=\"ca.fuwafuwa.kaku.Database.Models\" />\n      <recent name=\"ca.fuwafuwa.kaku.XmlParsers.JmDTO\" />\n    </key>\n    <key name=\"CopyFile.RECENT_KEYS\">\n      <recent name=\"D:\\Android\\Projects\\Kaku\\app\\src\\main\\res\\drawable\" />\n    </key>\n  </component>\n  <component name=\"RunManager\" selected=\"Android Application.app\">\n    <configuration default=\"false\" name=\"ExampleUnitTest.fuckingXml\" type=\"JUnit\" factoryName=\"JUnit\" temporary=\"true\" nameIsGenerated=\"true\">\n      <extension name=\"coverage\" enabled=\"false\" merge=\"false\" sample_coverage=\"true\" runner=\"idea\">\n        <pattern>\n          <option name=\"PATTERN\" value=\"ca.fuwafuwa.kaku.Interfaces.*\" />\n          <option name=\"ENABLED\" value=\"true\" />\n        </pattern>\n      </extension>\n      <module name=\"app\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"PACKAGE_NAME\" value=\"ca.fuwafuwa.kaku\" />\n      <option name=\"MAIN_CLASS_NAME\" value=\"ca.fuwafuwa.kaku.ExampleUnitTest\" />\n      <option name=\"METHOD_NAME\" value=\"fuckingXml\" />\n      <option name=\"TEST_OBJECT\" value=\"method\" />\n      <option name=\"VM_PARAMETERS\" value=\"-ea\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$MODULE_DIR$\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"singleModule\" />\n      </option>\n      <envs />\n      <patterns />\n      <method />\n    </configuration>\n    <configuration default=\"false\" name=\"ExampleUnitTest.wtfXmlSrsly\" type=\"JUnit\" factoryName=\"JUnit\" temporary=\"true\" nameIsGenerated=\"true\">\n      <extension name=\"coverage\" enabled=\"false\" merge=\"false\" sample_coverage=\"true\" runner=\"idea\">\n        <pattern>\n          <option name=\"PATTERN\" value=\"ca.fuwafuwa.kaku.Interfaces.*\" />\n          <option name=\"ENABLED\" value=\"true\" />\n        </pattern>\n      </extension>\n      <module name=\"app\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"PACKAGE_NAME\" value=\"ca.fuwafuwa.kaku\" />\n      <option name=\"MAIN_CLASS_NAME\" value=\"ca.fuwafuwa.kaku.ExampleUnitTest\" />\n      <option name=\"METHOD_NAME\" value=\"wtfXmlSrsly\" />\n      <option name=\"TEST_OBJECT\" value=\"method\" />\n      <option name=\"VM_PARAMETERS\" value=\"-ea\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$MODULE_DIR$\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"singleModule\" />\n      </option>\n      <envs />\n      <patterns />\n      <method />\n    </configuration>\n    <configuration default=\"false\" name=\"ExampleUnitTest.testXml\" type=\"JUnit\" factoryName=\"JUnit\" temporary=\"true\" nameIsGenerated=\"true\">\n      <extension name=\"coverage\" enabled=\"false\" merge=\"false\" sample_coverage=\"true\" runner=\"idea\">\n        <pattern>\n          <option name=\"PATTERN\" value=\"ca.fuwafuwa.kaku.Interfaces.*\" />\n          <option name=\"ENABLED\" value=\"true\" />\n        </pattern>\n      </extension>\n      <module name=\"app\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"PACKAGE_NAME\" value=\"ca.fuwafuwa.kaku\" />\n      <option name=\"MAIN_CLASS_NAME\" value=\"ca.fuwafuwa.kaku.ExampleUnitTest\" />\n      <option name=\"METHOD_NAME\" value=\"testXml\" />\n      <option name=\"TEST_OBJECT\" value=\"method\" />\n      <option name=\"VM_PARAMETERS\" value=\"-ea\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$MODULE_DIR$\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"singleModule\" />\n      </option>\n      <envs />\n      <patterns />\n      <method />\n    </configuration>\n    <configuration default=\"false\" name=\"ExampleUnitTest.test\" type=\"JUnit\" factoryName=\"JUnit\" temporary=\"true\" nameIsGenerated=\"true\">\n      <extension name=\"coverage\" enabled=\"false\" merge=\"false\" sample_coverage=\"true\" runner=\"idea\">\n        <pattern>\n          <option name=\"PATTERN\" value=\"ca.fuwafuwa.kaku.Interfaces.*\" />\n          <option name=\"ENABLED\" value=\"true\" />\n        </pattern>\n      </extension>\n      <module name=\"app\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"PACKAGE_NAME\" value=\"ca.fuwafuwa.kaku\" />\n      <option name=\"MAIN_CLASS_NAME\" value=\"ca.fuwafuwa.kaku.ExampleUnitTest\" />\n      <option name=\"METHOD_NAME\" value=\"test\" />\n      <option name=\"TEST_OBJECT\" value=\"method\" />\n      <option name=\"VM_PARAMETERS\" value=\"-ea\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$MODULE_DIR$\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"singleModule\" />\n      </option>\n      <envs />\n      <patterns />\n      <method />\n    </configuration>\n    <configuration default=\"false\" name=\"ExampleUnitTest.TestXmlParser\" type=\"JUnit\" factoryName=\"JUnit\" temporary=\"true\" nameIsGenerated=\"true\">\n      <extension name=\"coverage\" enabled=\"false\" merge=\"false\" sample_coverage=\"true\" runner=\"idea\">\n        <pattern>\n          <option name=\"PATTERN\" value=\"ca.fuwafuwa.kaku.Interfaces.*\" />\n          <option name=\"ENABLED\" value=\"true\" />\n        </pattern>\n      </extension>\n      <module name=\"app\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"PACKAGE_NAME\" value=\"ca.fuwafuwa.kaku\" />\n      <option name=\"MAIN_CLASS_NAME\" value=\"ca.fuwafuwa.kaku.ExampleUnitTest\" />\n      <option name=\"METHOD_NAME\" value=\"TestXmlParser\" />\n      <option name=\"TEST_OBJECT\" value=\"method\" />\n      <option name=\"VM_PARAMETERS\" value=\"-ea\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$MODULE_DIR$\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"singleModule\" />\n      </option>\n      <envs />\n      <patterns />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"AndroidRunConfigurationType\" factoryName=\"Android Application\">\n      <module name=\"\" />\n      <option name=\"DEPLOY\" value=\"true\" />\n      <option name=\"ARTIFACT_NAME\" value=\"\" />\n      <option name=\"PM_INSTALL_OPTIONS\" value=\"\" />\n      <option name=\"ACTIVITY_EXTRA_FLAGS\" value=\"\" />\n      <option name=\"MODE\" value=\"default_activity\" />\n      <option name=\"TARGET_SELECTION_MODE\" value=\"SHOW_DIALOG\" />\n      <option name=\"PREFERRED_AVD\" value=\"\" />\n      <option name=\"CLEAR_LOGCAT\" value=\"false\" />\n      <option name=\"SHOW_LOGCAT_AUTOMATICALLY\" value=\"true\" />\n      <option name=\"SKIP_NOOP_APK_INSTALLATIONS\" value=\"true\" />\n      <option name=\"FORCE_STOP_RUNNING_APP\" value=\"true\" />\n      <option name=\"DEBUGGER_TYPE\" value=\"Java\" />\n      <option name=\"USE_LAST_SELECTED_DEVICE\" value=\"false\" />\n      <option name=\"PREFERRED_AVD\" value=\"\" />\n      <option name=\"SELECTED_CLOUD_MATRIX_CONFIGURATION_ID\" value=\"-1\" />\n      <option name=\"SELECTED_CLOUD_MATRIX_PROJECT_ID\" value=\"\" />\n      <Native>\n        <option name=\"WORKING_DIR\" value=\"\" />\n        <option name=\"TARGET_LOGGING_CHANNELS\" value=\"lldb process:gdb-remote packets\" />\n      </Native>\n      <Java />\n      <Hybrid>\n        <option name=\"WORKING_DIR\" value=\"\" />\n        <option name=\"TARGET_LOGGING_CHANNELS\" value=\"lldb process:gdb-remote packets\" />\n      </Hybrid>\n      <Profilers>\n        <option name=\"GAPID_DISABLE_PCS\" value=\"false\" />\n      </Profilers>\n      <option name=\"DEEP_LINK\" value=\"\" />\n      <option name=\"ACTIVITY_CLASS\" value=\"\" />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"AndroidTestRunConfigurationType\" factoryName=\"Android Tests\">\n      <module name=\"\" />\n      <option name=\"TESTING_TYPE\" value=\"0\" />\n      <option name=\"INSTRUMENTATION_RUNNER_CLASS\" value=\"\" />\n      <option name=\"METHOD_NAME\" value=\"\" />\n      <option name=\"CLASS_NAME\" value=\"\" />\n      <option name=\"PACKAGE_NAME\" value=\"\" />\n      <option name=\"EXTRA_OPTIONS\" value=\"\" />\n      <option name=\"TARGET_SELECTION_MODE\" value=\"SHOW_DIALOG\" />\n      <option name=\"PREFERRED_AVD\" value=\"\" />\n      <option name=\"CLEAR_LOGCAT\" value=\"false\" />\n      <option name=\"SHOW_LOGCAT_AUTOMATICALLY\" value=\"true\" />\n      <option name=\"SKIP_NOOP_APK_INSTALLATIONS\" value=\"true\" />\n      <option name=\"FORCE_STOP_RUNNING_APP\" value=\"true\" />\n      <option name=\"DEBUGGER_TYPE\" value=\"Java\" />\n      <option name=\"USE_LAST_SELECTED_DEVICE\" value=\"false\" />\n      <option name=\"PREFERRED_AVD\" value=\"\" />\n      <option name=\"SELECTED_CLOUD_MATRIX_CONFIGURATION_ID\" value=\"-1\" />\n      <option name=\"SELECTED_CLOUD_MATRIX_PROJECT_ID\" value=\"\" />\n      <Native>\n        <option name=\"WORKING_DIR\" value=\"\" />\n        <option name=\"TARGET_LOGGING_CHANNELS\" value=\"lldb process:gdb-remote packets\" />\n      </Native>\n      <Java />\n      <Hybrid>\n        <option name=\"WORKING_DIR\" value=\"\" />\n        <option name=\"TARGET_LOGGING_CHANNELS\" value=\"lldb process:gdb-remote packets\" />\n      </Hybrid>\n      <Profilers>\n        <option name=\"GAPID_DISABLE_PCS\" value=\"false\" />\n      </Profilers>\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"Application\" factoryName=\"Application\">\n      <extension name=\"coverage\" enabled=\"false\" merge=\"false\" sample_coverage=\"true\" runner=\"idea\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"VM_PARAMETERS\" />\n      <option name=\"PROGRAM_PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$PROJECT_DIR$\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"ENABLE_SWING_INSPECTOR\" value=\"false\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <module name=\"\" />\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"GroovyScriptRunConfiguration\" factoryName=\"Groovy\">\n      <module name=\"\" />\n      <setting name=\"path\" value=\"\" />\n      <setting name=\"vmparams\" value=\"\" />\n      <setting name=\"params\" value=\"\" />\n      <setting name=\"workDir\" value=\"file://$PROJECT_DIR$\" />\n      <setting name=\"debug\" value=\"false\" />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"JUnit\" factoryName=\"JUnit\">\n      <extension name=\"coverage\" enabled=\"false\" merge=\"false\" sample_coverage=\"true\" runner=\"idea\" />\n      <module name=\"\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"PACKAGE_NAME\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"METHOD_NAME\" />\n      <option name=\"TEST_OBJECT\" value=\"class\" />\n      <option name=\"VM_PARAMETERS\" value=\"-ea\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$MODULE_DIR$\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"singleModule\" />\n      </option>\n      <envs />\n      <patterns />\n      <method>\n        <option name=\"Make\" enabled=\"false\" />\n        <option name=\"Android.Gradle.BeforeRunTask\" enabled=\"true\" />\n      </method>\n    </configuration>\n    <configuration default=\"true\" type=\"JUnitTestDiscovery\" factoryName=\"JUnit Test Discovery\" changeList=\"All\">\n      <extension name=\"coverage\" enabled=\"false\" merge=\"false\" sample_coverage=\"true\" runner=\"idea\" />\n      <module name=\"\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"PACKAGE_NAME\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"METHOD_NAME\" />\n      <option name=\"TEST_OBJECT\" value=\"class\" />\n      <option name=\"VM_PARAMETERS\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"singleModule\" />\n      </option>\n      <envs />\n      <patterns />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"JarApplication\" factoryName=\"JAR Application\">\n      <extension name=\"coverage\" enabled=\"false\" merge=\"false\" sample_coverage=\"true\" runner=\"idea\" />\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"Java Scratch\" factoryName=\"Java Scratch\">\n      <extension name=\"coverage\" enabled=\"false\" merge=\"false\" sample_coverage=\"true\" runner=\"idea\" />\n      <option name=\"SCRATCH_FILE_ID\" value=\"0\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"VM_PARAMETERS\" />\n      <option name=\"PROGRAM_PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"ENABLE_SWING_INSPECTOR\" value=\"false\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <module name=\"\" />\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"Remote\" factoryName=\"Remote\">\n      <option name=\"USE_SOCKET_TRANSPORT\" value=\"true\" />\n      <option name=\"SERVER_MODE\" value=\"false\" />\n      <option name=\"SHMEM_ADDRESS\" value=\"javadebug\" />\n      <option name=\"HOST\" value=\"localhost\" />\n      <option name=\"PORT\" value=\"5005\" />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"TestNG\" factoryName=\"TestNG\">\n      <extension name=\"coverage\" enabled=\"false\" merge=\"false\" sample_coverage=\"true\" runner=\"idea\" />\n      <module name=\"\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"SUITE_NAME\" />\n      <option name=\"PACKAGE_NAME\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"METHOD_NAME\" />\n      <option name=\"GROUP_NAME\" />\n      <option name=\"TEST_OBJECT\" value=\"CLASS\" />\n      <option name=\"VM_PARAMETERS\" value=\"-ea\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"$MODULE_DIR$\" />\n      <option name=\"OUTPUT_DIRECTORY\" />\n      <option name=\"ANNOTATION_TYPE\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"singleModule\" />\n      </option>\n      <option name=\"USE_DEFAULT_REPORTERS\" value=\"false\" />\n      <option name=\"PROPERTIES_FILE\" />\n      <envs />\n      <properties />\n      <listeners />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"TestNGTestDiscovery\" factoryName=\"TestNG Test Discovery\" changeList=\"All\">\n      <extension name=\"coverage\" enabled=\"false\" merge=\"false\" sample_coverage=\"true\" runner=\"idea\" />\n      <module name=\"\" />\n      <option name=\"ALTERNATIVE_JRE_PATH_ENABLED\" value=\"false\" />\n      <option name=\"ALTERNATIVE_JRE_PATH\" />\n      <option name=\"SUITE_NAME\" />\n      <option name=\"PACKAGE_NAME\" />\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"METHOD_NAME\" />\n      <option name=\"GROUP_NAME\" />\n      <option name=\"TEST_OBJECT\" value=\"CLASS\" />\n      <option name=\"VM_PARAMETERS\" />\n      <option name=\"PARAMETERS\" />\n      <option name=\"WORKING_DIRECTORY\" />\n      <option name=\"OUTPUT_DIRECTORY\" />\n      <option name=\"ANNOTATION_TYPE\" />\n      <option name=\"ENV_VARIABLES\" />\n      <option name=\"PASS_PARENT_ENVS\" value=\"true\" />\n      <option name=\"TEST_SEARCH_SCOPE\">\n        <value defaultName=\"singleModule\" />\n      </option>\n      <option name=\"USE_DEFAULT_REPORTERS\" value=\"false\" />\n      <option name=\"PROPERTIES_FILE\" />\n      <envs />\n      <properties />\n      <listeners />\n      <method />\n    </configuration>\n    <configuration default=\"false\" name=\"app\" type=\"AndroidRunConfigurationType\" factoryName=\"Android Application\" activateToolWindowBeforeRun=\"false\">\n      <module name=\"app\" />\n      <option name=\"DEPLOY\" value=\"true\" />\n      <option name=\"ARTIFACT_NAME\" value=\"\" />\n      <option name=\"PM_INSTALL_OPTIONS\" value=\"\" />\n      <option name=\"ACTIVITY_EXTRA_FLAGS\" value=\"\" />\n      <option name=\"MODE\" value=\"default_activity\" />\n      <option name=\"TARGET_SELECTION_MODE\" value=\"SHOW_DIALOG\" />\n      <option name=\"PREFERRED_AVD\" value=\"\" />\n      <option name=\"CLEAR_LOGCAT\" value=\"true\" />\n      <option name=\"SHOW_LOGCAT_AUTOMATICALLY\" value=\"true\" />\n      <option name=\"SKIP_NOOP_APK_INSTALLATIONS\" value=\"true\" />\n      <option name=\"FORCE_STOP_RUNNING_APP\" value=\"true\" />\n      <option name=\"DEBUGGER_TYPE\" value=\"Java\" />\n      <option name=\"USE_LAST_SELECTED_DEVICE\" value=\"true\" />\n      <option name=\"PREFERRED_AVD\" value=\"\" />\n      <option name=\"SELECTED_CLOUD_MATRIX_CONFIGURATION_ID\" value=\"-1\" />\n      <option name=\"SELECTED_CLOUD_MATRIX_PROJECT_ID\" value=\"\" />\n      <Native>\n        <option name=\"WORKING_DIR\" value=\"\" />\n        <option name=\"TARGET_LOGGING_CHANNELS\" value=\"lldb process:gdb-remote packets\" />\n      </Native>\n      <Java />\n      <Hybrid>\n        <option name=\"WORKING_DIR\" value=\"\" />\n        <option name=\"TARGET_LOGGING_CHANNELS\" value=\"lldb process:gdb-remote packets\" />\n      </Hybrid>\n      <Profilers>\n        <option name=\"GAPID_DISABLE_PCS\" value=\"false\" />\n      </Profilers>\n      <option name=\"DEEP_LINK\" value=\"\" />\n      <option name=\"ACTIVITY_CLASS\" value=\"\" />\n      <method />\n    </configuration>\n    <list size=\"6\">\n      <item index=\"0\" class=\"java.lang.String\" itemvalue=\"Android Application.app\" />\n      <item index=\"1\" class=\"java.lang.String\" itemvalue=\"JUnit.ExampleUnitTest.fuckingXml\" />\n      <item index=\"2\" class=\"java.lang.String\" itemvalue=\"JUnit.ExampleUnitTest.wtfXmlSrsly\" />\n      <item index=\"3\" class=\"java.lang.String\" itemvalue=\"JUnit.ExampleUnitTest.testXml\" />\n      <item index=\"4\" class=\"java.lang.String\" itemvalue=\"JUnit.ExampleUnitTest.test\" />\n      <item index=\"5\" class=\"java.lang.String\" itemvalue=\"JUnit.ExampleUnitTest.TestXmlParser\" />\n    </list>\n    <recent_temporary>\n      <list size=\"5\">\n        <item index=\"0\" class=\"java.lang.String\" itemvalue=\"JUnit.ExampleUnitTest.TestXmlParser\" />\n        <item index=\"1\" class=\"java.lang.String\" itemvalue=\"JUnit.ExampleUnitTest.test\" />\n        <item index=\"2\" class=\"java.lang.String\" itemvalue=\"JUnit.ExampleUnitTest.wtfXmlSrsly\" />\n        <item index=\"3\" class=\"java.lang.String\" itemvalue=\"JUnit.ExampleUnitTest.testXml\" />\n        <item index=\"4\" class=\"java.lang.String\" itemvalue=\"JUnit.ExampleUnitTest.fuckingXml\" />\n      </list>\n    </recent_temporary>\n    <configuration name=\"&lt;template&gt;\" type=\"Applet\" default=\"true\" selected=\"false\">\n      <option name=\"MAIN_CLASS_NAME\" />\n      <option name=\"HTML_FILE_NAME\" />\n      <option name=\"HTML_USED\" value=\"false\" />\n      <option name=\"WIDTH\" value=\"400\" />\n      <option name=\"HEIGHT\" value=\"300\" />\n      <option name=\"POLICY_FILE\" value=\"$APPLICATION_HOME_DIR$/bin/appletviewer.policy\" />\n      <option name=\"VM_PARAMETERS\" />\n    </configuration>\n    <configuration name=\"&lt;template&gt;\" type=\"#org.jetbrains.idea.devkit.run.PluginConfigurationType\" default=\"true\" selected=\"false\">\n      <option name=\"VM_PARAMETERS\" value=\"-Xmx512m -Xms256m -XX:MaxPermSize=250m -ea\" />\n    </configuration>\n  </component>\n  <component name=\"ShelveChangesManager\" show_recycled=\"false\" />\n  <component name=\"SvnConfiguration\">\n    <configuration />\n  </component>\n  <component name=\"TaskManager\">\n    <task active=\"true\" id=\"Default\" summary=\"Default task\">\n      <changelist id=\"d62e88b6-443c-4675-8a14-b994ea4b677c\" name=\"Default\" comment=\"\" />\n      <created>1460706978530</created>\n      <option name=\"number\" value=\"Default\" />\n      <updated>1460706978530</updated>\n    </task>\n    <servers />\n  </component>\n  <component name=\"TestHistory\">\n    <history-entry file=\"ExampleUnitTest_TestXmlParser - 2016.05.02 at 22h 47m 19s.xml\">\n      <configuration name=\"ExampleUnitTest.TestXmlParser\" configurationId=\"JUnit\" />\n    </history-entry>\n    <history-entry file=\"ExampleUnitTest_TestXmlParser - 2016.05.02 at 22h 49m 21s.xml\">\n      <configuration name=\"ExampleUnitTest.TestXmlParser\" configurationId=\"JUnit\" />\n    </history-entry>\n    <history-entry file=\"ExampleUnitTest_TestXmlParser - 2016.05.02 at 22h 49m 27s.xml\">\n      <configuration name=\"ExampleUnitTest.TestXmlParser\" configurationId=\"JUnit\" />\n    </history-entry>\n    <history-entry file=\"ExampleUnitTest_TestXmlParser - 2016.05.02 at 22h 49m 42s.xml\">\n      <configuration name=\"ExampleUnitTest.TestXmlParser\" configurationId=\"JUnit\" />\n    </history-entry>\n    <history-entry file=\"ExampleUnitTest_TestXmlParser - 2016.05.02 at 22h 49m 59s.xml\">\n      <configuration name=\"ExampleUnitTest.TestXmlParser\" configurationId=\"JUnit\" />\n    </history-entry>\n    <history-entry file=\"ExampleUnitTest_TestXmlParser - 2016.05.02 at 22h 50m 45s.xml\">\n      <configuration name=\"ExampleUnitTest.TestXmlParser\" configurationId=\"JUnit\" />\n    </history-entry>\n    <history-entry file=\"ExampleUnitTest_TestXmlParser - 2016.05.02 at 22h 51m 05s.xml\">\n      <configuration name=\"ExampleUnitTest.TestXmlParser\" configurationId=\"JUnit\" />\n    </history-entry>\n    <history-entry file=\"ExampleUnitTest_TestXmlParser - 2016.05.03 at 20h 40m 34s.xml\">\n      <configuration name=\"ExampleUnitTest.TestXmlParser\" configurationId=\"JUnit\" />\n    </history-entry>\n    <history-entry file=\"ExampleUnitTest_wtfXmlSrsly - 2016.04.28 at 00h 40m 23s.xml\">\n      <configuration name=\"ExampleUnitTest.wtfXmlSrsly\" configurationId=\"JUnit\" />\n    </history-entry>\n    <history-entry file=\"ExampleUnitTest_wtfXmlSrsly - 2016.04.28 at 02h 51m 19s.xml\">\n      <configuration name=\"ExampleUnitTest.wtfXmlSrsly\" configurationId=\"JUnit\" />\n    </history-entry>\n  </component>\n  <component name=\"TodoView\">\n    <todo-panel id=\"selected-file\">\n      <is-autoscroll-to-source value=\"true\" />\n    </todo-panel>\n    <todo-panel id=\"all\">\n      <are-packages-shown value=\"true\" />\n      <is-autoscroll-to-source value=\"true\" />\n    </todo-panel>\n  </component>\n  <component name=\"ToolWindowManager\">\n    <frame x=\"-7\" y=\"30\" width=\"1934\" height=\"2137\" extended-state=\"0\" />\n    <editor active=\"false\" />\n    <layout>\n      <window_info id=\"TODO\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.3279434\" sideWeight=\"0.5\" order=\"6\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Build Variants\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"3\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Palette&#9;\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"6\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Capture Analysis\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"9\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Event Log\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.3259222\" sideWeight=\"0.40715048\" order=\"7\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Android Monitor\" active=\"true\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"true\" show_stripe_button=\"true\" weight=\"0.3259222\" sideWeight=\"0.5928495\" order=\"8\" side_tool=\"false\" content_ui=\"tabs\" x=\"2273\" y=\"1272\" width=\"1540\" height=\"851\" />\n      <window_info id=\"Version Control\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.32963988\" sideWeight=\"0.5\" order=\"9\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Run\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.25214756\" sideWeight=\"0.49573106\" order=\"2\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Terminal\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.32906628\" sideWeight=\"0.5\" order=\"10\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Captures\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.2497332\" sideWeight=\"0.5\" order=\"2\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Capture Tool\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"4\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Gradle Console\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.2572006\" sideWeight=\"0.5037353\" order=\"11\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Designer\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"3\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Project\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"true\" show_stripe_button=\"true\" weight=\"0.16008538\" sideWeight=\"0.5\" order=\"0\" side_tool=\"false\" content_ui=\"combo\" />\n      <window_info id=\"Gradle\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.115910724\" sideWeight=\"0.5\" order=\"6\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Structure\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.2497332\" sideWeight=\"0.5\" order=\"1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Android Model\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.32977587\" sideWeight=\"0.5\" order=\"4\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Favorites\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"5\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Debug\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.36533603\" sideWeight=\"0.59851485\" order=\"3\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Cvs\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.25\" sideWeight=\"0.5\" order=\"4\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Message\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"0\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Commander\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.4\" sideWeight=\"0.5\" order=\"0\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Hierarchy\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.25\" sideWeight=\"0.5\" order=\"2\" side_tool=\"false\" content_ui=\"combo\" />\n      <window_info id=\"Ant Build\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.25\" sideWeight=\"0.5\" order=\"1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Messages\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.30570996\" sideWeight=\"0.48375612\" order=\"12\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Documentation\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"FLOATING\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"7\" side_tool=\"false\" content_ui=\"tabs\" x=\"184\" y=\"622\" width=\"2279\" height=\"1376\" />\n      <window_info id=\"Inspection\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.4\" sideWeight=\"0.5\" order=\"5\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Preview\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.19423692\" sideWeight=\"0.5\" order=\"5\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Coverage\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.32977587\" sideWeight=\"0.5\" order=\"8\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Find\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.26023245\" sideWeight=\"0.49844238\" order=\"1\" side_tool=\"false\" content_ui=\"tabs\" />\n    </layout>\n  </component>\n  <component name=\"Vcs.Log.UiProperties\">\n    <option name=\"RECENTLY_FILTERED_USER_GROUPS\">\n      <collection />\n    </option>\n    <option name=\"RECENTLY_FILTERED_BRANCH_GROUPS\">\n      <collection />\n    </option>\n  </component>\n  <component name=\"VcsContentAnnotationSettings\">\n    <option name=\"myLimit\" value=\"2678400000\" />\n  </component>\n  <component name=\"XDebuggerManager\">\n    <breakpoint-manager>\n      <breakpoints>\n        <line-breakpoint enabled=\"true\" suspend=\"ALL\" type=\"java-line\">\n          <url>file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Search/Searcher.java</url>\n          <line>46</line>\n          <properties />\n          <option name=\"timeStamp\" value=\"161\" />\n        </line-breakpoint>\n      </breakpoints>\n      <breakpoints-defaults>\n        <breakpoint suspend=\"ALL\" type=\"java-exception\" />\n        <breakpoint suspend=\"ALL\" type=\"java-line\" />\n      </breakpoints-defaults>\n      <breakpoints-dialog>\n        <breakpoints-dialog />\n      </breakpoints-dialog>\n      <default-breakpoints>\n        <breakpoint suspend=\"ALL\" type=\"java-exception\">\n          <condition expression=\"!(this instanceof java.lang.ClassNotFoundException)\" language=\"JAVA\" custom=\"\" />\n          <properties>\n            <option name=\"class-filters-enabled\" value=\"true\" />\n            <class-filters>\n              <class-filter pattern=\"ca.fuwafuwa.*\" />\n            </class-filters>\n          </properties>\n        </breakpoint>\n        <breakpoint suspend=\"ALL\" type=\"CidrExceptionBreakpoint\">\n          <properties />\n        </breakpoint>\n      </default-breakpoints>\n      <option name=\"time\" value=\"175\" />\n    </breakpoint-manager>\n    <watches-manager>\n      <configuration name=\"app\">\n        <watch expression=\"eventType\" language=\"JAVA\" custom=\"\" />\n        <watch expression=\"parser.getText()\" language=\"JAVA\" custom=\"\" />\n        <watch expression=\"parser.getName()\" language=\"JAVA\" custom=\"\" />\n        <watch expression=\"parser.getEventType()\" language=\"JAVA\" custom=\"\" />\n        <watch expression=\"parser.getLineNumber()\" language=\"JAVA\" custom=\"\" />\n        <watch expression=\"attrMap\" language=\"JAVA\" custom=\"\" />\n        <watch expression=\"parser.getAttributeCount()\" language=\"JAVA\" custom=\"\" />\n      </configuration>\n      <configuration name=\"Remote\">\n        <watch expression=\"eventType\" language=\"JAVA\" custom=\"\" />\n        <watch expression=\"parser.getText()\" language=\"JAVA\" custom=\"\" />\n        <watch expression=\"parser.getName()\" language=\"JAVA\" custom=\"\" />\n        <watch expression=\"parser.getEventType()\" language=\"JAVA\" custom=\"\" />\n      </configuration>\n      <configuration name=\"JUnit\">\n        <watch expression=\"eventType\" language=\"JAVA\" custom=\"\" />\n        <watch expression=\"parser.getText()\" language=\"JAVA\" custom=\"\" />\n        <watch expression=\"parser.getName()\" language=\"JAVA\" custom=\"\" />\n        <watch expression=\"parser.getEventType()\" language=\"JAVA\" custom=\"\" />\n      </configuration>\n    </watches-manager>\n  </component>\n  <component name=\"editorHistoryManager\">\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/ReadingIrregularity.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"39\" column=\"50\" selection-start-line=\"39\" selection-start-column=\"50\" selection-end-line=\"39\" selection-end-column=\"50\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningMisc.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"39\" column=\"47\" selection-start-line=\"39\" selection-start-column=\"47\" selection-end-line=\"39\" selection-end-column=\"47\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningLoanSource.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"75\" column=\"45\" selection-start-line=\"75\" selection-start-column=\"45\" selection-end-line=\"75\" selection-end-column=\"45\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/res/layout/window.xml\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"0\" column=\"0\" selection-start-line=\"0\" selection-start-column=\"0\" selection-end-line=\"0\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n      <provider editor-type-id=\"android-designer\">\n        <state />\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/res/values/colors.xml\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"-5.230769\">\n          <caret line=\"8\" column=\"34\" selection-start-line=\"8\" selection-start-column=\"17\" selection-end-line=\"8\" selection-end-column=\"34\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/res/drawable/border_translucent.xml\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"0\" column=\"0\" selection-start-line=\"0\" selection-start-column=\"0\" selection-end-line=\"0\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/res/drawable/border_transparent.xml\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"0\" column=\"0\" selection-start-line=\"0\" selection-start-column=\"0\" selection-end-line=\"0\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/res/drawable/shape_white.xml\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"-12.423077\">\n          <caret line=\"19\" column=\"13\" selection-start-line=\"19\" selection-start-column=\"13\" selection-end-line=\"19\" selection-end-column=\"13\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/res/drawable-nodpi/border_pattern.png\">\n      <provider selected=\"true\" editor-type-id=\"images\">\n        <state />\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/res/drawable-nodpi/border9patch_transparent.9.png\">\n      <provider editor-type-id=\"images\">\n        <state />\n      </provider>\n      <provider selected=\"true\" editor-type-id=\"ninepatcheditor\">\n        <state />\n      </provider>\n    </entry>\n    <entry file=\"jar://$PROJECT_DIR$/../../AndroidSDK/platforms/android-23/android.jar!/android/widget/TextView.class\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"-8.518518\">\n          <caret line=\"602\" column=\"22\" selection-start-line=\"602\" selection-start-column=\"22\" selection-end-line=\"602\" selection-end-column=\"22\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"jar://$PROJECT_DIR$/../../AndroidSDK/platforms/android-23/android.jar!/java/lang/String.class\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"13\" column=\"19\" selection-start-line=\"13\" selection-start-column=\"19\" selection-end-line=\"13\" selection-end-column=\"19\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/res/values/styles.xml\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"7\" column=\"61\" selection-start-line=\"7\" selection-start-column=\"61\" selection-end-line=\"7\" selection-end-column=\"61\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/OcrResult.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"5\" column=\"13\" selection-start-line=\"5\" selection-start-column=\"13\" selection-end-line=\"5\" selection-end-column=\"13\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/res/layout/info_window.xml\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"-16.381819\">\n          <caret line=\"53\" column=\"33\" selection-start-line=\"53\" selection-start-column=\"33\" selection-end-line=\"53\" selection-end-column=\"33\" />\n        </state>\n      </provider>\n      <provider editor-type-id=\"android-designer\">\n        <state />\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/LinearLayoutView.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"10\" column=\"24\" selection-start-line=\"10\" selection-start-column=\"24\" selection-end-line=\"10\" selection-end-column=\"24\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/KanjiCharacterView.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"28\" column=\"32\" selection-start-line=\"28\" selection-start-column=\"32\" selection-end-line=\"28\" selection-end-column=\"32\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Interfaces/Stoppable.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"6\" column=\"17\" selection-start-line=\"6\" selection-start-column=\"17\" selection-end-line=\"6\" selection-end-column=\"17\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/Interfaces/WindowListener.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"7\" column=\"17\" selection-start-line=\"7\" selection-start-column=\"17\" selection-end-line=\"7\" selection-end-column=\"17\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/Interfaces/KanjiViewListener.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"9\" column=\"17\" selection-start-line=\"9\" selection-start-column=\"17\" selection-end-line=\"9\" selection-end-column=\"17\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/MainServiceHandler.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"28\" column=\"25\" selection-start-line=\"28\" selection-start-column=\"25\" selection-end-line=\"28\" selection-end-column=\"25\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningReadingRestriction.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"39\" column=\"75\" selection-start-line=\"39\" selection-start-column=\"75\" selection-end-line=\"39\" selection-end-column=\"75\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/ReadingRestriction.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"9\" column=\"13\" selection-start-line=\"9\" selection-start-column=\"13\" selection-end-line=\"9\" selection-end-column=\"13\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/ReadingPriority.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"39\" column=\"69\" selection-start-line=\"39\" selection-start-column=\"69\" selection-end-line=\"39\" selection-end-column=\"69\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningField.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"39\" column=\"16\" selection-start-line=\"39\" selection-start-column=\"16\" selection-end-line=\"39\" selection-end-column=\"52\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/DatabaseHelper.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"70\" column=\"51\" selection-start-line=\"70\" selection-start-column=\"51\" selection-end-line=\"70\" selection-end-column=\"51\" />\n          <folding />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/KanjiIrregularity.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"39\" column=\"16\" selection-start-line=\"39\" selection-start-column=\"16\" selection-end-line=\"39\" selection-end-column=\"76\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/KanjiPriority.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"39\" column=\"16\" selection-start-line=\"39\" selection-start-column=\"16\" selection-end-line=\"39\" selection-end-column=\"68\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningAdditionalInfo.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"39\" column=\"67\" selection-start-line=\"39\" selection-start-column=\"67\" selection-end-line=\"39\" selection-end-column=\"67\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningAntonym.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"39\" column=\"53\" selection-start-line=\"39\" selection-start-column=\"53\" selection-end-line=\"39\" selection-end-column=\"53\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningCrossReference.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"39\" column=\"67\" selection-start-line=\"39\" selection-start-column=\"67\" selection-end-line=\"39\" selection-end-column=\"67\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"jar://$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/19.0/91a4d115400e904f22b03a78deb355e9ea803cd4/guava-19.0-sources.jar!/com/google/common/base/Joiner.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"185\" column=\"12\" selection-start-line=\"185\" selection-start-column=\"12\" selection-end-line=\"185\" selection-end-column=\"12\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/build.gradle\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"25\" column=\"42\" selection-start-line=\"25\" selection-start-column=\"42\" selection-end-line=\"25\" selection-end-column=\"42\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/build.gradle\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"16\" column=\"18\" selection-start-line=\"16\" selection-start-column=\"18\" selection-end-line=\"16\" selection-end-column=\"18\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/KakuTools.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"30\" column=\"9\" selection-start-line=\"30\" selection-start-column=\"9\" selection-end-line=\"30\" selection-end-column=\"9\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/TypingWindow.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"7\" column=\"13\" selection-start-line=\"7\" selection-start-column=\"13\" selection-end-line=\"7\" selection-end-column=\"13\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/MeaningGloss.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"9\" column=\"13\" selection-start-line=\"9\" selection-start-column=\"13\" selection-end-line=\"9\" selection-end-column=\"13\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/Meaning.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"67\" column=\"16\" selection-start-line=\"67\" selection-start-column=\"16\" selection-end-line=\"67\" selection-end-column=\"95\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/Kanji.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"60\" column=\"69\" selection-start-line=\"60\" selection-start-column=\"69\" selection-end-line=\"60\" selection-end-column=\"69\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Database/Models/Entry.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"69\" column=\"16\" selection-start-line=\"69\" selection-start-column=\"16\" selection-end-line=\"69\" selection-end-column=\"16\" />\n          <folding>\n            <element signature=\"imports\" expanded=\"true\" />\n          </folding>\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Search/Searcher.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"46\" column=\"0\" selection-start-line=\"46\" selection-start-column=\"0\" selection-end-line=\"46\" selection-end-column=\"0\" />\n          <folding>\n            <element signature=\"imports\" expanded=\"true\" />\n          </folding>\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDTO/JmGloss.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"42\" column=\"18\" selection-start-line=\"42\" selection-start-column=\"18\" selection-end-line=\"42\" selection-end-column=\"18\" />\n          <folding />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/MainActivity.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"7\" column=\"13\" selection-start-line=\"7\" selection-start-column=\"13\" selection-end-line=\"7\" selection-end-column=\"13\" />\n          <folding />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/MainService.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"143\" column=\"41\" selection-start-line=\"143\" selection-start-column=\"41\" selection-end-line=\"143\" selection-end-column=\"41\" />\n          <folding />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/Window.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"36\" column=\"0\" selection-start-line=\"36\" selection-start-column=\"0\" selection-end-line=\"36\" selection-end-column=\"0\" />\n          <folding />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/TesseractThread.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"40\" column=\"0\" selection-start-line=\"40\" selection-start-column=\"0\" selection-end-line=\"40\" selection-end-column=\"0\" />\n          <folding />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/CommonParser.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"32\" column=\"50\" selection-start-line=\"32\" selection-start-column=\"50\" selection-end-line=\"32\" selection-end-column=\"50\" />\n          <folding />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/XmlParsers/JmDictThread.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"130\" column=\"0\" selection-start-line=\"130\" selection-start-column=\"0\" selection-end-line=\"130\" selection-end-column=\"0\" />\n          <folding />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/CaptureWindow.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.6378254\">\n          <caret line=\"60\" column=\"18\" selection-start-line=\"60\" selection-start-column=\"18\" selection-end-line=\"60\" selection-end-column=\"18\" />\n          <folding />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/InformationWindow.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.619403\">\n          <caret line=\"163\" column=\"0\" selection-start-line=\"163\" selection-start-column=\"0\" selection-end-line=\"163\" selection-end-column=\"0\" />\n          <folding>\n            <element signature=\"imports\" expanded=\"true\" />\n            <element signature=\"method#onKanjiViewScroll#0;class#InformationWindow#0\" expanded=\"false\" />\n            <element signature=\"method#getDefaultParams#0;class#InformationWindow#0\" expanded=\"false\" />\n            <element signature=\"method#stop#0;class#InformationWindow#0\" expanded=\"false\" />\n            <element signature=\"method#onDown#0;class#InformationWindow#0\" expanded=\"false\" />\n            <element signature=\"method#onShowPress#0;class#InformationWindow#0\" expanded=\"false\" />\n            <element signature=\"method#onSingleTapUp#0;class#InformationWindow#0\" expanded=\"false\" />\n            <element signature=\"method#onScroll#0;class#InformationWindow#0\" expanded=\"false\" />\n            <element signature=\"method#onLongPress#0;class#InformationWindow#0\" expanded=\"false\" />\n            <element signature=\"method#onFling#0;class#InformationWindow#0\" expanded=\"false\" />\n          </folding>\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/app/src/main/java/ca/fuwafuwa/kaku/Windows/Views/KanjiGridView.java\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state vertical-scroll-proportion=\"0.0\">\n          <caret line=\"19\" column=\"0\" selection-start-line=\"19\" selection-start-column=\"0\" selection-end-line=\"19\" selection-end-column=\"0\" />\n          <folding>\n            <element signature=\"method#onMeasure#0;class#KanjiGridView#0\" expanded=\"false\" />\n            <element signature=\"method#onLayout#0;class#KanjiGridView#0\" expanded=\"false\" />\n          </folding>\n        </state>\n      </provider>\n    </entry>\n  </component>\n</project>"
  },
  {
    "path": "settings.gradle",
    "content": "include ':app'\n"
  }
]