├── .github ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── moderator-submission.yml │ ├── module-takedown.yml │ └── module-submission.yml └── workflows │ ├── submission-checker.yml │ ├── submission-labels.yml │ └── collaborator-check.yml └── README.md /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/moderator-submission.yml: -------------------------------------------------------------------------------- 1 | name: Moderator Submission 2 | description: Preferred moderator proposal template 3 | title: "[Moderator] " 4 | labels: ["moderator"] 5 | body: 6 | - type: input 7 | id: mod-name 8 | attributes: 9 | label: Name 10 | placeholder: John Doe 11 | validations: 12 | required: true 13 | - type: textarea 14 | id: mod-projects 15 | attributes: 16 | label: Projects 17 | placeholder: | 18 | * Big project #1 19 | * Big project #2 20 | * Etc... 21 | validations: 22 | required: true 23 | - type: textarea 24 | id: mod-extra-info 25 | attributes: 26 | label: Extra Info (optional) 27 | placeholder: | 28 | * I love ABC 29 | * I have XYZ 30 | validations: 31 | required: false -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/module-takedown.yml: -------------------------------------------------------------------------------- 1 | name: Module Takedown Request 2 | description: Preferred Magisk Module takedown request template 3 | title: "[Takedown] " 4 | labels: ["takedown"] 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | ## Only accepted when 10 | - The module doesn't follow Magisk module format after approval 11 | - The module is not well maintained after approval 12 | 13 | - type: input 14 | id: module-id 15 | attributes: 16 | label: ID 17 | placeholder: example_module 18 | validations: 19 | required: true 20 | - type: input 21 | id: module-name 22 | attributes: 23 | label: Name 24 | placeholder: Example Module 25 | validations: 26 | required: true 27 | - type: input 28 | id: module-link 29 | attributes: 30 | label: Module repository link 31 | placeholder: https://www.github.com/username/repo 32 | validations: 33 | required: true 34 | - type: textarea 35 | id: mod-takedown-reas 36 | attributes: 37 | label: Takedown Request Reason 38 | placeholder: | 39 | Detailed reasoning 40 | validations: 41 | required: true 42 | -------------------------------------------------------------------------------- /.github/workflows/submission-checker.yml: -------------------------------------------------------------------------------- 1 | name: Submission Checker 2 | on: 3 | issues: 4 | types: [opened] 5 | 6 | jobs: 7 | submission-check: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Validate issue title 11 | id: validate-title 12 | run: | 13 | if [[ ! "${{ github.event.issue.title }}" =~ ^\[([mM]odule|[tT]akedown)\][[:space:]]*([a-zA-Z][a-zA-Z0-9._-]+)$ ]]; then 14 | echo "valid=false" >> $GITHUB_ENV 15 | else 16 | echo "valid=true" >> $GITHUB_ENV 17 | fi 18 | 19 | - name: Create comment for invalid title 20 | if: env.valid == 'false' 21 | uses: actions-cool/issues-helper@v3 22 | with: 23 | actions: 'create-comment' 24 | token: ${{ secrets.GITHUB_TOKEN }} 25 | issue-number: ${{ github.event.issue.number }} 26 | body: | 27 | Hey @${{ github.event.issue.user.login }}, 28 | 29 | your module submission is invalid. A valid submission title must match the pattern `^\[[mM]odule\][[:space:]]*([a-zA-Z][a-zA-Z0-9._-]+)$` (e.g., `[Module] my-module`), otherwise your module can't added. 30 | Please update your submission title and try again. 31 | 32 | *Best regards, 33 | The MMAR Team* 34 | 35 | - name: Set invalid label 36 | if: env.valid == 'false' 37 | uses: actions-cool/issues-helper@v3 38 | with: 39 | actions: 'set-labels' 40 | token: ${{ secrets.GITHUB_TOKEN }} 41 | issue-number: ${{ github.event.issue.number }} 42 | labels: 'invalid' 43 | 44 | - name: Close invalid submission 45 | if: env.valid == 'false' 46 | uses: actions-cool/issues-helper@v3 47 | with: 48 | actions: 'close-issue' 49 | close-reason: not_planned 50 | token: ${{ secrets.GITHUB_TOKEN }} 51 | issue-number: ${{ github.event.issue.number }} 52 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/module-submission.yml: -------------------------------------------------------------------------------- 1 | name: Module Submission 2 | description: Preferred Magisk Module submission template 3 | title: '[Module] module_id' 4 | labels: module 5 | body: 6 | - type: markdown 7 | attributes: 8 | value: | 9 | ## Please read 10 | 11 | You should read our [General Guidelines](https://github.com/Magisk-Modules-Alt-Repo/submission#general-guidelines) and [Source Code Guidelines](https://github.com/Magisk-Modules-Alt-Repo/submission#source-code-guidelines) before you submit your module 12 | 13 | > If your module includes non-free dependencies or something else, please check [Anti-Features](https://github.com/Magisk-Modules-Alt-Repo/submission#anti-features) before you submit your module 14 | 15 | **Quick guidelines:** 16 | - ID must match the id in module.prop 17 | - Title must include the module id — like `[Module] example_module`. The bot will reject the module when not 18 | - Once approved, your module will be added to our repo as https://github.com/Magisk-Modules-Alt-Repo/example_module 19 | 20 | - type: input 21 | id: module-id 22 | attributes: 23 | label: ID 24 | placeholder: example_module 25 | validations: 26 | required: true 27 | - type: input 28 | id: module-name 29 | attributes: 30 | label: Name 31 | placeholder: Example Module 32 | validations: 33 | required: true 34 | - type: textarea 35 | id: module-description 36 | attributes: 37 | label: Description 38 | placeholder: A simple module that does this, that, and the other thing. 39 | validations: 40 | required: true 41 | - type: input 42 | id: module-link 43 | attributes: 44 | label: Module repository link 45 | placeholder: https://www.github.com/username/repo 46 | validations: 47 | required: true 48 | - type: input 49 | id: module-source-code 50 | attributes: 51 | label: Source code link (for compiled binaries/APKs) 52 | placeholder: https://www.github.com/username/repo 53 | - type: dropdown 54 | id: antifeatures 55 | attributes: 56 | label: Anti-Features 57 | description: Only apply if your module has one of these 58 | multiple: true 59 | options: 60 | - Advertising (Ads) 61 | - Known Vulnerability (KnownVuln) 62 | - NSFW (NSFW) 63 | - No Source Since (NoSourceSince) 64 | - Non-Free Addons (NonFreeAdd) 65 | - Non-Free Assets (NonFreeAssets) 66 | - Non-Free Dependencies (NonFreeDep) 67 | - NonFreeNet (NonFreeNet) 68 | - Tracking (Tracking) 69 | - Upstream Non-Free(UpstreamNonFree) 70 | - Obfuscation (Obfuscation) 71 | - Unasked removal (UnaskedRemoval) 72 | - Large Language Model (LLM) 73 | -------------------------------------------------------------------------------- /.github/workflows/submission-labels.yml: -------------------------------------------------------------------------------- 1 | name: Submission Comment Bot 2 | 3 | on: 4 | issues: 5 | types: [labeled] 6 | 7 | jobs: 8 | deadlines: 9 | if: "${{ contains(github.event.label.name, 'deadline: 2 weeks') }}" 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Create comment 13 | uses: actions-cool/issues-helper@v3 14 | with: 15 | actions: 'create-comment' 16 | token: ${{ secrets.GITHUB_TOKEN }} 17 | issue-number: ${{ github.event.issue.number }} 18 | body: | 19 | Hey @${{ github.event.issue.user.login }}, 20 | 21 | your module submission was labeled with a deadline of **two weeks**. 22 | If you don't respond within that period, your module will be rejected. 23 | 24 | *Best regards, 25 | The MMAR Team* 26 | 27 | spam: 28 | if: ${{ contains(github.event.label.name, 'spam') }} 29 | runs-on: ubuntu-latest 30 | steps: 31 | - name: Set labels 32 | uses: actions-cool/issues-helper@v3 33 | with: 34 | actions: 'set-labels' 35 | token: ${{ secrets.GITHUB_TOKEN }} 36 | issue-number: ${{ github.event.issue.number }} 37 | labels: 'spam' 38 | 39 | - name: Create comment 40 | uses: actions-cool/issues-helper@v3 41 | with: 42 | actions: 'create-comment' 43 | token: ${{ secrets.GITHUB_TOKEN }} 44 | issue-number: ${{ github.event.issue.number }} 45 | body: | 46 | Hey @${{ github.event.issue.user.login }}, 47 | 48 | your submission was closed due to being considered spam. 49 | 50 | *Best regards, 51 | The MMAR Team* 52 | 53 | - name: Close issue 54 | uses: actions-cool/issues-helper@v3 55 | with: 56 | actions: 'close-issue' 57 | close-reason: not_planned 58 | token: ${{ secrets.GITHUB_TOKEN }} 59 | issue-number: ${{ github.event.issue.number }} 60 | 61 | approved: 62 | if: ${{ startsWith(github.event.issue.title, '[Module]') && contains(github.event.label.name, 'approved') }} 63 | runs-on: ubuntu-latest 64 | steps: 65 | - name: Add labels 66 | uses: actions-cool/issues-helper@v3 67 | with: 68 | actions: 'add-labels' 69 | token: ${{ secrets.GITHUB_TOKEN }} 70 | issue-number: ${{ github.event.issue.number }} 71 | labels: "approved" 72 | 73 | - name: Format Module ID 74 | id: app_mod_name 75 | run: | 76 | echo "MODULE_ID=$SUB_TITLE" | sed 's/\(MODULE_ID=\)\[Module\] */\1/' >> $GITHUB_OUTPUT 77 | env: 78 | SUB_TITLE: ${{ github.event.issue.title }} 79 | 80 | - name: Create comment 81 | uses: actions-cool/issues-helper@v3 82 | with: 83 | actions: 'create-comment' 84 | token: ${{ secrets.GITHUB_TOKEN }} 85 | issue-number: ${{ github.event.issue.number }} 86 | body: | 87 | Hey @${{ github.event.issue.user.login }}, 88 | 89 | your module submission has been approved! 90 | The module will likely be available at https://github.com/${{ github.repository_owner }}/${{ steps.app_mod_name.outputs.MODULE_ID }}. 91 | 92 | Check your e-mail inbox for an invite to your new repository and remember to 'Watch' your repository on Github to have new issues in it show up in your feed. 93 | 94 | Make sure to change your local repository's push URLs or configure 2 parallel push URLs. 95 | 96 | *Best regards, 97 | The MMAR Team* 98 | 99 | - name: Close issue 100 | uses: actions-cool/issues-helper@v3 101 | with: 102 | actions: 'close-issue' 103 | token: ${{ secrets.GITHUB_TOKEN }} 104 | close-reason: completed 105 | issue-number: ${{ github.event.issue.number }} 106 | 107 | rejected: 108 | if: ${{ contains(github.event.label.name, 'rejected') }} 109 | runs-on: ubuntu-latest 110 | steps: 111 | - name: Add labels 112 | uses: actions-cool/issues-helper@v3 113 | with: 114 | actions: 'add-labels' 115 | token: ${{ secrets.GITHUB_TOKEN }} 116 | issue-number: ${{ github.event.issue.number }} 117 | labels: "rejected" 118 | 119 | - name: Close issue 120 | uses: actions-cool/issues-helper@v3 121 | with: 122 | actions: 'close-issue' 123 | token: ${{ secrets.GITHUB_TOKEN }} 124 | close-reason: not_planned 125 | issue-number: ${{ github.event.issue.number }} 126 | -------------------------------------------------------------------------------- /.github/workflows/collaborator-check.yml: -------------------------------------------------------------------------------- 1 | name: Collaborator Check 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | check: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: actions/github-script@v7 11 | with: 12 | script: | 13 | const ORGANIZATION = "Magisk-Modules-Alt-Repo"; 14 | const EXCLUDED_USERS = ["Atrate", "DerGoogler", "Fox2Code", "HuskyDG", "tytydraco"]; 15 | const EXCLUDED_REPOS = ["HuskyDG_BootloopSaver", "vintf-bypass", "mkshrc", "node", "xhhttp"]; 16 | const EXCLUDED_TOPIC_KEYWORD = "non-module"; 17 | 18 | async function fetchAllRepositories(org) { 19 | const repos = []; 20 | let page = 1; 21 | 22 | while (true) { 23 | const { data } = await github.rest.repos.listForOrg({ 24 | org, 25 | type: "all", 26 | per_page: 100, 27 | page, 28 | }); 29 | 30 | if (data.length === 0) break; 31 | 32 | repos.push(...data); 33 | page++; 34 | } 35 | 36 | return repos; 37 | } 38 | 39 | async function fetchRepositoryTopics(org, repo) { 40 | try { 41 | const { data } = await github.rest.repos.getAllTopics({ 42 | owner: org, 43 | repo, 44 | }); 45 | return data.names || []; 46 | } catch (error) { 47 | console.error(`Error fetching topics for ${repo}: ${error.message}`); 48 | return []; 49 | } 50 | } 51 | 52 | async function fetchCollaborators(org, repo) { 53 | try { 54 | const { data } = await github.rest.repos.listCollaborators({ 55 | owner: org, 56 | repo, 57 | affiliation: "all", 58 | }); 59 | 60 | return data.map(user => user.login); 61 | } catch (error) { 62 | if (error.status === 404) { 63 | console.error(`Repository "${repo}" is not accessible.`); 64 | return []; 65 | } 66 | console.error(`Error fetching collaborators for ${repo}: ${error.message}`); 67 | return []; 68 | } 69 | } 70 | 71 | async function processRepositories(org) { 72 | const allRepos = await fetchAllRepositories(org); 73 | 74 | if (allRepos.length === 0) { 75 | console.log(`No repositories found for organization "${org}".`); 76 | return; 77 | } 78 | 79 | console.log(`Found ${allRepos.length} repositories. Filtering excluded repositories...`); 80 | 81 | const filteredRepos = []; 82 | for (const repo of allRepos) { 83 | const { name } = repo; 84 | 85 | if (EXCLUDED_REPOS.includes(name)) { 86 | console.log(`Excluding repository "${name}" (explicit exclusion).`); 87 | continue; 88 | } 89 | 90 | const topics = await fetchRepositoryTopics(org, name); 91 | if (topics.includes(EXCLUDED_TOPIC_KEYWORD)) { 92 | console.log(`Excluding repository "${name}" (topic "${EXCLUDED_TOPIC_KEYWORD}" found).`); 93 | continue; 94 | } 95 | 96 | filteredRepos.push(name); 97 | } 98 | 99 | if (filteredRepos.length === 0) { 100 | console.log(`No repositories to process after exclusions.`); 101 | return; 102 | } 103 | 104 | console.log(`Processing ${filteredRepos.length} repositories after exclusions...`); 105 | 106 | let unmaintainedCount = 0; 107 | 108 | for (const repo of filteredRepos) { 109 | const collaborators = await fetchCollaborators(org, repo); 110 | const filteredCollaborators = collaborators.filter(user => !EXCLUDED_USERS.includes(user)); 111 | 112 | if (filteredCollaborators.length > 0) { 113 | console.log(`Collaborators for repository "${repo}":`); 114 | filteredCollaborators.forEach(user => console.log(`- ${user}`)); 115 | } else { 116 | console.log(`No collaborators found (after exclusions) for repository "${repo}".`); 117 | unmaintainedCount++; 118 | } 119 | } 120 | 121 | 122 | const totalRepos = filteredRepos.length; 123 | const unmaintainedPercentage = ((unmaintainedCount / totalRepos) * 100).toFixed(2); 124 | 125 | console.log(`\nSummary:`); 126 | console.log(`- Total repositories processed: ${totalRepos}`); 127 | console.log(`- Unmaintained repositories (no collaborators): ${unmaintainedCount}`); 128 | console.log(`- Percentage of unmaintained repositories: ${unmaintainedPercentage}%`); 129 | } 130 | 131 | processRepositories(ORGANIZATION); 132 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Magisk Modules Alternative Repository Submissions 2 | Just like the official Magisk Modules repository (which is now defunct), this is where you can submit your modules. 3 | 4 | Note: You can browse and install those modules via [MMRL](https://github.com/DerGoogler/MMRL) or the [Androidacy Module Manager](https://github.com/Androidacy/MagiskModuleManager), a continuation of the [Fox's Magisk Module Manager](https://github.com/Fox2Code/FoxMagiskModuleManager/releases) project. Alternatively you can use the [Telegram Channel](https://t.me/MagiskModulesAltRepo) to receive Magisk modules updates. 5 | 6 | # Module Submissions 7 | Create an [issue](https://github.com/Magisk-Modules-Alt-Repo/submission/issues) on this repository with `[Module] ` in the title and include the link to your repo in the content, then wait for a moderator to approve or deny your module. Once approved, a moderator will mirror your personal repo to the Alt-Repo and give you ownership of it. Afterwards, you should either: 8 | 9 | - Set up parallel remote push URLs with git; 10 | or 11 | - Configure automatic repo sync between your two repositories (push/pull); 12 | or 13 | - Archive your personal repo and work solely here. 14 | 15 | # Submission Guidelines 16 | We want to make sure that there are no dangerous modules on the Alt-Repo. Please abide by these guidelines. 17 | 18 | ## General Guidelines 19 | 20 | * Your module must be a valid Magisk/Zygisk module. See the [Developer Guide](https://topjohnwu.github.io/Magisk/guides.html) for more info. 21 | * Your module must have a README.md file in English with information about the module. 22 | * Device-specific modules **are allowed**. Make sure to mention that they are device-specific in the README. 23 | * "Trivial" modules **are allowed**. This includes simple boot scripts. 24 | * No malicious modules (deleting core files, breaking system intentionally, adware, spyware, or any kind of module harmful to the end user). 25 | * No broken modules (doesn't do what it says it will, or doesn't define correctly compatible devices). 26 | * Module ID must match repo name. In the event that this isn't the case, your new module repo's name will be the same as the module ID. 27 | * The issue author must be the owner of the module being submitted, or have permission from the owner. 28 | 29 | ## Source Code Guidelines 30 | 31 | * You **must provide the source code** for any executables or APK files included in your submission. If you absolutely need to compile your code, please provide reproducible build instructions. An exception can be made for modules that provide compiled packages/binaries from trusted sources such as recognized developers on the Play Store. In such a case, you **cannot modify** the provided APKs unless doing so does not infringe on the author's copyright and you **must provide the source code/APKtool configuration** for modifications performed, if any. 32 | * You **must not obfuscate** the source code of the scripts you provide or any binaries/packages provided unless you are providing a trusted third-party's binary/package where the source has been obfuscated by the third-party at the source. 33 | 34 | You can provide the source code in various ways, including, but not limited to: 35 | * On the project's Wiki page 36 | * As a separate repository 37 | * On a separate, empty branch 38 | * Directly in the main branch, with instructions in `customize.sh` that delete it during installation 39 | 40 | ### Anti-Features 41 | 42 | The new `json-v2` format supports Anti-Features like F-Droid, this gives more transparency about the modules and helps the user if a module includes non-free dependencies etc. 43 | 44 |
Click here to see all supported Anti-Features 45 | 46 | | Name | ID | Description | 47 | | ------------------------- | ----------------- | -------------------------------------------------------------------------------------------- | 48 | | Ads | `Ads` | Advertising | 49 | | Tracking | `Tracking` | Tracks and/or reports your activity to somewhere, even when it can be turned off | 50 | | Non-Free Network Services | `NonFreeNet` | Promotes or depends entirely on a non-changeable or non-free network service | 51 | | Non-Free Addons | `NonFreeAdd` | Promotes other non-libre module or plugins | 52 | | Non-Free Dependencies | `NonFreeDep` | Needs a non-libre module to work (e.g. Google Maps, Market) | 53 | | NSFW | `NSFW` | Contains content that the user may not want to be publicized or visible everywhere | 54 | | Upstream Non-Free | `UpstreamNonFree` | Upstream source code is not libre, and this version has those parts replaced or rewritten | 55 | | Non-Free Assets | `NonFreeAssets` | Non-libre media in things that are not code (e.g. images, sound, music, 3D-models, or video) | 56 | | Known Vulnerability | `KnownVuln` | Known security vulnerability | 57 | | No Source Since | `NoSourceSince` | Source code no longer available, making new releases impossible | 58 | | Obfuscation | `Obfuscation` | Module includes obfuscated code | 59 | | Unasked removal | `UnaskedRemoval` | Module removes app, permissions and other modules without approval | 60 | 61 |
62 | 63 | We recommend that you publish your module under a license that explicitly permits redistribution of the software, such as the [GPLv3](https://www.gnu.org/licenses/gpl-howto.html) license. Any other FOSS license should work as well. Make sure the license is compatible with all code/binaries you provide — this is especially important if you provide a proprietary package with your module. 64 | 65 | ## Concluding remarks 66 | 67 | It is worth noting that the final approval decision comes from our moderators. If they do not see your module as being fit for the Alt-Repo, they have the choice to deny it. However, they are encouraged to stay unbaised when approving or rejecting modules. 68 | 69 | Failure to abide by the guidelines will be pointed out after moderator review. In cases of larger problems, you may be asked to re-submit the module after corrections in a new issue. Infractions on the "no malicious modules" guideline (or straight up distributing malware) will result in a permanent ban from submitting new modules as well as the removal of ones previously submitted by the offender. 70 | 71 | You should maintain your module for as long as possible and remove your repository if it stops working completely and you can't maintain it. We may perform changes without developer approval on any broken modules that are abandoned by their maintainers. This only includes simple fixes, heavily broken, unmaintained modules will simply be deleted. 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | # Disclaimer 90 | 91 | We do our best to check modules as they are submitted into MMAR for any 92 | malicious/broken functionality, but we cannot reasonably check every commit from 93 | the time the modules are accepted. As such we withhold any responsibility for 94 | bricked devices, unintended behavior, malware, or other problems arising from 95 | using modules submitted to MMAR. If you notice such a module, though, please let 96 | us know (see below). 97 | 98 | # Reporting modules 99 | 100 | If you notice a broken module or one containing malware, please create an issue 101 | here with the `Module Takedown Request` template. In case of matters requiring 102 | urgent attention, such as modules that brick devices or malware, please *also* 103 | ping us in the issue and send an e-mail message about that (see the `Contact` 104 | section below). 105 | 106 | # Permission Levels 107 | These are the different levels that users can be assigned when choosing to contribute to this project. 108 | 109 | * Collaborators are Magisk Module developers who must first make an issue and become approved. 110 | * Members are moderators, they can create their own repos without requesting them beforehand. 111 | * Owners are the admins, they have master control over the entire project. 112 | 113 | | | Admins | Moderators | Collaborators | 114 | |----------------- |-------- |--------- |--------------- | 115 | | Commit changes | ✔ | ✔ | ✔ | 116 | | Request repos | ✔ | ✔ | ✔ | 117 | | Create repos | ✔ | ✔ | ❌ | 118 | | Approve modules | ✔ | ✔ | ❌ | 119 | | Manage members | ✔ | ❌ | ❌ | 120 | | Remove repos | ✔ | ❌ | ❌ | 121 | | Remove others | ✔ | ❌ | ❌ | 122 | | Transfer repos | ✔ | ❌ | ❌ | 123 | 124 | If you are interested in becoming a collaborator, please make an issue on this repo to get started with a project of your own. If you think you are qualified to become a moderator, please create an issue with `[Moderator]` in the title. We currently only consider existing moderators for the admin position, so you may not make a request for it. 125 | 126 | # Contact 127 | If you need assistance, feel free to contact any of our Alt-Repo moderators through email or Telegram. If you need direct support, we are always available in a timely manner. 128 | 129 | **Atrate** 130 | 131 | * Email: Atrate[at]protonmail.com 132 | * XDA: Atrate 133 | 134 | **HuskyDG** 135 | 136 | * Telegram: https://t.me/HuskyDG 137 | * Email: deadboltsx303[at]gmail.com 138 | * XDA: huskydg 139 | 140 | **Der_Googler** 141 | 142 | * Telegram: https://t.me/Der_Googler 143 | * Email: jimmy[at]dergoogler.com 144 | * XDA: Der_Googler 145 | 146 | **Tytydraco** 147 | 148 | * Telegram: https://t.me/tytydraco 149 | * Email: tylernij[at]gmail.com 150 | * XDA: tytydraco 151 | --------------------------------------------------------------------------------