ccommit
Version:
๐ โ ๐ ๐ฐ ccommit Conventional Commit Generator that translates conventional commits to gitmoji.
1 lines โข 53.2 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","names":["process","commitTypes","commitTypes","commitTypes","commit","list"],"sources":["../src/lib/index.ts","../src/utils/cancel-if.ts","../src/data/types.ts","../src/utils/find-by.ts","../src/utils/find-command.ts","../src/utils/format.ts","../src/utils/generate-log.ts","../src/utils/get-chars-left.ts","../src/utils/get-git-root-dir.ts","../src/utils/get-issue-tracker.ts","../src/utils/get-staged-files.ts","../src/utils/print-dry-run.ts","../src/utils/register-hook-interruption-handler.ts","../src/commands/commit/questions.ts","../src/commands/commit/with-client.ts","../src/commands/commit/with-hook.ts","../src/commands/commit/commit.ts","../src/commands/commit/index.ts","../src/commands/list/list.ts","../src/commands/list/index.ts","../src/index.ts"],"sourcesContent":["const COMMANDS = {\n COMMIT: \"commit\",\n HOOK: \"hook\",\n LIST: \"list\",\n};\nconst COMMIT_FORMATS = {\n CONVENTIONAL: \"conventional\",\n CONVENTIONAL_NO_EMOJI: \"conventional-no-emoji\",\n GITMOJI: \"gitmoji\",\n};\n\nconst COMMIT_MODES = {\n CLIENT: \"client\",\n HOOK: \"hook\",\n};\n\nconst FIND_BY = {\n EMOJI: \"emoji\",\n TYPE: \"type\",\n};\n\nconst FLAGS = Object.freeze({\n BREAKING: \"breaking\",\n COMMIT: \"commit\",\n DRYRUN: \"dryrun\",\n EMOJI: \"emoji\",\n HELP: \"help\",\n HOOK: \"hook\",\n LIST: \"list\",\n SKIP: \"skip\",\n VERSION: \"version\",\n});\n\nconst FORMAT = {\n [COMMIT_FORMATS.CONVENTIONAL]: \"{type}{scope}{breaking}: {emoji}{title}\",\n [COMMIT_FORMATS.CONVENTIONAL_NO_EMOJI]: \"{type}{scope}{breaking}: {title}\",\n [COMMIT_FORMATS.GITMOJI]: \"{emoji}{breaking}{scope}{title}\",\n};\n\nconst LOGS = {\n MESSAGES: {\n COMMAND_LINE_WITHOUT_REQUIRED: \"โฏ Command line option requires both: --title, --type\",\n COMMIT_FAIL: `โฏ \\n\n โฏ Oops! An error occurred. There is likely additional logging output above.\\n\n โฏ You can run the same commit with this command:\\n\n โฏ \\t\n {REPLACE}\n `,\n GENERATOR_TAKING_OVER: \"โฏ Generator will take it from here (CTRL+C to quit)\",\n MODE_CONFLICT: \"โฏ Please choose one or the other: --commit, -c | --hook, -u\",\n REPLACE: \"{REPLACE}\",\n STAGED_FILES: \"โฏ There are no staged files for git. Did you mean to do a dry-run (-n)?\",\n TYPE_INCORRECT: \"โฏ There is no gitmoji/type associated with: {REPLACE}\",\n },\n TYPES: {\n ERROR: \"error\",\n INFO: \"info\",\n SUCCESS: \"success\",\n WARNING: \"warning\",\n },\n};\n\nconst OPTIONS = Object.freeze({\n FORMAT: \"format\",\n MESSAGE: \"message\",\n SCOPE: \"scope\",\n TITLE: \"title\",\n TYPE: \"type\",\n});\n\nconst SCOPE = {\n MAX: 12,\n MIN: 3,\n};\n\nconst SEMVER = {\n MAJOR: \"major\",\n MINOR: \"minor\",\n NULL: \"null\",\n PATCH: \"patch\",\n};\n\nconst TITLE = {\n MAX: 48,\n MAX_SWAG: 40,\n MIN: 3,\n MIN_SWAG: 15,\n};\n\nconst TYPE = {\n MAX: 15,\n};\n\nexport {\n COMMANDS,\n COMMIT_FORMATS,\n COMMIT_MODES,\n FIND_BY,\n FLAGS,\n FORMAT,\n LOGS,\n OPTIONS,\n SCOPE,\n SEMVER,\n TITLE,\n TYPE,\n};\n","/*!\n * reference: https://github.com/carloscuesta/gitmoji-cli\n */\nimport fs from \"node:fs\";\nimport process from \"node:process\";\n\nimport { execa } from \"execa\";\n\nconst cancelIfRebasing = (): Promise<void> =>\n execa(\"git\", [\"rev-parse\", \"--absolute-git-dir\"]).then(({ stdout: gitDirectory }) => {\n // see https://stackoverflow.com/questions/3921409/how-to-know-if-there-is-a-git-rebase-in-progress\n // to understand how a rebase is detected\n if (\n fs.existsSync(gitDirectory + \"/rebase-merge\") ||\n fs.existsSync(gitDirectory + \"/rebase-apply\")\n ) {\n process.exit(0);\n }\n });\n\nconst COMMIT_MESSAGE_SOURCE = 4;\n\nconst cancelIfAmending = (): Promise<void> =>\n new Promise<void>((resolve) => {\n /*\n from https://git-scm.com/docs/githooks#_prepare_commit_msg\n the commit message source is passed as second argument and corresponding 4 for ccommit\n `gitmoji --hook $1 $2`\n */\n const commitMessageSource: string = process.argv[COMMIT_MESSAGE_SOURCE];\n if (\n commitMessageSource &&\n (commitMessageSource.startsWith(\"commit\") || commitMessageSource.startsWith(\"merge\"))\n ) {\n process.exit(0);\n }\n resolve();\n });\n\n// I avoid Promise.all to avoid race condition in future cancel callbacks\nconst cancelIfNeeded = (): Promise<void> => cancelIfAmending().then(cancelIfRebasing);\n\nexport { COMMIT_MESSAGE_SOURCE, cancelIfAmending, cancelIfNeeded, cancelIfRebasing };\n","// @todo(ccommit) cache + generation from: @jeromefitz/conventional-gitmoji\nimport { SEMVER } from \"../lib/index.ts\";\n\n// @hack(ccommit) emojiLength is to help with formatting until can do it programmatically\nconst types = [\n {\n code: \":wheelchair:\",\n description: \"Improve Accessibility\",\n emoji: \"โฟ๏ธ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"access\",\n },\n {\n code: \":chart_with_upwards_trend:\",\n description: \"Add or Update Analytics or Track Code\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"analytics\",\n },\n {\n code: \":dizzy:\",\n description: \"Add or Update Animations and Transitions\",\n emoji: \"๐ซ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"animation\",\n },\n {\n code: \":building_construction:\",\n description: \"Make Architectural Changes\",\n emoji: \"๐๏ธ\",\n emojiLength: 0,\n semver: SEMVER.NULL,\n type: \"arch\",\n },\n {\n code: \":bento:\",\n description: \"Add or Update Assets\",\n emoji: \"๐ฑ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"assets\",\n },\n {\n code: \":t-rex:\",\n description: \"Backwards Compatibility\",\n emoji: \"๐ฆ\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"backwards\",\n },\n {\n code: \":beers:\",\n description: \"Write Code Drunkenly\",\n emoji: \"๐ป\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"beer\",\n },\n {\n code: \":boom:\",\n description: \"Introduce Breaking Changes\",\n emoji: \"๐ฅ\",\n emojiLength: 1,\n semver: SEMVER.MAJOR,\n type: \"breaking\",\n },\n {\n code: \":hammer:\",\n description: \"Add or Update Development Scripts\",\n emoji: \"๐จ\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"build\",\n },\n {\n code: \":goal_net:\",\n description: \"Catch Errors\",\n emoji: \"๐ฅ
\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"catch\",\n },\n {\n code: \":computer_disk:\",\n description: \"Changes That Donโt Modify Src or Test Files\",\n emoji: \"๐ฝ๏ธ\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"chore\",\n },\n {\n code: \":construction_worker:\",\n description: \"Add or Update CI Build System\",\n emoji: \"๐ท\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"ci\",\n },\n {\n code: \":wastebasket:\",\n description: \"Deprecate Code That Needs to Be Cleaned Up\",\n emoji: \"๐๏ธ\",\n emojiLength: 0,\n semver: SEMVER.PATCH,\n type: \"clean\",\n },\n {\n code: \":alien:\",\n description: \"Update Code Due to External API Changes\",\n emoji: \"๐ฝ๏ธ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"compat\",\n },\n {\n code: \":thread:\",\n description: \"Add or Update Code Related to Multithreading or Concurrency\",\n emoji: \"๐งต\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"concurrency\",\n },\n {\n code: \":wrench:\",\n description: \"Add or Update Configuration Files\",\n emoji: \"๐ง\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"config\",\n },\n {\n code: \":busts_in_silhouette:\",\n description: \"Add or Update Contributor(s)\",\n emoji: \"๐ฅ\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"contrib-add\",\n },\n {\n code: \":monocle_face:\",\n description: \"Data Exploration/inspection\",\n emoji: \"๐ง\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"data\",\n },\n {\n code: \":card_file_box:\",\n description: \"Perform Database Related Changes\",\n emoji: \"๐๏ธ\",\n emojiLength: 0,\n semver: SEMVER.PATCH,\n type: \"db\",\n },\n {\n code: \":heavy_plus_sign:\",\n description: \"Add a Dependency\",\n emoji: \"โ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"dep-add\",\n },\n {\n code: \":heavy_minus_sign:\",\n description: \"Remove a Dependency\",\n emoji: \"โ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"dep-rm\",\n },\n {\n code: \":package:\",\n description: \"Add or Update Compiled Files or Packages\",\n emoji: \"๐ฆ๏ธ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"dep-up\",\n },\n {\n code: \":rocket:\",\n description: \"Deploy Stuff\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"deploy\",\n },\n {\n code: \":bulb:\",\n description: \"Add or Update Comments in Source Code\",\n emoji: \"๐ก\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"docs-code\",\n },\n {\n code: \":memo:\",\n description: \"Add or Update Documentation\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"docs\",\n },\n {\n code: \":arrow_down:\",\n description: \"Downgrade Dependencies\",\n emoji: \"โฌ๏ธ\",\n emojiLength: 0,\n semver: SEMVER.PATCH,\n type: \"downgrade\",\n },\n {\n code: \":technologist:\",\n description: \"Improve Developer Experience\",\n emoji: \"๐ป\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"dx\",\n },\n {\n code: \":egg:\",\n description: \"Add or Update an Easter Egg\",\n emoji: \"๐ฅ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"egg\",\n },\n {\n code: \":alembic:\",\n description: \"Perform Experiments\",\n emoji: \"โ๏ธ\",\n emojiLength: 0,\n semver: SEMVER.PATCH,\n type: \"experiment\",\n },\n {\n code: \":sparkles:\",\n description: \"Introduce New Features\",\n emoji: \"โจ\",\n emojiLength: 1,\n semver: SEMVER.MINOR,\n type: \"feat\",\n },\n {\n code: \":bug:\",\n description: \"Fix a Bug\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"fix\",\n },\n {\n code: \":green_heart:\",\n description: \"Fix CI Build\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"fix-ci\",\n },\n {\n code: \":triangular_flag_on_post:\",\n description: \"Add Update or Remove Feature Flags\",\n emoji: \"๐ฉ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"flags\",\n },\n {\n code: \":stethoscope:\",\n description: \"Add or Update Healthcheck\",\n emoji: \"๐ฉบ\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"healthcheck\",\n },\n {\n code: \":ambulance:\",\n description: \"Critical Hotfix\",\n emoji: \"๐๏ธ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"hotfix\",\n },\n {\n code: \":globe_with_meridians:\",\n description: \"Internationalization and Localization\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"i18n\",\n },\n {\n code: \":see_no_evil:\",\n description: \"Add or Update a Gitignore File.\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"ignore\",\n },\n {\n code: \":bricks:\",\n description: \"Infrastructure Related Changes\",\n emoji: \"๐งฑ\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"inf\",\n },\n {\n code: \":tada:\",\n description: \"Begin a Project\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"init\",\n },\n {\n code: \":iphone:\",\n description: \"Work on Responsive Design\",\n emoji: \"๐ฑ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"iphone\",\n },\n {\n code: \":page_facing_up:\",\n description: \"Add or Update License\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"license\",\n },\n {\n code: \":rotating_light:\",\n description: \"Fix Compiler / Linter Warnings\",\n emoji: \"๐จ\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"lint\",\n },\n {\n code: \":loud_sound:\",\n description: \"Add or Update Logs\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"log-add\",\n },\n {\n code: \":mute:\",\n description: \"Remove Logs\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"log-rm\",\n },\n {\n code: \":necktie:\",\n description: \"Add or Update Business Logic\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"logic\",\n },\n {\n code: \":twisted_rightwards_arrows:\",\n description: \"Merge Branches\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"merge\",\n },\n {\n code: \":clown_face:\",\n description: \"Mock Things\",\n emoji: \"๐คก\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"mock\",\n },\n {\n code: \":truck:\",\n description: \"Move or Rename Resources (Eg.: Files Paths Routes).\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"mv\",\n },\n {\n code: \":airplane:\",\n description: \"Provide offline support\",\n emoji: \"โ๏ธ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"offline\",\n },\n {\n code: \":adhesive_bandage:\",\n description: \"Simple Fix for a Non-Critical Issue\",\n emoji: \"๐ฉน\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"patch\",\n },\n {\n code: \":zap:\",\n description: \"Improve Performance\",\n emoji: \"โก๏ธ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"perf\",\n },\n {\n code: \":poop:\",\n description: \"Write Bad Code That Needs to Be Improved\",\n emoji: \"๐ฉ\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"poo\",\n },\n {\n code: \":fire:\",\n description: \"Remove Code or Files\",\n emoji: \"๐ฅ\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"prune\",\n },\n {\n code: \":pushpin:\",\n description: \"Pin Dependencies to Specific Versions\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"pushpin\",\n },\n {\n code: \":recycle:\",\n description: \"Refactor Code\",\n emoji: \"โป๏ธ\",\n emojiLength: 0,\n semver: SEMVER.NULL,\n type: \"refactor\",\n },\n {\n code: \":bookmark:\",\n description: \"Release / Version Tags\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"release\",\n },\n {\n code: \":rewind:\",\n description: \"Revert Changes\",\n emoji: \"โช๏ธ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"revert\",\n },\n {\n code: \":coffin:\",\n description: \"Remove Dead Code\",\n emoji: \"โฐ๏ธ\",\n emojiLength: 0,\n semver: SEMVER.NULL,\n type: \"rip\",\n },\n {\n code: \":passport_control:\",\n description: \"Work on Code Related to Authorization Roles and Permissions\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"roles\",\n },\n {\n code: \":fast_forward:\",\n description: \"Create Rollforward Version\",\n emoji: \"โฉ๏ธ\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"rollforward\",\n },\n {\n code: \":rocket:\",\n description: \"Custom Type for CI/CD to Hook into Run Build Override\",\n emoji: \"๐๏ธ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"run-build\",\n },\n {\n code: \":closed_lock_with_key:\",\n description: \"Add or Update Secrets\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"secrets\",\n },\n {\n code: \":lock:\",\n description: \"Fix Security Issues\",\n emoji: \"๐๏ธ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"security\",\n },\n {\n code: \":seedling:\",\n description: \"Add or Update Seed Files\",\n emoji: \"๐ฑ\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"seed\",\n },\n {\n code: \":mag:\",\n description: \"Improve Seo\",\n emoji: \"๐๏ธ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"seo\",\n },\n {\n code: \":camera_flash:\",\n description: \"Add or Update Snapshots\",\n emoji: \"๐ธ\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"snapshot\",\n },\n {\n code: \":money_with_wings:\",\n description: \"Add Sponsorships or Money Related Infrastructure\",\n emoji: \"๐ธ\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"sponsor\",\n },\n {\n code: \":art:\",\n description: \"Improve Structure / Format of the Code\",\n emoji: \"๐จ\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"style\",\n },\n {\n code: \":test_tube:\",\n description: \"Add a Failing Test\",\n emoji: \"๐งช\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"test-fail\",\n },\n {\n code: \":white_check_mark:\",\n description: \"Add Update or Pass Tests\",\n emoji: \"โ
\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"test\",\n },\n {\n code: \":speech_balloon:\",\n description: \"Add or Update Text and Literals\",\n emoji: \"๐ฌ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"texts\",\n },\n {\n code: \":label:\",\n description: \"Add or Update Types\",\n emoji: \"๐ท๏ธ\",\n emojiLength: 0,\n semver: SEMVER.PATCH,\n type: \"types\",\n },\n {\n code: \":pencil2:\",\n description: \"Fix Typos\",\n emoji: \"โ๏ธ\",\n emojiLength: 0,\n semver: SEMVER.PATCH,\n type: \"typo\",\n },\n {\n code: \":lipstick:\",\n description: \"Add or Update the UI and Style Files\",\n emoji: \"๐\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"ui\",\n },\n {\n code: \":arrow_up:\",\n description: \"Upgrade Dependencies\",\n emoji: \"โฌ๏ธ\",\n emojiLength: 0,\n semver: SEMVER.PATCH,\n type: \"upgrade\",\n },\n {\n code: \":children_crossing:\",\n description: \"Improve User Experience / Usability\",\n emoji: \"๐ธ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"ux\",\n },\n {\n code: \":safety_vest:\",\n description: \"Add or update code related to validation\",\n emoji: \"๐ฆบ\",\n emojiLength: 1,\n semver: SEMVER.PATCH,\n type: \"validation\",\n },\n {\n code: \":construction:\",\n description: \"Work in Progress\",\n emoji: \"๐ง\",\n emojiLength: 1,\n semver: SEMVER.NULL,\n type: \"wip\",\n },\n];\n\nexport default types;\n","import commitTypes from \"../data/types.ts\";\n\nconst findBy = (str, from, to): string | undefined => {\n const key = commitTypes.findIndex((el) => el[from] === str);\n return commitTypes[key]?.[to];\n};\n\nexport { findBy };\n","import process from \"node:process\";\n\nimport { COMMIT_FORMATS, COMMIT_MODES, FLAGS, LOGS, OPTIONS } from \"../lib/index.ts\";\nimport { generateLog, getStagedFiles } from \"./index.ts\";\n\nconst getOptionsForCommand = (command: string, flags: any): any => {\n const commandsWithOptions = [FLAGS.COMMIT, FLAGS.HOOK];\n\n // @ts-ignore\n if (commandsWithOptions.includes(command)) {\n const options = {\n dryrun: flags[FLAGS.DRYRUN],\n emoji: flags[FLAGS.EMOJI],\n // options\n format:\n flags[OPTIONS.FORMAT] === COMMIT_FORMATS.CONVENTIONAL\n ? flags[FLAGS.EMOJI]\n ? COMMIT_FORMATS.CONVENTIONAL\n : COMMIT_FORMATS.CONVENTIONAL_NO_EMOJI\n : COMMIT_FORMATS.GITMOJI,\n message: flags[OPTIONS.MESSAGE],\n mode: command === FLAGS.HOOK ? COMMIT_MODES.HOOK : COMMIT_MODES.CLIENT,\n scope: flags[OPTIONS.SCOPE],\n skip: flags[FLAGS.SKIP],\n title: flags[OPTIONS.TITLE],\n type: flags[OPTIONS.TYPE],\n };\n\n return options;\n }\n\n return null;\n};\n\n// @todo(lint) complexity: 11\n// oxlint-disable-next-line complexity\nconst findCommand = (cli: any, options: any): void => {\n const flags = cli.flags;\n const commandFlag = Object.keys(flags)\n .map((flag) => flags[flag] && flag)\n .find((flag) => options[flag]);\n\n const filesChanged = getStagedFiles();\n\n if (!flags[FLAGS.DRYRUN] && !filesChanged) {\n console.log(generateLog(LOGS.TYPES.ERROR, LOGS.MESSAGES.STAGED_FILES));\n process.exit(2);\n }\n\n if (flags[FLAGS.COMMIT] && flags[FLAGS.HOOK]) {\n console.log(generateLog(LOGS.TYPES.ERROR, LOGS.MESSAGES.MODE_CONFLICT));\n process.exit(2);\n }\n\n if (\n flags[OPTIONS.MESSAGE] ||\n flags[OPTIONS.SCOPE] ||\n flags[OPTIONS.TITLE] ||\n flags[OPTIONS.TYPE]\n ) {\n flags[FLAGS.SKIP] = true;\n }\n\n if (flags[FLAGS.SKIP]) {\n if (flags[OPTIONS.TITLE] && flags[OPTIONS.TYPE]) {\n flags[FLAGS.SKIP] = true;\n } else {\n flags[FLAGS.SKIP] = false;\n console.log(generateLog(LOGS.TYPES.ERROR, LOGS.MESSAGES.COMMAND_LINE_WITHOUT_REQUIRED));\n flags[OPTIONS.TITLE] = undefined;\n flags[OPTIONS.TYPE] = undefined;\n }\n }\n\n const commandOptions = getOptionsForCommand(commandFlag, flags);\n\n return options[commandFlag] ? options[commandFlag](commandOptions) : cli.showHelp();\n};\n\nexport { findCommand };\n","import { COMMIT_FORMATS, FORMAT, TYPE } from \"../lib/index.ts\";\n\nconst formatCliEmoji = ({ emoji, emojiLength }) =>\n emojiLength === 0 ? `${emoji} ` : `${emoji} `;\n\nconst formatCliType = (type) => type?.padEnd(TYPE.MAX);\n\nconst formatCliTypes = (commitTypes: any) => {\n // console.log(`EMOJI TYPE DESCRIPTION`)\n // console.log(`----- ---- -----------`)\n return commitTypes.map(({ description, emoji, emojiLength, type }) => {\n console.log(\n `${formatCliEmoji({\n emoji,\n emojiLength,\n })} ${formatCliType(type)} ${description}`,\n );\n });\n};\n\n// oxlint-disable-next-line complexity\nconst formatCommitSubject = (options, answers) => {\n const format = FORMAT[options?.format];\n\n // @note(ccommit) two spaces after emoji\n const emoji = answers?.gitmoji ? `${answers?.gitmoji} ` : \"\";\n\n let scope = answers?.scope\n ? `(${answers?.scope.replace(/ {2}/g, \"--\").replace(/ /g, \"-\").toLowerCase().trim()})`\n : \"\";\n // @note(ccommit) only add space to scope if format is: gitmoji\n scope = scope && options?.format === COMMIT_FORMATS.GITMOJI ? `${scope} ` : scope;\n\n /**\n * @todo(ccommit) breaking identification in commit subject\n */\n // const breaking = answers?.breaking\n // ? options?.format === COMMIT_FORMATS.GITMOJI\n // ? `๐ฅ `\n // : '!'\n // : ''\n\n return format\n .replace(/\\{emoji\\}/g, emoji)\n .replace(/\\{scope\\}/g, scope)\n .replace(/\\{breaking\\}/g, \"\")\n .replace(/\\{title\\}/g, answers?.title)\n .replace(/\\{type\\}/g, answers?.type);\n};\n\nexport { formatCliEmoji, formatCliType, formatCliTypes, formatCommitSubject };\n","import colors from \"ansi-colors\";\n\nimport { LOGS } from \"../lib/index.ts\";\n\ntype GenerateLog = (type: string, message: string, replace?: string) => void;\n/**\n * @todo(ccommit) this is a bit much, can we reduce?\n */\nconst generateLog: GenerateLog = (type, message, replace) => {\n let msg = replace ? message.replace(/\\{REPLACE\\}/g, replace) : message;\n msg = `\\n${msg}\\n`;\n\n if (type === LOGS.TYPES.ERROR) {\n return colors.magenta.bold(msg);\n }\n if (type === LOGS.TYPES.INFO) {\n return colors.blue.bold(msg);\n }\n if (type === LOGS.TYPES.WARNING) {\n return colors.yellow.bold(msg);\n }\n return colors.green.bold(msg);\n};\n\nconst generateCount: GenerateLog = (type, message, replace) => {\n const msg = replace ? message.replace(/\\{REPLACE\\}/g, replace) : message;\n\n if (type === LOGS.TYPES.ERROR) {\n return colors.red.bold(msg);\n }\n if (type === LOGS.TYPES.INFO) {\n return colors.white.bold(msg);\n }\n if (type === LOGS.TYPES.WARNING) {\n return colors.yellow.bold(msg);\n }\n return colors.green.bold(msg);\n};\n\nexport { generateCount, generateLog };\n","import { LOGS, TITLE } from \"../lib/index.ts\";\nimport { generateCount } from \"./index.ts\";\n\nconst getCharsLeft = (str: string) => {\n const chars = str.length;\n const message = chars.toString();\n let logType = LOGS.TYPES.SUCCESS;\n\n if (chars < TITLE.MIN || chars > TITLE.MAX) {\n logType = LOGS.TYPES.ERROR;\n } else if (chars < TITLE.MIN_SWAG || chars > TITLE.MAX_SWAG) {\n logType = LOGS.TYPES.WARNING;\n }\n return generateCount(logType, LOGS.MESSAGES.REPLACE, message);\n};\n\nexport { getCharsLeft };\n","import { execSync } from \"node:child_process\";\n\nconst getGitRootDir = () => {\n const devNull = process.platform === \"win32\" ? \" nul\" : \"/dev/null\";\n const dir = execSync(\"git rev-parse --show-toplevel 2>\" + devNull)\n .toString()\n .trim();\n\n return dir;\n};\n\nexport { getGitRootDir };\n","import { execSync } from \"node:child_process\";\n\nconst getIssueTracker = () => {\n let branch: any,\n init = \"\";\n\n // branch = 'ABC-123'\n branch = execSync(\"git rev-parse --abbrev-ref HEAD\");\n branch = branch.toString().trim().split(\"/\");\n const branchType = branch[0];\n const branchName = !branch[1] ? branchType : branch[1];\n\n const it = branchName.split(\"-\");\n const itProject = it[0];\n const itNumber = !it[1] ? itProject : it[1];\n const itTicket = `${itProject}-${itNumber}`;\n\n if (!isNaN(parseFloat(itNumber)) && isFinite(parseFloat(itNumber))) {\n init = itTicket;\n }\n return init;\n};\n\nexport { getIssueTracker };\n","import { execSync } from \"node:child_process\";\n\nconst getStagedFiles = () => {\n const stagedFiles = execSync(\"git diff --name-only --staged\").toString().trim();\n\n return !!stagedFiles;\n};\n\nexport { getStagedFiles };\n","import colors from \"ansi-colors\";\n\nconst printDryRun = (v) => {\n console.log(colors.magenta.bold(`โฏ dry-run mode: ${v}\\n`));\n};\n\nexport { printDryRun };\n","/*!\n * reference: https://github.com/carloscuesta/gitmoji-cli\n */\nimport process from \"node:process\";\n\nimport colors from \"ansi-colors\";\n\nconst registerHookInterruptionHandler = () => {\n // Allow to interrupt the hook without cancelling the commit\n process.on(\"SIGINT\", () => {\n console.log(colors.magenta.bold(\"โฏ [ccommit] interrupted\"));\n process.exit(0);\n });\n};\n\nexport { registerHookInterruptionHandler };\n","import colors from \"ansi-colors\";\n\nimport commitTypes from \"../../data/types.ts\";\nimport { SCOPE, TITLE } from \"../../lib/index.ts\";\nimport { formatCliEmoji, formatCliType, getCharsLeft, getIssueTracker } from \"../../utils/index.ts\";\n\nconst getTypes = () =>\n commitTypes.map(({ description, emoji, emojiLength, type }) => ({\n description,\n emoji,\n emojiLength,\n type,\n }));\n\nconst characterCount = (input, max) => {\n const count = getCharsLeft(input);\n const countMessage = `Character Count (${count}/${max})`;\n return `${colors.dim.cyan(`โบ`)} ${colors.dim.bold(countMessage)}`;\n};\n\nconst prefixState = (state) => {\n return state.submitted\n ? state.cancelled\n ? colors.magenta(\"โ\")\n : colors.green(\"โ\")\n : colors.cyan(\"?\");\n};\n\n/**\n * @note(enquirier) 3.x will \"fix\" skip passing answers for now\n * you can access \"this\" state by __not__ using arrow functions\n */\nconst questions = [\n {\n default: \"(y/N)\",\n format(input) {\n const yn = input ? \"yes\" : \"no\";\n // @ts-ignore\n return this.state.submitted ? colors.green(yn) : colors.dim(yn);\n },\n initial: false,\n message: \"Is there a breaking change?\",\n name: \"breaking\",\n prefix() {\n // @ts-ignore\n return prefixState(this.state);\n },\n styles: { primary: colors.white },\n type: \"confirm\",\n },\n {\n footer() {\n // @ts-ignore\n return characterCount(this.state.input, TITLE.MAX);\n },\n message: \"Please share breaking change info\",\n name: \"messageBreaking\",\n result(value) {\n return value ? `BREAKING CHANGE: ${value.trim()}` : \"\";\n },\n skip() {\n // @ts-ignore\n return !this.state.answers.breaking;\n },\n type: \"input\",\n validate(input) {\n const chars = input?.length || 0;\n // @ts-ignore\n if (!this.state.answers.breaking) {\n return true;\n } else if (chars < 15) {\n return `Must have at least 15 characters`;\n } else if (chars > TITLE.MAX) {\n return `Cannot exceed ${TITLE.MAX} characters`;\n } else {\n return true;\n }\n },\n },\n {\n choices: getTypes().map(({ description, emoji, emojiLength, type }) => {\n const value = emoji;\n const name = ` ${formatCliEmoji({\n emoji,\n emojiLength,\n })} ${formatCliType(type)} ${description}`;\n return {\n name,\n value,\n };\n }),\n footer() {\n return `${colors.dim.cyan(`โบ`)} ${colors.dim.bold(`scroll up and down to reveal more โ`)}`;\n },\n highlight(str) {\n return colors.cyanBright(str);\n },\n limit: 18,\n message: \"Please choose a commit type\",\n name: \"gitmoji\",\n type: \"autocomplete\",\n },\n {\n footer() {\n // @ts-ignore\n return characterCount(this.state.input, SCOPE.MAX);\n },\n format() {\n // @ts-ignore\n return this.state.submitted ? colors.green(this.value) : this.value;\n },\n message: \"Please share the scope (if any)\",\n name: \"scope\",\n type: \"input\",\n validate(input) {\n const chars = input.length;\n if (chars === 0) {\n return true;\n } else if (chars < SCOPE.MIN) {\n return `Must have at least ${SCOPE.MIN} characters`;\n } else if (chars > SCOPE.MAX) {\n return `Cannot exceed ${SCOPE.MAX} characters`;\n } else {\n return true;\n }\n },\n },\n {\n footer() {\n // @ts-ignore\n return characterCount(this.state.input, TITLE.MAX);\n },\n hint() {\n // @ts-ignore\n return this.state.initial ? `โฆ tab to use initial value` : \"\";\n },\n initial: getIssueTracker() ? `${getIssueTracker()} ` : \"\",\n message: \"Please enter the commit title\",\n name: \"title\",\n type: \"input\",\n validate(input) {\n const chars = input.length;\n if (chars < TITLE.MIN) {\n return `Must have at least ${TITLE.MIN} characters`;\n } else if (chars > TITLE.MAX) {\n return `Cannot exceed ${TITLE.MAX} characters`;\n } else {\n return true;\n }\n },\n },\n {\n footer() {\n return `${colors.dim.cyan(`โบ`)} ${colors.dim(\"Return twice to submit/skip: โฎ โฎ\")}`;\n },\n message: \"Please share a more detailed commit message (if applicable)\",\n multiline: true,\n name: \"message\",\n result(input) {\n return input === \"\\n\" ? \"\" : input;\n },\n type: \"input\",\n },\n];\n\nexport default questions;\n","import process from \"node:process\";\n\nimport { execa } from \"execa\";\n\nimport { LOGS } from \"../../lib/index.ts\";\nimport { generateLog, printDryRun } from \"../../utils/index.ts\";\n\nconst withClient = async (answers, options) => {\n try {\n const title = answers?.subject;\n const message = answers?.message;\n const messageBreaking = answers?.messageBreaking;\n\n const commitArray = [\"commit\", \"-m\", title];\n if (message) commitArray.push(\"-m\", message);\n if (messageBreaking) commitArray.push(\"-m\", messageBreaking);\n\n if (options?.dryrun) {\n printDryRun([\"git\", ...commitArray].join(\" \"));\n } else {\n await execa(\"git\", commitArray, {\n buffer: false,\n // env: { HUSKY: '0' },\n stdio: \"inherit\",\n });\n }\n } catch (error: any) {\n console.error(generateLog(LOGS.TYPES.ERROR, LOGS.MESSAGES.COMMIT_FAIL, error.escapedCommand));\n process.exit(1);\n }\n};\n\nexport default withClient;\n","import fs from \"node:fs\";\nimport { join } from \"node:path\";\nimport process from \"node:process\";\n\nimport { getGitRootDir, printDryRun } from \"../../utils/index.ts\";\n\nconst commitMsgFile = join(getGitRootDir(), \".git\", \"COMMIT_EDITMSG\");\n\n// oxlint-disable-next-line complexity\nconst withHook = (answers, options) => {\n try {\n let commitMessage = answers?.subject;\n if (answers?.message && answers?.message !== \"\\n\") {\n commitMessage += `\\n\\n${answers.message}`;\n }\n if (answers?.messageBreaking && answers?.messageBreaking !== \"\\n\") {\n commitMessage += `\\n\\n${answers.messageBreaking}`;\n }\n\n if (options?.dryrun) {\n printDryRun(commitMessage);\n } else {\n fs.writeFileSync(commitMsgFile, commitMessage);\n }\n } catch (error) {\n console.error(error);\n process.exit(1);\n } finally {\n process.exit(0);\n }\n};\n\nexport default withHook;\n","import process from \"node:process\";\n\nimport enquirer from \"enquirer\";\n\nimport { COMMIT_MODES, FIND_BY, LOGS } from \"../../lib/index.ts\";\nimport {\n cancelIfNeeded,\n findBy,\n formatCommitSubject,\n generateLog,\n registerHookInterruptionHandler,\n} from \"../../utils/index.ts\";\nimport questions from \"./questions.ts\";\nimport withClient from \"./with-client.ts\";\nimport withHook from \"./with-hook.ts\";\n\nconst { prompt } = enquirer;\n\nexport type CommitOptions = {\n message?: string;\n mode: typeof COMMIT_MODES.CLIENT;\n // mode: typeof COMMIT_MODES.CLIENT | typeof COMMIT_MODES.HOOK\n scope?: string;\n skip: boolean;\n title?: string;\n};\n\n/**\n * @todo(ccommit) this is a hacky way to bypass the generator :X\n */\nconst promptAndCommit = async (options: CommitOptions) => {\n let data: any = {};\n\n if (options.skip) {\n data = options;\n // @note(ccommit) very type is an actual type\n data.gitmoji = findBy(data.type, FIND_BY.TYPE, FIND_BY.EMOJI);\n if (!data.gitmoji) {\n console.log(generateLog(LOGS.TYPES.ERROR, LOGS.MESSAGES.TYPE_INCORRECT, data.type));\n process.exit(2);\n }\n } else {\n // @ts-ignore\n await prompt(questions)\n .then((answers: any) => {\n answers.type = findBy(answers.gitmoji, FIND_BY.EMOJI, FIND_BY.TYPE);\n return answers;\n })\n .then((answers) => {\n data = answers;\n })\n .catch(console.error);\n }\n\n // oxlint-disable-next-line no-extra-boolean-cast\n data.subject = !!data ? formatCommitSubject(options, data) : \"\";\n\n if (options.mode === COMMIT_MODES.HOOK) {\n return withHook(data, options);\n } else {\n return withClient(data, options);\n }\n};\nconst commit = (options: CommitOptions) => {\n if (options.mode === COMMIT_MODES.HOOK) {\n registerHookInterruptionHandler();\n return cancelIfNeeded().then(() => promptAndCommit(options));\n }\n return promptAndCommit(options);\n};\n\nexport default commit;\n","import commit from \"./commit.ts\";\n\nexport default commit;\n","import commitTypes from \"../../data/types.ts\";\nimport { formatCliTypes } from \"../../utils/index.ts\";\n\nconst list = () => formatCliTypes(commitTypes);\n\nexport default list;\n","import list from \"./list.ts\";\n\nexport default list;\n","#!/usr/bin/env node\n\n/*!\n * For license information please see index.js.LICENSE.txt\n */\nimport meow from \"meow\";\n\nimport { commit, list } from \"./commands/index.ts\";\nimport { COMMANDS, COMMIT_FORMATS, FLAGS, OPTIONS } from \"./lib/index.ts\";\nimport { findCommand } from \"./utils/index.ts\";\n\nconst cli = meow(\n `\n Usage\n $ ccommit -c\n\n Flags\n --${FLAGS.BREAKING}, -b ๐ฅ Breaking Change\n --${FLAGS.COMMIT}, -c ๐ฝ Mode: Client\n --${FLAGS.DRYRUN}, -n ๐ฝ Mode: Dry Run\n --${FLAGS.EMOJI}, -e ๐ Emoji (default)\n --${FLAGS.HOOK}, -u ๐ช Mode: Hook\n --${FLAGS.LIST}, -l ๐ List all types\n --${FLAGS.VERSION}, -v ๐ฆ Print installed version\n\n Options\n --${OPTIONS.FORMAT} ๐ Commit Format: conventional|gitmoji (default)\n --${OPTIONS.MESSAGE} ๐ Commit Message\n --${OPTIONS.SCOPE} ๐ฌ Commit Scope\n --${OPTIONS.TITLE} ๐ Commit Title\n --${OPTIONS.TYPE} โจ Commit Type\n\n Notes\n - Pass any non-format options the following will be required: --title, --type\n - If you do not pass any options the Conventional Commit Generator prompt will run\n - Branch Name detection is enabled to pre-populate Issue Tracker information in prompt\n`,\n {\n flags: {\n // Flags\n [FLAGS.BREAKING]: { default: false, shortFlag: \"b\", type: \"boolean\" },\n [FLAGS.COMMIT]: { shortFlag: \"c\", type: \"boolean\" },\n [FLAGS.DRYRUN]: { shortFlag: \"n\", type: \"boolean\" },\n [FLAGS.EMOJI]: { default: true, shortFlag: \"e\", type: \"boolean\" },\n [FLAGS.HELP]: { shortFlag: \"h\", type: \"boolean\" },\n [FLAGS.HOOK]: { shortFlag: \"u\", type: \"boolean\" },\n [FLAGS.LIST]: { shortFlag: \"l\", type: \"boolean\" },\n [FLAGS.SKIP]: { default: false, type: \"boolean\" },\n [FLAGS.VERSION]: { shortFlag: \"v\", type: \"boolean\" },\n // Options\n [OPTIONS.FORMAT]: { default: COMMIT_FORMATS.GITMOJI, type: \"string\" },\n [OPTIONS.MESSAGE]: { type: \"string\" },\n [OPTIONS.SCOPE]: { type: \"string\" },\n [OPTIONS.TITLE]: { type: \"string\" },\n [OPTIONS.TYPE]: { type: \"string\" },\n },\n importMeta: import.meta,\n },\n);\n\nconst commands = {\n [COMMANDS.COMMIT]: (options: any) => commit(options),\n [COMMANDS.HOOK]: (options: any) => commit(options),\n [COMMANDS.LIST]: () => list(),\n};\n\nfindCommand(cli, commands);\n"],"mappings":";uOAAA,MAAM,EAAW,CACf,OAAQ,SACR,KAAM,OACN,KAAM,MACR,EACM,EAAiB,CACrB,aAAc,eACd,sBAAuB,wBACvB,QAAS,SACX,EAEM,EAAe,CACnB,OAAQ,SACR,KAAM,MACR,EAEM,EAAU,CACd,MAAO,QACP,KAAM,MACR,EAEM,EAAQ,OAAO,OAAO,CAC1B,SAAU,WACV,OAAQ,SACR,OAAQ,SACR,MAAO,QACP,KAAM,OACN,KAAM,OACN,KAAM,OACN,KAAM,OACN,QAAS,SACX,CAAC,EAEK,EAAS,EACZ,EAAe,cAAe,2CAC9B,EAAe,uBAAwB,oCACvC,EAAe,SAAU,iCAC5B,EAEM,EAAO,CACX,SAAU,CACR,8BAA+B,uDAC/B,YAAa;;;;;;;;MAMb,sBAAuB,sDACvB,cAAe,8DACf,QAAS,YACT,aAAc,0EACd,eAAgB,uDAClB,EACA,MAAO,CACL,MAAO,QACP,KAAM,OACN,QAAS,UACT,QAAS,SACX,CACF,EAEM,EAAU,OAAO,OAAO,CAC5B,OAAQ,SACR,QAAS,UACT,MAAO,QACP,MAAO,QACP,KAAM,MACR,CAAC,EAEK,EAAQ,CACZ,IAAK,GACL,IAAK,CACP,EAEM,EAAS,CACb,MAAO,QACP,MAAO,QACP,KAAM,OACN,MAAO,OACT,EAEM,EAAQ,CACZ,IAAK,GACL,SAAU,GACV,IAAK,EACL,SAAU,EACZ,EAEM,EAAO,CACX,IAAK,EACP,ECnFM,MACJ,EAAM,MAAO,CAAC,YAAa,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAE,OAAQ,KAAmB;;;;CAIjF,EAAG,WAAW,EAAe,eAAe,GAC5C,EAAG,WAAW,EAAe,eAAe,IAE5C,EAAQ,KAAK,CAAC,CAElB,CAAC,EAIG,MACJ,IAAI,QAAe,GAAY,CAM7B,IAAM,EAA8BA,EAAQ,KAAA,GAE1C,IACC,EAAoB,WAAW,QAAQ,GAAK,EAAoB,WAAW,OAAO,IAEnF,EAAQ,KAAK,CAAC,EAEhB,EAAQ,CACV,CAAC,EAGG,MAAsC,EAAiB,CAAC,CAAC,KAAK,CAAgB,ECpC9E,EAAQ,CACZ,CACE,KAAM,eACN,YAAa,wBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,6BACN,YAAa,wCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,WACR,EACA,CACE,KAAM,UACN,YAAa,2CACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,WACR,EACA,CACE,KAAM,0BACN,YAAa,6BACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,MACR,EACA,CACE,KAAM,UACN,YAAa,uBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,UACN,YAAa,0BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,WACR,EACA,CACE,KAAM,UACN,YAAa,uBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,MACR,EACA,CACE,KAAM,SACN,YAAa,6BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,UACR,EACA,CACE,KAAM,WACN,YAAa,oCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,OACR,EACA,CACE,KAAM,aACN,YAAa,eACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,OACR,EACA,CACE,KAAM,kBACN,YAAa,8CACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,OACR,EACA,CACE,KAAM,wBACN,YAAa,gCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,IACR,EACA,CACE,KAAM,gBACN,YAAa,6CACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,OACR,EACA,CACE,KAAM,UACN,YAAa,0CACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,WACN,YAAa,8DACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,aACR,EACA,CACE,KAAM,WACN,YAAa,oCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,wBACN,YAAa,+BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,aACR,EACA,CACE,KAAM,iBACN,YAAa,8BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,MACR,EACA,CACE,KAAM,kBACN,YAAa,mCACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,IACR,EACA,CACE,KAAM,oBACN,YAAa,mBACb,MAAO,IACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,SACR,EACA,CACE,KAAM,qBACN,YAAa,sBACb,MAAO,IACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,YACN,YAAa,2CACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,WACN,YAAa,eACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,QACR,EACA,CACE,KAAM,SACN,YAAa,wCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,WACR,EACA,CACE,KAAM,SACN,YAAa,8BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,MACR,EACA,CACE,KAAM,eACN,YAAa,yBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,WACR,EACA,CACE,KAAM,iBACN,YAAa,+BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,IACR,EACA,CACE,KAAM,QACN,YAAa,8BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,KACR,EACA,CACE,KAAM,YACN,YAAa,sBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,YACR,EACA,CACE,KAAM,aACN,YAAa,yBACb,MAAO,IACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,MACR,EACA,CACE,KAAM,QACN,YAAa,YACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,KACR,EACA,CACE,KAAM,gBACN,YAAa,eACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,QACR,EACA,CACE,KAAM,4BACN,YAAa,qCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,OACR,EACA,CACE,KAAM,gBACN,YAAa,4BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,aACR,EACA,CACE,KAAM,cACN,YAAa,kBACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,yBACN,YAAa,wCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,MACR,EACA,CACE,KAAM,gBACN,YAAa,kCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,QACR,EACA,CACE,KAAM,WACN,YAAa,iCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,KACR,EACA,CACE,KAAM,SACN,YAAa,kBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,MACR,EACA,CACE,KAAM,WACN,YAAa,4BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,mBACN,YAAa,wBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,SACR,EACA,CACE,KAAM,mBACN,YAAa,iCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,MACR,EACA,CACE,KAAM,eACN,YAAa,qBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,SACR,EACA,CACE,KAAM,SACN,YAAa,cACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,QACR,EACA,CACE,KAAM,YACN,YAAa,+BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,OACR,EACA,CACE,KAAM,8BACN,YAAa,iBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,OACR,EACA,CACE,KAAM,eACN,YAAa,cACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,MACR,EACA,CACE,KAAM,UACN,YAAa,sDACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,IACR,EACA,CACE,KAAM,aACN,YAAa,0BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,SACR,EACA,CACE,KAAM,qBACN,YAAa,sCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,OACR,EACA,CACE,KAAM,QACN,YAAa,sBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,MACR,EACA,CACE,KAAM,SACN,YAAa,2CACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,KACR,EACA,CACE,KAAM,SACN,YAAa,uBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,OACR,EACA,CACE,KAAM,YACN,YAAa,wCACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,SACR,EACA,CACE,KAAM,YACN,YAAa,gBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,UACR,EACA,CACE,KAAM,aACN,YAAa,yBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,SACR,EACA,CACE,KAAM,WACN,YAAa,iBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,QACR,EACA,CACE,KAAM,WACN,YAAa,mBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,KACR,EACA,CACE,KAAM,qBACN,YAAa,8DACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,OACR,EACA,CACE,KAAM,iBACN,YAAa,6BACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,aACR,EACA,CACE,KAAM,WACN,YAAa,wDACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,WACR,EACA,CACE,KAAM,yBACN,YAAa,wBACb,MAAO,KACP,YAAa,EACb,OAAQ,EAAO,KACf,KAAM,SACR,EACA,CACE,KAAM,SACN,YAAa,sBACb,MAAO,MACP,YAAa,EACb,OAAQ,EAAO,MACf,KAAM,UACR,EACA,CACE,KAAM,aACN,YAAa,2BACb,MAAO,KACP,YAAa,EACb,O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