├── VERSION ├── Triggerfile ├── .gitignore ├── tests ├── hello.anus ├── utils.test.js ├── seeds.js ├── std.test.js └── script.anal ├── entrypoint.sh ├── .github ├── FUNDING.yml ├── PULL_REQUEST_TEMPLATE.md └── ISSUE_TEMPLATE │ ├── feature.md │ └── bug.md ├── assets ├── gifs │ └── usage.gif └── images │ ├── cover.png │ ├── logo.png │ ├── linktree.svg │ ├── kofi.svg │ └── github-sponsors.svg ├── docs ├── static │ └── img │ │ └── favicon.ico ├── babel.config.js ├── sidebars.js ├── tsconfig.json ├── docs │ ├── guides │ │ ├── _category_.json │ │ └── commands.md │ ├── getting-started │ │ ├── _category_.json │ │ ├── installation.md │ │ ├── running.md │ │ └── scripting.md │ └── intro.md ├── .gitignore ├── src │ └── css │ │ └── custom.css ├── package.json └── docusaurus.config.js ├── analscript.js ├── lib ├── regexp.js ├── constants.js ├── utils.js ├── dictionary.js ├── help.js └── std.js ├── Dockerfile ├── .prettierrc ├── .circleci └── config.yml ├── CONTRIBUTING.md ├── SECURITY.md ├── .eslintrc.json ├── README_DOCKER_HUB.md ├── cli.js ├── LICENSE ├── package.json ├── CHANGELOG.md ├── README.md └── CODE_OF_CONDUCT.md /VERSION: -------------------------------------------------------------------------------- 1 | 1.2.0 -------------------------------------------------------------------------------- /Triggerfile: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | coverage 2 | node_modules -------------------------------------------------------------------------------- /tests/hello.anus: -------------------------------------------------------------------------------- 1 | Hello, Analscript! -------------------------------------------------------------------------------- /entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | exec "$@" 4 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: [airscripts] 2 | ko_fi: airscript 3 | -------------------------------------------------------------------------------- /assets/gifs/usage.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airscripts/analscript/HEAD/assets/gifs/usage.gif -------------------------------------------------------------------------------- /assets/images/cover.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airscripts/analscript/HEAD/assets/images/cover.png -------------------------------------------------------------------------------- /assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airscripts/analscript/HEAD/assets/images/logo.png -------------------------------------------------------------------------------- /docs/static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/airscripts/analscript/HEAD/docs/static/img/favicon.ico -------------------------------------------------------------------------------- /docs/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /analscript.js: -------------------------------------------------------------------------------- 1 | import { anallify, stringify } from './lib/std.js'; 2 | 3 | export { anallify, stringify }; 4 | export default { anallify, stringify }; 5 | -------------------------------------------------------------------------------- /lib/regexp.js: -------------------------------------------------------------------------------- 1 | import { ANAL_CHARACTERS, GRAMMAR } from './constants.js'; 2 | 3 | export const matcher = new RegExp(`^[${GRAMMAR}]+$`, 'u'); 4 | export const sequence = new RegExp(`${ANAL_CHARACTERS}`, 'g'); 5 | -------------------------------------------------------------------------------- /docs/sidebars.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | /** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ 4 | const sidebars = { 5 | sidebar: [{ type: 'autogenerated', dirName: '.' }], 6 | }; 7 | 8 | module.exports = sidebars; 9 | -------------------------------------------------------------------------------- /docs/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | // This file is not used in compilation. It is here just for a nice editor experience. 3 | "extends": "@tsconfig/docusaurus/tsconfig.json", 4 | "compilerOptions": { 5 | "baseUrl": "." 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:18.17-alpine3.18 AS runner 2 | LABEL maintainer="Airscript " 3 | WORKDIR /tmp 4 | COPY entrypoint.sh . 5 | RUN npm install -g analscript 6 | ENTRYPOINT [ "./entrypoint.sh" ] 7 | CMD [ "/bin/sh" ] -------------------------------------------------------------------------------- /docs/docs/guides/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "position": 3, 3 | "label": "Guides", 4 | 5 | "link": { 6 | "type": "generated-index", 7 | "description": "Collection of various guides useful for your Analscript journey." 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /docs/docs/getting-started/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "position": 2, 3 | "label": "Getting Started", 4 | 5 | "link": { 6 | "type": "generated-index", 7 | "description": "Getting started in Analscript by writing and running our first program." 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /lib/constants.js: -------------------------------------------------------------------------------- 1 | export const RUN = 'run'; 2 | export const HELP = 'help'; 3 | export const COMPILE = 'compile'; 4 | export const ANALLIFY = 'anallify'; 5 | export const STRINGIFY = 'stringify'; 6 | export const ANAL_CHARACTERS = '🍑🍆'; 7 | export const GRAMMAR = `${ANAL_CHARACTERS} `; 8 | -------------------------------------------------------------------------------- /lib/utils.js: -------------------------------------------------------------------------------- 1 | export function checker(input) { 2 | return typeof input === 'string'; 3 | } 4 | 5 | export function graceful(fn) { 6 | try { 7 | fn(); 8 | } catch (error) { 9 | process.stderr.write(`${error.message}\n`); 10 | process.exit(1); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "tabWidth": 2, 4 | "useTabs": false, 5 | "printWidth": 80, 6 | "endOfLine": "auto", 7 | "singleQuote": true, 8 | "trailingComma": "all", 9 | "bracketSpacing": true, 10 | "arrowParens": "always", 11 | "quoteProps": "consistent" 12 | } -------------------------------------------------------------------------------- /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | version: 2.1 2 | 3 | orbs: 4 | node: circleci/node@5.1.0 5 | 6 | workflows: 7 | testing: 8 | jobs: 9 | - node/test: 10 | version: '18.17' 11 | pkg-manager: npm 12 | run-command: test 13 | resource_class: small 14 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other method with the owners of this repository, ensuring you follow the [Code of Conduct](https://github.com/Airscripts/analscript/blob/main/CODE_OF_CONDUCT.md). 3 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | | Version | Supported | 5 | | ------- | ------------------ | 6 | | 1.1.x | :white_check_mark: | 7 | 8 | ## Reporting Vulnerability 9 | To report a vulnerability, open an [issue](https://github.com/airscripts/analscript/issues/new/choose). 10 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "es2021": true 5 | }, 6 | 7 | "extends": "airbnb-base", 8 | 9 | "parserOptions": { 10 | "ecmaVersion": "latest", 11 | "sourceType": "module" 12 | }, 13 | 14 | "rules": { 15 | "import/extensions": 0 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | /node_modules 3 | 4 | # Production 5 | /build 6 | 7 | # Generated files 8 | .docusaurus 9 | .cache-loader 10 | 11 | # Misc 12 | .DS_Store 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | -------------------------------------------------------------------------------- /lib/dictionary.js: -------------------------------------------------------------------------------- 1 | export const ERROR = { 2 | fileNotFound: 'File not found.', 3 | missingArgument: 'Missing argument.', 4 | notString: 'Only strings are accepted', 5 | notAcceptedByGrammar: 'There are some characters not accepted by grammar.', 6 | }; 7 | 8 | export const SUCCESS = { 9 | compileSuccess: 'Compilation completed successfully.', 10 | }; 11 | -------------------------------------------------------------------------------- /assets/images/linktree.svg: -------------------------------------------------------------------------------- 1 | Linktree -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | # Pull Request 2 | Compile all the information written below to send a legitimate pull request to the repository. 3 | 4 | ## Label: 5 | 6 | ### This PR is labeled as: 7 | *Choose only one and remember to select the label even on the right.* 8 | 9 | - [ ] Feature 10 | - [ ] Bug 11 | - [ ] Other 12 | 13 | ## Linked Issue 14 | 15 | ### This PR has the following linked issues: 16 | - Closes #; 17 | - ... 18 | 19 | ## Solution 20 | 21 | ### My solution is explained as follows: 22 | Write your solution here... 23 | -------------------------------------------------------------------------------- /docs/docs/getting-started/installation.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | # Installation 6 | In order to install this project, make sure to have installed on your machine `Node.js` and `npm`. 7 | After that you can simply install `analscript` from npm writing this command in your terminal: 8 | ```bash 9 | npm install -g analscript 10 | ``` 11 | 12 | ## Something Missing? 13 | If you find issues with the documentation or have suggestions on how to improve the documentation or the project in general, please file an issue for us on `GitHub`. 14 | -------------------------------------------------------------------------------- /docs/docs/getting-started/running.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 3 3 | --- 4 | 5 | # Running 6 | Now that you've survived in writing your first `analscript`, we can simply run it. 7 | It's as simple as running this command in your terminal: 8 | ```bash 9 | analscript run hello.anal 10 | ``` 11 | 12 | And this closes up our Getting Started section. 13 | Easy, right? 14 | 15 | ## Something Missing? 16 | If you find issues with the documentation or have suggestions on how to improve the documentation or the project in general, please file an issue for us on `GitHub`. 17 | -------------------------------------------------------------------------------- /docs/docs/intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | slug: / 4 | --- 5 | 6 | # Introduction 7 | Analscript will help you write modern anal-driven code without taking a sweat. 8 | Written in JavaScript by @airscripts, it's a remake of the original AnalLang today lost in the meadows of npm and GitHub. 9 | You can read more about it on our [esolangs.org page](https://esolangs.org/wiki/analscript). 10 | 11 | ## Something Missing? 12 | If you find issues with the documentation or have suggestions on how to improve the documentation or the project in general, please file an issue for us on GitHub. 13 | -------------------------------------------------------------------------------- /tests/utils.test.js: -------------------------------------------------------------------------------- 1 | import { describe, it, mock } from 'node:test'; 2 | import { deepEqual } from 'node:assert/strict'; 3 | import { graceful } from '../lib/utils.js'; 4 | import { EMPTY_STRING_INPUT } from './seeds.js'; 5 | 6 | describe('Graceful', () => { 7 | it('Execute graceful', () => { 8 | const fn = mock.fn(); 9 | graceful(fn); 10 | deepEqual(fn.mock.calls.length, 1); 11 | }); 12 | 13 | it('Trigger graceful exit', () => { 14 | const fn = mock.method(process, 'exit', () => {}); 15 | graceful(EMPTY_STRING_INPUT); 16 | deepEqual(fn.mock.calls.length, 1); 17 | }); 18 | }); 19 | -------------------------------------------------------------------------------- /README_DOCKER_HUB.md: -------------------------------------------------------------------------------- 1 | # Quick Reference 2 | - Maintained by: 3 | [Airscript](https://github.com/airscripts) 4 | 5 | - Where to get help: 6 | [GitHub Repository](https://github.com/airscripts/analscript/issues/) 7 | 8 | # Supported Tags 9 | Latest tag supported only. 10 | 11 | # About 12 | Analscript is a joke esoteric programming language made by Airscript. Its interpreter is written in Node.js, just as the other esoteric programming language from which takes inspiration from called AnalLang. 13 | 14 | # Licensing 15 | This repository is licensed under [MIT License](https://github.com/airscripts/analscript/blob/main/LICENSE). 16 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: feature 6 | assignees: airscripts 7 | --- 8 | 9 | **Is your feature request related to a problem? Please describe.** 10 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 11 | 12 | **Describe the solution you'd like** 13 | A clear and concise description of what you want to happen. 14 | 15 | **Describe alternatives you've considered** 16 | A clear and concise description of any alternative solutions or features you've considered. 17 | 18 | **Additional context** 19 | Add any other context or screenshots about the feature request here. 20 | -------------------------------------------------------------------------------- /assets/images/kofi.svg: -------------------------------------------------------------------------------- 1 | Ko-fi -------------------------------------------------------------------------------- /lib/help.js: -------------------------------------------------------------------------------- 1 | const version = 'Analscript, version 1.2.0'; 2 | const copyright = '\nCopyright (c) 2023 by Airscript\n'; 3 | 4 | const usage = ` 5 | Usage: 6 | analscript command [options] [arguments] 7 | `; 8 | 9 | const commands = ` 10 | Commands: 11 | run Run a .anal file 12 | compile Compile any file to .anal 13 | anallify Encode string to anal 14 | stringify Decode anal to string 15 | help Show this help 16 | `; 17 | 18 | const options = ` 19 | Options: 20 | Nothing to see here 21 | `; 22 | 23 | const args = ` 24 | Arguments: 25 | Nothing to see here 26 | `; 27 | 28 | const help = `${version} ${copyright} ${usage} ${commands} ${options} ${args}`; 29 | export default help; 30 | -------------------------------------------------------------------------------- /assets/images/github-sponsors.svg: -------------------------------------------------------------------------------- 1 | GitHub Sponsors -------------------------------------------------------------------------------- /cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import help from './lib/help.js'; 3 | import { graceful } from './lib/utils.js'; 4 | 5 | import { 6 | run, 7 | compile, 8 | anallify, 9 | stringify, 10 | } from './lib/std.js'; 11 | 12 | import { 13 | RUN, 14 | HELP, 15 | COMPILE, 16 | ANALLIFY, 17 | STRINGIFY, 18 | } from './lib/constants.js'; 19 | 20 | function cli() { 21 | let output = ''; 22 | const command = process.argv[2]; 23 | const args = process.argv.slice(3, process.argv.length).join(''); 24 | 25 | switch (command) { 26 | case COMPILE: compile(args); break; 27 | case RUN: output = run(args); break; 28 | case HELP: process.stdout.write(help); return; 29 | case ANALLIFY: output = anallify(args); break; 30 | case STRINGIFY: output = stringify(args); break; 31 | default: process.stdout.write(help); return; 32 | } 33 | 34 | process.stdout.write(`${output}\n`); 35 | } 36 | 37 | graceful(cli); 38 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: airscripts 7 | --- 8 | 9 | **Describe the bug** 10 | A clear and concise description of what the bug is. 11 | 12 | **To Reproduce** 13 | Steps to reproduce the behavior: 14 | 1. Go to '...' 15 | 2. Click on '....' 16 | 3. Scroll down to '....' 17 | 4. See error 18 | 19 | **Expected behavior** 20 | A clear and concise description of what you expected to happen. 21 | 22 | **Screenshots** 23 | If applicable, add screenshots to help explain your problem. 24 | 25 | **Desktop (please complete the following information):** 26 | - OS: [e.g. iOS] 27 | - Browser [e.g. chrome, safari] 28 | - Version [e.g. 22] 29 | 30 | **Smartphone (please complete the following information):** 31 | - Device: [e.g. iPhone6] 32 | - OS: [e.g. iOS8.1] 33 | - Browser [e.g. stock browser, safari] 34 | - Version [e.g. 22] 35 | 36 | **Additional context** 37 | Add any other context about the problem here. 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright © 2023 Airscript 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the “Software”), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /docs/src/css/custom.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Any CSS included here will be global. The classic template 3 | * bundles Infima by default. Infima is a CSS framework designed to 4 | * work well for content-centric websites. 5 | */ 6 | 7 | /* You can override the default Infima variables here. */ 8 | :root { 9 | --ifm-color-primary: #8062D6; 10 | --ifm-color-primary-dark: #8062D6; 11 | --ifm-color-primary-darker: #8062D6; 12 | --ifm-color-primary-darkest: #322653; 13 | --ifm-color-primary-light: #8062D6; 14 | --ifm-color-primary-lighter: #8062D6; 15 | --ifm-color-primary-lightest: #9288F8; 16 | --ifm-code-font-size: 95%; 17 | --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); 18 | } 19 | 20 | /* For readability concerns, you should choose a lighter palette in dark mode. */ 21 | [data-theme='dark'] { 22 | --ifm-color-primary: #8062D6; 23 | --ifm-color-primary-dark: #8062D6; 24 | --ifm-color-primary-darker: #8062D6; 25 | --ifm-color-primary-darkest: #322653; 26 | --ifm-color-primary-light: #8062D6; 27 | --ifm-color-primary-lighter: #8062D6; 28 | --ifm-color-primary-lightest: #9288F8; 29 | --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); 30 | } 31 | -------------------------------------------------------------------------------- /tests/seeds.js: -------------------------------------------------------------------------------- 1 | export const NUMERIC_INPUT = 1; 2 | export const EMPTY_STRING_INPUT = ''; 3 | export const NOT_ACCEPTED_INPUT = '🍑🍆 a'; 4 | 5 | export const STRINGIFY_CORRECT_OUTPUT = 'B'; 6 | export const STRINGIFY_WRONG_OUTPUT = '🍑🍆🍑🍆'; 7 | export const STRINGIFY_INPUT = '🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆'; 8 | 9 | export const ANALLIFY_INPUT = 'A'; 10 | export const ANALLIFY_WRONG_OUTPUT = '🍑🍆'; 11 | export const ANALLIFY_CORRECT_OUTPUT = '🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆'; 12 | 13 | export const ANAL_FILE_LOCATION = 'tests/script.anal'; 14 | export const RUN_CORRECT_OUTPUT = 'Welcome to Analscript!'; 15 | export const RUN_WRONG_OUTPUT = 'Welcome to Jurassic Park!'; 16 | 17 | export const COMPILE_CORRECT_OUTPUT = true; 18 | export const FILE_LOCATION = 'tests/hello.anus'; 19 | export const COMPILED_FILE_LOCATION = 'tests/hello.anal'; 20 | -------------------------------------------------------------------------------- /docs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docs", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "docusaurus": "docusaurus", 7 | "start": "docusaurus start", 8 | "build": "docusaurus build", 9 | "swizzle": "docusaurus swizzle", 10 | "deploy": "docusaurus deploy", 11 | "clear": "docusaurus clear", 12 | "serve": "docusaurus serve", 13 | "write-translations": "docusaurus write-translations", 14 | "write-heading-ids": "docusaurus write-heading-ids", 15 | "typecheck": "tsc" 16 | }, 17 | "dependencies": { 18 | "@docusaurus/core": "2.4.1", 19 | "@docusaurus/preset-classic": "2.4.1", 20 | "@mdx-js/react": "^1.6.22", 21 | "clsx": "^1.2.1", 22 | "prism-react-renderer": "^1.3.5", 23 | "react": "^17.0.2", 24 | "react-dom": "^17.0.2" 25 | }, 26 | "devDependencies": { 27 | "@docusaurus/module-type-aliases": "2.4.1", 28 | "@tsconfig/docusaurus": "^1.0.5", 29 | "typescript": "^4.7.4" 30 | }, 31 | "browserslist": { 32 | "production": [ 33 | ">0.5%", 34 | "not dead", 35 | "not op_mini all" 36 | ], 37 | "development": [ 38 | "last 1 chrome version", 39 | "last 1 firefox version", 40 | "last 1 safari version" 41 | ] 42 | }, 43 | "engines": { 44 | "node": ">=16.14" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module", 3 | "version": "1.2.0", 4 | "name": "analscript", 5 | "author": "Airscript", 6 | "main": "analscript.js", 7 | "description": "A modern approach for writing anally fast stuff.", 8 | "keywords": [ 9 | "analscript", 10 | "programming language", 11 | "esoteric", 12 | "cli", 13 | "anal" 14 | ], 15 | "homepage": "https://esolangs.org/wiki/Analscript", 16 | "bugs": { 17 | "email": "support@airscript.it" 18 | }, 19 | "scripts": { 20 | "test": "node --test", 21 | "coverage": "c8 node --test" 22 | }, 23 | "bin": { 24 | "analscript": "cli.js" 25 | }, 26 | "repository": { 27 | "type": "git", 28 | "url": "https://github.com/airscripts/analscript.git" 29 | }, 30 | "funding": [ 31 | { 32 | "type": "github", 33 | "url": "https://github.com/sponsors/airscripts" 34 | }, 35 | { 36 | "type": "ko-fi", 37 | "url": "https://ko-fi.com/airscript" 38 | }, 39 | { 40 | "type": "linktree", 41 | "url": "https://linktr.ee/airscript" 42 | } 43 | ], 44 | "license": "MIT", 45 | "devDependencies": { 46 | "c8": "^9.1.0", 47 | "eslint": "^8.46.0", 48 | "eslint-config-airbnb-base": "^15.0.0", 49 | "eslint-plugin-import": "^2.28.0", 50 | "prettier": "^3.0.0" 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /lib/std.js: -------------------------------------------------------------------------------- 1 | import fs from 'node:fs'; 2 | 3 | import { checker } from './utils.js'; 4 | import { ERROR, SUCCESS } from './dictionary.js'; 5 | import { ANAL_CHARACTERS } from './constants.js'; 6 | import { matcher, sequence } from './regexp.js'; 7 | 8 | export function anallify(string) { 9 | if (!checker(string)) { 10 | throw new Error(ERROR.notString); 11 | } 12 | 13 | if (!string) { 14 | throw new Error(ERROR.missingArgument); 15 | } 16 | 17 | let anal = ''; 18 | const characters = string.split(''); 19 | 20 | for (let index = 0; index < characters.length; index += 1) { 21 | const character = characters[index]; 22 | const fragment = ANAL_CHARACTERS.repeat(character.charCodeAt(0)); 23 | anal = anal.concat(fragment).concat(' '); 24 | } 25 | 26 | return anal.trimEnd(); 27 | } 28 | 29 | export function stringify(anal) { 30 | if (!checker(anal)) { 31 | throw new Error(ERROR.notString); 32 | } 33 | 34 | if (!anal) { 35 | throw new Error(ERROR.missingArgument); 36 | } 37 | 38 | if (!matcher.test(anal)) { 39 | throw new Error(ERROR.notAcceptedByGrammar); 40 | } 41 | 42 | let string = ''; 43 | const fragments = anal.split(' '); 44 | 45 | for (let index = 0; index < fragments.length; index += 1) { 46 | const fragment = fragments[index]; 47 | const character = String.fromCharCode(((fragment.match(sequence)).length)); 48 | string = string.concat(character); 49 | } 50 | 51 | return string; 52 | } 53 | 54 | export function run(file) { 55 | let contents = null; 56 | 57 | try { 58 | contents = fs.readFileSync(file, { encoding: 'utf-8' }); 59 | } catch (error) { 60 | throw new Error(ERROR.fileNotFound); 61 | } 62 | 63 | return stringify(contents); 64 | } 65 | 66 | export function compile(file) { 67 | let contents = null; 68 | const fileOptions = { encoding: 'utf-8' }; 69 | 70 | try { 71 | contents = fs.readFileSync(file, fileOptions); 72 | } catch (error) { 73 | throw new Error(ERROR.fileNotFound); 74 | } 75 | 76 | let filename = file.split('.'); 77 | filename = filename.filter((element, index) => index < filename.length - 1); 78 | filename = filename.join('.'); 79 | 80 | fs.writeFileSync(`${filename}.anal`, anallify(contents), fileOptions); 81 | process.stdout.write(`${SUCCESS.compileSuccess}`); 82 | return true; 83 | } 84 | -------------------------------------------------------------------------------- /tests/std.test.js: -------------------------------------------------------------------------------- 1 | import fs from 'node:fs'; 2 | import { describe, it } from 'node:test'; 3 | import { deepEqual, notDeepEqual, throws } from 'node:assert/strict'; 4 | 5 | import { 6 | FILE_LOCATION, 7 | NUMERIC_INPUT, 8 | ANALLIFY_INPUT, 9 | STRINGIFY_INPUT, 10 | RUN_WRONG_OUTPUT, 11 | ANAL_FILE_LOCATION, 12 | EMPTY_STRING_INPUT, 13 | NOT_ACCEPTED_INPUT, 14 | RUN_CORRECT_OUTPUT, 15 | ANALLIFY_WRONG_OUTPUT, 16 | STRINGIFY_WRONG_OUTPUT, 17 | COMPILE_CORRECT_OUTPUT, 18 | COMPILED_FILE_LOCATION, 19 | ANALLIFY_CORRECT_OUTPUT, 20 | STRINGIFY_CORRECT_OUTPUT, 21 | } from './seeds.js'; 22 | 23 | import { 24 | run, 25 | anallify, 26 | stringify, 27 | compile, 28 | } from '../lib/std.js'; 29 | import { ERROR } from '../lib/dictionary.js'; 30 | 31 | describe('Anallify', () => { 32 | it('Encode string to anal', () => { 33 | deepEqual(anallify(ANALLIFY_INPUT), ANALLIFY_CORRECT_OUTPUT); 34 | notDeepEqual(anallify(ANALLIFY_INPUT), ANALLIFY_WRONG_OUTPUT); 35 | }); 36 | 37 | it('Throw error if argument is not a string', () => { 38 | throws(() => anallify(1), Error(ERROR.notString)); 39 | }); 40 | 41 | it('Throw error if argument is missing', () => { 42 | throws(() => anallify(EMPTY_STRING_INPUT), Error(ERROR.missingArgument)); 43 | }); 44 | }); 45 | 46 | describe('Stringify', () => { 47 | it('Decode anal to string', () => { 48 | deepEqual(stringify(STRINGIFY_INPUT), STRINGIFY_CORRECT_OUTPUT); 49 | notDeepEqual(stringify(STRINGIFY_INPUT), STRINGIFY_WRONG_OUTPUT); 50 | }); 51 | 52 | it('Throw error if argument is not a string', () => { 53 | throws(() => stringify(1), Error(ERROR.notString)); 54 | }); 55 | 56 | it('Throw error if argument is missing', () => { 57 | throws(() => stringify(EMPTY_STRING_INPUT), Error(ERROR.missingArgument)); 58 | }); 59 | 60 | it('Throw error if there are grammar-refused characters', () => { 61 | throws(() => stringify(NOT_ACCEPTED_INPUT), Error(ERROR.notAcceptedByGrammar)); 62 | }); 63 | }); 64 | 65 | describe('Run', () => { 66 | it('Run .anal file', () => { 67 | deepEqual(run(ANAL_FILE_LOCATION), RUN_CORRECT_OUTPUT); 68 | notDeepEqual(run(ANAL_FILE_LOCATION), RUN_WRONG_OUTPUT); 69 | }); 70 | 71 | it('Throw error if file is not found', () => { 72 | throws(() => run(NUMERIC_INPUT), Error(ERROR.fileNotFound)); 73 | }); 74 | }); 75 | 76 | describe('Compile', () => { 77 | it('Compile file to .anal', (t) => { 78 | t.after(() => fs.rmSync(COMPILED_FILE_LOCATION)); 79 | 80 | deepEqual(compile(FILE_LOCATION), COMPILE_CORRECT_OUTPUT); 81 | }); 82 | 83 | it('Throw error if file is not found', () => { 84 | throws(() => compile(NUMERIC_INPUT), Error(ERROR.fileNotFound)); 85 | }); 86 | }); 87 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | All notable changes to this project will be documented in this file. 3 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) with some edits, 4 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 5 | 6 | # 1.2.0 7 | 8 | ## What's Changed 9 | * docs: add docusaurus official documentation 10 | 11 | **Full Changelog**: https://github.com/airscripts/analscript/compare/1.1.7...1.2.0 12 | 13 | # 1.1.7 14 | 15 | ## What's Changed 16 | * test: full code coverage w/ @mateonunez 17 | * refactor: enforce code robustness 18 | 19 | ## New Contributors 20 | * @mateonunez made their first contribution in https://github.com/airscripts/analscript/pull/13 21 | 22 | **Full Changelog**: https://github.com/airscripts/analscript/compare/1.1.6...1.1.7 23 | 24 | # 1.1.6 25 | 26 | ## What's Changed 27 | * chore: version bump for README with updated static links 28 | 29 | **Full Changelog**: https://github.com/airscripts/analscript/compare/1.1.5...1.1.6 30 | 31 | # 1.1.5 32 | 33 | ## What's Changed 34 | * chore: add static links in README for images 35 | 36 | **Full Changelog**: https://github.com/airscripts/analscript/compare/1.1.4...1.1.5 37 | 38 | # 1.1.4 39 | 40 | ## What's Changed 41 | * chore: add missing gif in README 42 | 43 | **Full Changelog**: https://github.com/airscripts/analscript/compare/1.1.3...1.1.4 44 | 45 | # 1.1.3 46 | 47 | ## What's Changed 48 | * refactor: remove config.js file 49 | 50 | **Full Changelog**: https://github.com/airscripts/analscript/compare/1.1.2...1.1.3 51 | 52 | # 1.1.2 53 | 54 | ## What's Changed 55 | * refactor: update package-lock.json with recent changes 56 | * chore: add logo 57 | 58 | **Full Changelog**: https://github.com/airscripts/analscript/compare/1.1.1...1.1.2 59 | 60 | # 1.1.1 61 | 62 | ## What's Changed 63 | * refactor: add missing run and compile commands into help 64 | 65 | **Full Changelog**: https://github.com/airscripts/analscript/compare/1.1.0...1.1.1 66 | 67 | # 1.1.0 68 | 69 | ## What's Changed 70 | * feat: add run and compile commands to stdlib 71 | 72 | **Full Changelog**: https://github.com/airscripts/analscript/compare/1.0.2...1.1.0 73 | 74 | # 1.0.2 75 | 76 | ## What's Changed 77 | * refactor: add shebang on top of cli 78 | 79 | **Full Changelog**: https://github.com/airscripts/analscript/compare/1.0.1...1.0.2 80 | 81 | # 1.0.1 82 | 83 | ## What's Changed 84 | * refactor: change VERSION for npm package publish 85 | 86 | **Full Changelog**: https://github.com/airscripts/analscript/compare/1.0.0...1.0.1 87 | 88 | # 1.0.0 89 | 90 | ## What's Changed 91 | * feat: add anallify to stdlib 92 | * feat: add stringify to stdlib 93 | * feat: add cli 94 | 95 | **Full Changelog**: https://github.com/airscripts/analscript/commits/1.0.0 96 | -------------------------------------------------------------------------------- /docs/docusaurus.config.js: -------------------------------------------------------------------------------- 1 | // @ts-check 2 | 3 | const lightCodeTheme = require('prism-react-renderer/themes/github'); 4 | const darkCodeTheme = require('prism-react-renderer/themes/dracula'); 5 | 6 | /** @type {import('@docusaurus/types').Config} */ 7 | const config = { 8 | title: 'Analscript', 9 | tagline: 'A modern approach to make anally fast stuff.', 10 | favicon: 'img/favicon.ico', 11 | url: 'https://analscript.airscript.it', 12 | baseUrl: '/', 13 | organizationName: 'airscripts', 14 | projectName: 'analscript', 15 | onBrokenLinks: 'throw', 16 | onBrokenMarkdownLinks: 'warn', 17 | 18 | i18n: { 19 | defaultLocale: 'en', 20 | locales: ['en'], 21 | }, 22 | 23 | presets: [ 24 | [ 25 | 'classic', 26 | /** @type {import('@docusaurus/preset-classic').Options} */ 27 | ({ 28 | blog: false, 29 | 30 | docs: { 31 | routeBasePath: '/', 32 | sidebarPath: require.resolve('./sidebars.js'), 33 | editUrl: 'https://github.com/airscripts/analscript/edit/main/docs', 34 | }, 35 | 36 | theme: { 37 | customCss: require.resolve('./src/css/custom.css'), 38 | }, 39 | }), 40 | ], 41 | ], 42 | 43 | themeConfig: 44 | /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ 45 | ({ 46 | image: 'https://raw.githubusercontent.com/airscripts/analscript/main/assets/images/cover.png', 47 | 48 | navbar: { 49 | title: 'Analscript', 50 | 51 | logo: { 52 | alt: 'Analscript Logo', 53 | src: 'https://raw.githubusercontent.com/airscripts/analscript/main/assets/images/logo.png', 54 | }, 55 | 56 | items: [ 57 | { 58 | label: 'Docs', 59 | position: 'left', 60 | type: 'docSidebar', 61 | sidebarId: 'sidebar', 62 | }, 63 | 64 | { 65 | href: 'https://github.com/airscripts/analscript', 66 | label: 'GitHub', 67 | position: 'right', 68 | }, 69 | ], 70 | }, 71 | 72 | footer: { 73 | style: 'dark', 74 | 75 | links: [ 76 | { 77 | title: 'More', 78 | items: [ 79 | { 80 | label: 'GitHub', 81 | href: 'https://github.com/airscripts/analscript', 82 | }, 83 | 84 | { 85 | label: 'Airscript', 86 | href: 'https://github.com/airscripts', 87 | }, 88 | ], 89 | }, 90 | ], 91 | 92 | copyright: `Copyright © ${new Date().getFullYear()} Airscript. Built with Docusaurus.`, 93 | }, 94 | 95 | prism: { 96 | theme: lightCodeTheme, 97 | darkTheme: darkCodeTheme, 98 | }, 99 | }), 100 | }; 101 | 102 | module.exports = config; 103 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | Logo
3 | Analscript 4 |

5 | 6 |

7 | Analscript is a joke esoteric programming language, that takes inspiration from the fallen AnalLang and serves, the purpose to be a modern approach for writing anally fast stuff. 8 |

9 | 10 |

11 | Usage GIF 12 |

13 | 14 | ## Contents 15 | - [Installation](#installation) 16 | - [Usage](#usage) 17 | - [Resources](#resources) 18 | - [Contributing](#contributing) 19 | - [Support](#support) 20 | - [License](#license) 21 | 22 | ## Installation 23 | In order to install the project, you need to have already installed Node.js. 24 | *We suggest at least v18.* 25 | 26 | Open your terminal and type into it: 27 | ``` 28 | npm install -g analscript 29 | ``` 30 | 31 | ## Usage 32 | In order to use Analscript, after install, you need to access the fully-fledged CLI: 33 | ``` 34 | analscript help 35 | ``` 36 | 37 | This command will show you something like this: 38 | ``` 39 | Analscript Version 1.2.0 40 | Copyright (c) 2023 by Airscript 41 | 42 | Usage: 43 | analscript command [options] [arguments] 44 | 45 | Commands: 46 | run Run a .anal file 47 | compile Compile any file to .anal 48 | anallify Encode string to anal 49 | stringify Decode anal to string 50 | help Show this help 51 | 52 | Options: 53 | Nothing to see here 54 | 55 | Arguments: 56 | Nothing to see here 57 | ``` 58 | 59 | As you can see, you can as of this latest version, have access to a variety of commands. 60 | Use them to write or read your anally marvelous softwares! 61 | 62 | ## Resources 63 | - [Esolang Wiki Page](https://esolangs.org/wiki/Analscript): the official Esolang Wiki page. 64 | - [GitHub Page](https://ghio.airscript.it/analscript): the GitHub page for this repository. 65 | - [Docker Hub](https://hub.docker.com/r/airscript/analscript): the official image for trying it out with Docker. 66 | - [npm](https://www.npmjs.com/package/analscript): npmjs page for Analscript's package. 67 | - [Documentation](https://analscript.airscript.it): Analscript's documentation. 68 | 69 | ## Contributing 70 | Contributions and suggestions about how to improve this project are welcome! 71 | Just follow our [contributing guidelines](https://github.com/airscripts/analscript/blob/main/CONTRIBUTING.md). 72 | 73 | ## Support 74 | If you want to support my work you can do it by following me, leaving a star, sharing my projects or also donating at the links below. 75 | Choose what you find more suitable for you: 76 | 77 | 78 | GitHub Sponsors 79 |   80 | 81 | Kofi 82 | 83 | 84 | ## License 85 | This repository is licensed under [MIT License](https://github.com/airscripts/analscript/blob/main/LICENSE). 86 | -------------------------------------------------------------------------------- /docs/docs/getting-started/scripting.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 2 3 | --- 4 | 5 | # Scripting 6 | If you are here, it means that you have installed successfully `analscript`! 7 | In this chapter we will write our first script. 8 | 9 | ## .anal Extension 10 | `analscript` files use the preferred .anal extension. 11 | In order to write an `analscript`, you need first to learn its grammar. 12 | The grammar is basically composed by two simple keywords: 🍑🍆. 13 | These two are the so called anal characters and they're needed in order to write your first program. 14 | 15 | ## Logic Behind 16 | The logic behind `analscript` is simple: every single character can be represented by its `ASCII` code. 17 | In `analscript` we can simply multiply that code with the sequence of characters that we have seen before. 18 | This will make us one actual character. 19 | So basically, if you would create a simple Hello World program, you'd have only to repeat this process for every character in the two words. 20 | 21 | ## Hello World 22 | Let's start by creating an `hello.anal` file: 23 | ```bash 24 | touch hello.anal 25 | ``` 26 | 27 | Then, with our preferred text editor or IDE, we can start writing the Hello World script following the logic explained earlier: 28 | ``` 29 | 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 30 | ``` 31 | 32 | ## Something Missing? 33 | If you find issues with the documentation or have suggestions on how to improve the documentation or the project in general, please file an issue for us on `GitHub`. 34 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | We as members, contributors, and leaders pledge to make participation in our 5 | community a harassment-free experience for everyone, regardless of age, body 6 | size, visible or invisible disability, ethnicity, sex characteristics, gender 7 | identity and expression, level of experience, education, socio-economic status, 8 | nationality, personal appearance, race, caste, color, religion, or sexual identity 9 | and orientation. 10 | 11 | We pledge to act and interact in ways that contribute to an open, welcoming, 12 | diverse, inclusive, and healthy community. 13 | 14 | ## Our Standards 15 | Examples of behavior that contributes to a positive environment for our 16 | community include: 17 | 18 | * Demonstrating empathy and kindness toward other people 19 | * Being respectful of differing opinions, viewpoints, and experiences 20 | * Giving and gracefully accepting constructive feedback 21 | * Accepting responsibility and apologizing to those affected by our mistakes, 22 | and learning from the experience 23 | * Focusing on what is best not just for us as individuals, but for the 24 | overall community 25 | 26 | Examples of unacceptable behavior include: 27 | 28 | * The use of sexualized language or imagery, and sexual attention or 29 | advances of any kind 30 | * Trolling, insulting or derogatory comments, and personal or political attacks 31 | * Public or private harassment 32 | * Publishing others' private information, such as a physical or email 33 | address, without their explicit permission 34 | * Other conduct which could reasonably be considered inappropriate in a 35 | professional setting 36 | 37 | ## Enforcement Responsibilities 38 | Community leaders are responsible for clarifying and enforcing our standards of 39 | acceptable behavior and will take appropriate and fair corrective action in 40 | response to any behavior that they deem inappropriate, threatening, offensive, 41 | or harmful. 42 | 43 | Community leaders have the right and responsibility to remove, edit, or reject 44 | comments, commits, code, wiki edits, issues, and other contributions that are 45 | not aligned to this Code of Conduct, and will communicate reasons for moderation 46 | decisions when appropriate. 47 | 48 | ## Scope 49 | This Code of Conduct applies within all community spaces, and also applies when 50 | an individual is officially representing the community in public spaces. 51 | Examples of representing our community include using an official e-mail address, 52 | posting via an official social media account, or acting as an appointed 53 | representative at an online or offline event. 54 | 55 | ## Enforcement 56 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 57 | reported to the community leaders responsible for enforcement at 58 | . 59 | All complaints will be reviewed and investigated promptly and fairly. 60 | 61 | All community leaders are obligated to respect the privacy and security of the 62 | reporter of any incident. 63 | 64 | ## Enforcement Guidelines 65 | Community leaders will follow these Community Impact Guidelines in determining 66 | the consequences for any action they deem in violation of this Code of Conduct: 67 | 68 | ### 1. Correction 69 | **Community Impact**: Use of inappropriate language or other behavior deemed 70 | unprofessional or unwelcome in the community. 71 | 72 | **Consequence**: A private, written warning from community leaders, providing 73 | clarity around the nature of the violation and an explanation of why the 74 | behavior was inappropriate. A public apology may be requested. 75 | 76 | ### 2. Warning 77 | **Community Impact**: A violation through a single incident or series 78 | of actions. 79 | 80 | **Consequence**: A warning with consequences for continued behavior. No 81 | interaction with the people involved, including unsolicited interaction with 82 | those enforcing the Code of Conduct, for a specified period of time. This 83 | includes avoiding interactions in community spaces as well as external channels 84 | like social media. Violating these terms may lead to a temporary or 85 | permanent ban. 86 | 87 | ### 3. Temporary Ban 88 | **Community Impact**: A serious violation of community standards, including 89 | sustained inappropriate behavior. 90 | 91 | **Consequence**: A temporary ban from any sort of interaction or public 92 | communication with the community for a specified period of time. No public or 93 | private interaction with the people involved, including unsolicited interaction 94 | with those enforcing the Code of Conduct, is allowed during this period. 95 | Violating these terms may lead to a permanent ban. 96 | 97 | ### 4. Permanent Ban 98 | **Community Impact**: Demonstrating a pattern of violation of community 99 | standards, including sustained inappropriate behavior, harassment of an 100 | individual, or aggression toward or disparagement of classes of individuals. 101 | 102 | **Consequence**: A permanent ban from any sort of public interaction within 103 | the community. 104 | 105 | ## Attribution 106 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 107 | version 2.0, available at 108 | [https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0]. 109 | 110 | Community Impact Guidelines were inspired by 111 | [Mozilla's code of conduct enforcement ladder][Mozilla CoC]. 112 | 113 | For answers to common questions about this code of conduct, see the FAQ at 114 | [https://www.contributor-covenant.org/faq][FAQ]. Translations are available 115 | at [https://www.contributor-covenant.org/translations][translations]. 116 | 117 | [homepage]: https://www.contributor-covenant.org 118 | [v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html 119 | [Mozilla CoC]: https://github.com/mozilla/diversity 120 | [FAQ]: https://www.contributor-covenant.org/faq 121 | [translations]: https://www.contributor-covenant.org/translations -------------------------------------------------------------------------------- /docs/docs/guides/commands.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | # Commands 6 | `analscript` exposes various commands for different purposes. 7 | In this page we will see and describe all of them. 8 | 9 | ## Help 10 | The first command is `help`. This command is always the most important one when approaching a new CLI. 11 | It gives us an overview of what we can do with the tool. 12 | ```bash 13 | analscript help 14 | ``` 15 | 16 | ## Anallify 17 | With `anallify` you can simply encode a simple string to anal code. 18 | Just take whatever string you want and run a command like this one: 19 | ```bash 20 | analscript anallify Hello World 21 | ``` 22 | 23 | It would give you an output like this: 24 | ``` 25 | 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 26 | ``` 27 | 28 | ## Stringify 29 | With `stringify` command you can do a decoding from anal code to string. 30 | It can be simply used like this: 31 | ```bash 32 | analscript stringify 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑 🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 33 | ``` 34 | 35 | The anal code written above it's basically an encoded `a` character, that will be our output: 36 | ```bash 37 | a 38 | ``` 39 | 40 | ## Compile 41 | With `compile` you can take whatever file you want and compile it to anal code. 42 | For example we could do something like this: 43 | ```bash 44 | echo -n "Hello World" > hello.txt 45 | analscript compile hello.txt 46 | ``` 47 | 48 | This would give you a compile file with `.anal` extension. 49 | 50 | ## Run 51 | With `run` you can take a `.anal` file and run it printing to your terminal the actual decoded content. 52 | For example purposes, we could use an `.anal` file containing an encoded Hello World and run it like this: 53 | ```bash 54 | analscript run hello.anal 55 | ``` 56 | 57 | The output would be something like this: 58 | ``` 59 | Hello World 60 | ``` 61 | 62 | ## Something Missing? 63 | If you find issues with the documentation or have suggestions on how to improve the documentation or the project in general, please file an issue for us on `GitHub`. 64 | -------------------------------------------------------------------------------- /tests/script.anal: -------------------------------------------------------------------------------- 1 | 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆🍑🍆 --------------------------------------------------------------------------------