From 7726676e00d46cc55d7b26e5f3b13f6e38659e1f Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 19 Dec 2023 20:16:30 +0300 Subject: [PATCH] init --- .gitignore | 3 + bun.lockb | Bin 0 -> 129957 bytes package.json | 72 + ts_src/hd/base.ts | 23 + ts_src/hd/common.ts | 17 + ts_src/hd/index.ts | 17 + ts_src/hd/private.ts | 283 ++++ ts_src/hd/simple.ts | 117 ++ ts_src/hd/types.ts | 71 + ts_src/hd/words/chinese-simplified.ts | 2050 ++++++++++++++++++++++++ ts_src/hd/words/chinese-traditional.ts | 2050 ++++++++++++++++++++++++ ts_src/hd/words/english.ts | 2050 ++++++++++++++++++++++++ ts_src/hd/words/french.ts | 2050 ++++++++++++++++++++++++ ts_src/hd/words/index.ts | 37 + ts_src/hd/words/italian.ts | 2050 ++++++++++++++++++++++++ ts_src/hd/words/japanese.ts | 2050 ++++++++++++++++++++++++ ts_src/hd/words/spanish.ts | 2050 ++++++++++++++++++++++++ ts_src/index.ts | 1 + ts_src/protocol/consensus.ts | 107 ++ ts_src/protocol/network.ts | 173 ++ ts_src/protocol/networks.ts | 74 + ts_src/protocol/policy.ts | 64 + ts_src/protocol/timedelta.ts | 80 + ts_src/protocol/types.ts | 37 + ts_src/utils/binary.ts | 69 + ts_src/utils/util.ts | 90 ++ tsconfig.json | 17 + 27 files changed, 15702 insertions(+) create mode 100644 .gitignore create mode 100755 bun.lockb create mode 100644 package.json create mode 100644 ts_src/hd/base.ts create mode 100644 ts_src/hd/common.ts create mode 100644 ts_src/hd/index.ts create mode 100644 ts_src/hd/private.ts create mode 100644 ts_src/hd/simple.ts create mode 100644 ts_src/hd/types.ts create mode 100644 ts_src/hd/words/chinese-simplified.ts create mode 100644 ts_src/hd/words/chinese-traditional.ts create mode 100644 ts_src/hd/words/english.ts create mode 100644 ts_src/hd/words/french.ts create mode 100644 ts_src/hd/words/index.ts create mode 100644 ts_src/hd/words/italian.ts create mode 100644 ts_src/hd/words/japanese.ts create mode 100644 ts_src/hd/words/spanish.ts create mode 100644 ts_src/index.ts create mode 100644 ts_src/protocol/consensus.ts create mode 100644 ts_src/protocol/network.ts create mode 100644 ts_src/protocol/networks.ts create mode 100644 ts_src/protocol/policy.ts create mode 100644 ts_src/protocol/timedelta.ts create mode 100644 ts_src/protocol/types.ts create mode 100644 ts_src/utils/binary.ts create mode 100644 ts_src/utils/util.ts create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d639844 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +src +package-lock.json \ No newline at end of file diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..33a8aae41b7e4e7f7062639e8ec3ea373124edb8 GIT binary patch literal 129957 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 literal 0 HcmV?d00001 diff --git a/package.json b/package.json new file mode 100644 index 0000000..bffcb94 --- /dev/null +++ b/package.json @@ -0,0 +1,72 @@ +{ + "name": "bellhdw", + "version": "0.2.1", + "description": "Client-side Bitcoin JavaScript library", + "main": "./src/index.js", + "types": "./src/index.d.ts", + "scripts": { + "audit": "better-npm-audit audit -l high", + "build": "npm run clean && tsc -p ./tsconfig.json && npm run formatjs", + "build:tests": "npm run clean:jstests && tsc -p ./tests/tsconfig.json", + "clean": "rimraf src", + "clean:jstests": "rimraf 'tests/**/!(ts-node-register)*.js'", + "coverage-report": "npm run build && npm run nobuild:coverage-report", + "coverage-html": "npm run build && npm run nobuild:coverage-html", + "coverage": "npm run build && npm run nobuild:coverage", + "format": "npm run prettier -- --write", + "formatjs": "npm run prettierjs -- --write", + "format:ci": "npm run prettier -- --check && npm run prettierjs -- --check", + "gitdiff:ci": "npm run build && git diff --exit-code", + "integration": "npm run build && npm run nobuild:integration", + "lint": "eslint ts_src/** src/**/*.js", + "lint:tests": "eslint tests/**/*.spec.ts", + "mocha:ts": "mocha --recursive --require tests/ts-node-register", + "nobuild:coverage-report": "nyc report --reporter=lcov", + "nobuild:coverage-html": "nyc report --reporter=html", + "nobuild:coverage": "npm run build:tests && nyc --check-coverage --branches 85 --functions 90 --lines 90 mocha && npm run clean:jstests", + "nobuild:integration": "npm run mocha:ts -- --timeout 50000 'tests/integration/*.ts'", + "test": "npm run mocha:ts -- 'tests/*.ts'", + "prettier": "prettier \"ts_src/**/*.ts\" \"tests/**/*.ts\" --ignore-path ./.prettierignore", + "prettierjs": "prettier \"src/**/*.js\" --ignore-path ./.prettierignore" + }, + "repository": { + "type": "git" + }, + "files": [ + "src" + ], + "dependencies": { + "@noble/hashes": "^1.3.2", + "@types/bitcore-lib": "^0.15.6", + "@types/hdkey": "^2.0.3", + "belcoinjs-lib": "^0.0.3", + "bells-secp256k1": "^0.0.5", + "belpair": "^0.0.3", + "bip39": "^3.1.0", + "bitcore-lib": "^10.0.21", + "bn.js": "^5.2.1", + "hdkey": "^2.1.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.1", + "@types/bs58": "^4.0.0", + "@types/bs58check": "^2.1.0", + "@types/chai": "^4.3.6", + "@types/mocha": "^5.2.7", + "@types/node": "^20.5.9", + "@types/proxyquire": "^1.3.28", + "@types/randombytes": "^2.0.0", + "@typescript-eslint/eslint-plugin": "^5.45.0", + "@typescript-eslint/parser": "^5.45.0", + "better-npm-audit": "^3.7.3", + "chai": "^4.3.8", + "mocha": "^10.0.0", + "nyc": "^15.1.0", + "prettier": "^2.8.0", + "randombytes": "^2.1.0", + "rimraf": "^2.6.3", + "ts-node": "^8.3.0", + "typescript": "^4.4.4" + }, + "license": "MIT" +} \ No newline at end of file diff --git a/ts_src/hd/base.ts b/ts_src/hd/base.ts new file mode 100644 index 0000000..3ebbef8 --- /dev/null +++ b/ts_src/hd/base.ts @@ -0,0 +1,23 @@ +import { payments } from "belcoinjs-lib"; +import { AddressType } from "./types"; + +export class BaseWallet { + addressType?: AddressType; + + getAddress(publicKey: Uint8Array) { + if (this.addressType === undefined) + throw new Error("addressType of keyring is not specified"); + switch (this.addressType) { + case AddressType.P2WPKH: + return payments.p2wpkh({ pubkey: Buffer.from(publicKey) }).address; + case AddressType.P2SH_P2WPKH: + return payments.p2sh({ + redeem: payments.p2wpkh({ pubkey: Buffer.from(publicKey) }), + }).address; + case AddressType.P2PKH as any: + return payments.p2pkh({ pubkey: Buffer.from(publicKey) }).address; + default: + throw new Error("Invalid AddressType"); + } + } +} diff --git a/ts_src/hd/common.ts b/ts_src/hd/common.ts new file mode 100644 index 0000000..d611da4 --- /dev/null +++ b/ts_src/hd/common.ts @@ -0,0 +1,17 @@ +import { ripemd160 } from "@noble/hashes/ripemd160"; +import { PRIVKEY_SIZE, PUBKEY_SIZE } from "../protocol/policy"; +import { sha256 } from "@noble/hashes/sha256"; +import { utf8ToBytes } from "@noble/hashes/utils"; + +export const MIN_ENTROPY: number = 128; +export const MAX_ENTROPY: number = 512; +export const ZERO_KEY = Buffer.allocUnsafe(PUBKEY_SIZE); +export const ZERO_PRIVKEY = Buffer.allocUnsafe(PRIVKEY_SIZE); +export const SEED_SALT = utf8ToBytes("Tidecoin seed"); + +export const hash160 = (value: string | Uint8Array) => ripemd160(sha256(value)); +export const hash256 = (value: string | Uint8Array) => sha256(sha256(value)); +export const assert = (exp: boolean | number, message?: string) => { + if (exp) return true; + throw new Error(message); +}; diff --git a/ts_src/hd/index.ts b/ts_src/hd/index.ts new file mode 100644 index 0000000..67b06eb --- /dev/null +++ b/ts_src/hd/index.ts @@ -0,0 +1,17 @@ +import HDPrivateKey from "./private"; +import SimpleKey from "./simple"; +import { AddressType, Keyring } from "./types"; + + +export async function fromMnemonic(mnemonic: string): Promise { + return await HDPrivateKey.fromMnemonic(mnemonic); +} + +export function fromPrivateKey(privateKey: Uint8Array): SimpleKey { + return new SimpleKey(privateKey); +} + +export { HDPrivateKey, SimpleKey }; +export * as types from "./types"; +export { default as englishWords } from "./words/english"; +export { AddressType, Keyring }; diff --git a/ts_src/hd/private.ts b/ts_src/hd/private.ts new file mode 100644 index 0000000..2dd5ac7 --- /dev/null +++ b/ts_src/hd/private.ts @@ -0,0 +1,283 @@ +import { + bytesToHex as toHex, + hexToBytes as fromHex, +} from "@noble/hashes/utils"; +import { ZERO_KEY, ZERO_PRIVKEY } from "./common"; +import { + Keyring, + PrivateKeyOptions, + SerializedHDKey, + Hex, + ToSignInput, +} from "./types"; +import { BaseWallet } from "./base"; +import * as tinysecp from "bells-secp256k1"; +import bitcore from "bitcore-lib"; +import { mnemonicToSeed } from "bip39"; +// @ts-ignore +import HDNode, * as hdkey from "hdkey"; +import ECPairFactory, { ECPairInterface } from "belpair"; +import { Psbt, networks } from "belcoinjs-lib"; + +const ECPair = ECPairFactory(tinysecp); + +const hdPathString = "m/44'/0'/0'/0"; + +class HDPrivateKey extends BaseWallet implements Keyring { + childIndex: number = 0; + privateKey: Buffer = ZERO_PRIVKEY; + publicKey = ZERO_KEY; + wallets: ECPairInterface[] = []; + + private seed?: Uint8Array; + private _index2wallet: Record = {}; + private hdWallet?: HDNode; + private root?: HDNode; + private hdPath: string = hdPathString; + + constructor(options?: PrivateKeyOptions) { + super(); + if (options) this.fromOptions(options); + } + + changeHdPath(hdPath: string) { + this.hdPath = hdPath; + + this.root = this.hdWallet?.derive(this.hdPath) as any; + + this._index2wallet = {}; + this.wallets = []; + } + + signTypedData(address: string, typedData: Record) { + return this.signMessage(address, JSON.stringify(typedData)); + } + + exportPublicKey(address: string) { + const account = this.findAccount(address); + return account.publicKey.toString('hex'); + } + + verifyMessage(address: string, text: string, sig: string) { + const message = new bitcore.Message(text); + const isVerified = message.verify(address, sig); + return isVerified; + } + + getAccounts() { + const accounts = this.wallets.map((w) => { + return this.getAddress(w.publicKey)!; + }); + return [this.getAddress(this.publicKey!)!, ...accounts] + } + + addAccounts(number: number = 1) { + let count = number; + let currentIdx = this.wallets.length === 0 ? 1 : this.wallets.length; + const newAddresses: string[] = []; + + + while (count) { + const [address, wallet] = this._addressFromIndex(currentIdx); + if (this.wallets.includes(wallet)) { + currentIdx++; + } else { + this.wallets.push(wallet); + newAddresses.push(address); + count--; + } + } + + return newAddresses; + } + + private findAccount(account: Hex): ECPairInterface { + const foundAccount = this.wallets.find( + (f) => this.getAddress(f.publicKey) === account + ); + if (foundAccount !== undefined) { + return foundAccount; + } + throw new Error(`HDPrivateKey: Account with address ${account} not founded`); + } + + private findAccountByPk(publicKey: string): ECPairInterface { + const foundAccount = this.wallets.find(f => f.publicKey.toString('hex') === publicKey); + if (foundAccount !== undefined) { + return foundAccount + } + throw new Error(`HDPrivateKey: Account with public key ${publicKey} not founded`); + } + + exportAccount(address: Hex) { + const account = this.findAccount(address); + return account.toWIF(); + } + + signPsbt(psbt: Psbt, inputs: ToSignInput[]) { + let account: ECPairInterface | undefined; + + inputs.map((i) => { + account = this.findAccountByPk(i.publicKey); + psbt.signInput( + i.index, + ECPair.fromPrivateKey(account.privateKey!, { + network: networks.bitcoin, + }), + i.sighashTypes + ); + }); + psbt.finalizeAllInputs(); + } + + signMessage(address: Hex, text: string) { + const keyPair = this._getPrivateKeyFor( + this.wallets + .find((f) => this.getAddress(f.publicKey) === address) + ?.publicKey?.toString("hex") ?? "" + ); + const message = new bitcore.Message(text); + return message.sign( + new bitcore.PrivateKey(keyPair.privateKey?.toString("hex")) + ); + } + + signPersonalMessage(address: Hex, message: Hex) { + return this.signMessage(address, message); + } + + async fromOptions(options: PrivateKeyOptions) { + this.childIndex = 0; + this.seed = fromHex(options.seed); + this.hdWallet = hdkey.fromMasterSeed(Buffer.from(this.seed!)); + this.root = this.hdWallet.derive(this.hdPath) as any; + this.publicKey = this.root!.publicKey; + this.privateKey = this.root!.privateKey; + + return this; + } + + static fromOptions(options: PrivateKeyOptions) { + return new this().fromOptions(options); + } + + fromSeed(seed: Uint8Array) { + this.seed = seed; + this.hdWallet = hdkey.fromMasterSeed(Buffer.from(seed)); + this.root = this.hdWallet.derive(this.hdPath) as any; + + this.privateKey = this.root!.privateKey; + this.publicKey = this.root!.publicKey; + + return this; + } + + static fromSeed(seed: Uint8Array): HDPrivateKey { + return new this().fromSeed(seed); + } + + async fromMnemonic( + mnemonic: string, + passphrase?: string + ): Promise { + this.seed = await mnemonicToSeed(mnemonic, passphrase ?? "bells"); + this.hdWallet = hdkey.fromMasterSeed(Buffer.from(this.seed!)); + this.root = this.hdWallet.derive(this.hdPath) as any; + this.publicKey = this.root!.publicKey; + this.privateKey = this.root!.privateKey; + return this; + } + + static fromMnemonic( + mnemonic: string, + passphrase?: string + ): Promise { + return new this().fromMnemonic(mnemonic, passphrase); + } + + fromPhrase(phrase: string): HDPrivateKey { + this.fromMnemonic(phrase); + return this; + } + + static fromPhrase(phrase: string): HDPrivateKey { + return new this().fromPhrase(phrase); + } + + fromPrivateKey(_key: Uint8Array) { + throw new Error("Method not allowed for HDPrivateKey."); + } + + static fromPrivateKey(key: Uint8Array) { + return new this().fromPrivateKey(key); + } + + private getChildCount(): number { + return this.wallets.length; + } + + serialize() { + if (this.childIndex !== 0) + throw new Error("You should use only root wallet to serializing"); + return { + numberOfAccounts: this.getChildCount(), + seed: toHex(this.seed!), + addressType: this.addressType!, + }; + } + + static deserialize(opts: SerializedHDKey) { + if (opts.numberOfAccounts === undefined || !opts.seed) { + throw new Error( + "HDPrivateKey: Deserialize method cannot be called with an opts value for numberOfAccounts and no seed" + ); + } + + const root = HDPrivateKey.fromSeed(fromHex(opts.seed)); + root.addressType = opts.addressType; + + if (!opts.numberOfAccounts) return root; + + root.addAccounts(opts.numberOfAccounts); + return root; + } + + deserialize(state: SerializedHDKey) { + const deserialized = HDPrivateKey.deserialize(state); + this.fromOptions({ + seed: toHex(deserialized.seed!) + }); + return this; + } + + private _addressFromIndex(i: number): [string, ECPairInterface] { + if (!this._index2wallet[i]) { + const child = (this.root as unknown as bitcore.HDPrivateKey)?.deriveChild(i); + const ecpair = ECPair.fromPrivateKey(Buffer.from((child as any).privateKey)); + const address = this.getAddress(ecpair.publicKey)!; + this._index2wallet[i] = [address, ecpair]; + } + + return this._index2wallet[i]; + } + + private _getPrivateKeyFor(publicKey: string) { + if (!publicKey) { + throw new Error("Must specify publicKey."); + } + const wallet = this._getWalletForAccount(publicKey); + return wallet; + } + + private _getWalletForAccount(publicKey: string) { + let wallet = this.wallets.find( + (wallet) => wallet.publicKey.toString("hex") == publicKey + ); + if (!wallet) { + throw new Error("Simple Keyring - Unable to find matching publicKey."); + } + return wallet; + } +} + +export default HDPrivateKey; diff --git a/ts_src/hd/simple.ts b/ts_src/hd/simple.ts new file mode 100644 index 0000000..ca07832 --- /dev/null +++ b/ts_src/hd/simple.ts @@ -0,0 +1,117 @@ +import { Keyring, SerializedSimpleKey, ToSignInput } from "./types"; +import { ZERO_KEY, ZERO_PRIVKEY } from "./common"; +import { bytesToHex, hexToBytes } from "@noble/hashes/utils"; +import { BaseWallet } from "./base"; +import * as tinysecp from "bells-secp256k1"; +import ECPairFactory, { ECPairInterface } from "belpair"; +import { Psbt } from "belcoinjs-lib"; + +const ECPair = ECPairFactory(tinysecp); + +class HDSimpleKey extends BaseWallet implements Keyring { + privateKey: Uint8Array = ZERO_PRIVKEY; + publicKey = ZERO_KEY; + + private pair?: ECPairInterface; + + constructor(privateKey: Uint8Array) { + super(); + + this.privateKey = privateKey; + } + + private initPair() { + if (!this.privateKey) + throw new Error("Simple Keyring: Invalid privateKey provided"); + if (!this.pair) { + this.pair = ECPair.fromPrivateKey(Buffer.from(this.privateKey)); + this.publicKey = this.pair.publicKey; + } + } + + signTypedData(address: string, typedData: Record) { + this.initPair(); + + return this.signMessage(address, JSON.stringify(typedData)); + } + + verifyMessage(_address: string, text: string, sig: string) { + this.initPair(); + + return this.pair!.verify( + Buffer.from(hexToBytes(text)), + Buffer.from(hexToBytes(sig)) + )!; + } + + getAccounts() { + this.initPair(); + + return [this.getAddress(this.publicKey)!]; + } + + serialize() { + this.initPair(); + + const wif = this.pair?.toWIF(); + if (!wif) throw new Error("Failed to export wif for simple wallet"); + + return { + privateKey: wif, + addressType: this.addressType!, + }; + } + + deserialize(state: SerializedSimpleKey) { + const wallet = HDSimpleKey.deserialize(state); + this.privateKey = wallet.privateKey; + this.pair = wallet.pair; + this.addressType = wallet.addressType; + return this; + } + + static deserialize(state: SerializedSimpleKey) { + const pair = ECPair.fromWIF(state.privateKey); + const wallet = new this(pair.privateKey!); + wallet.initPair(); + wallet.addressType = state.addressType; + return wallet; + } + + exportAccount( + _address: string, + _options?: Record | undefined + ) { + this.initPair(); + + return this.pair!.toWIF(); + } + + exportPublicKey(_address: string) { + this.initPair(); + + return bytesToHex(this.publicKey); + } + + signPsbt(psbt: Psbt, inputs: ToSignInput[]) { + this.initPair(); + + for (let i of inputs) { + psbt.signInput(i.index, this.pair!, i.sighashTypes); + } + psbt.finalizeAllInputs(); + } + + signMessage(_address: string, message: string) { + this.initPair(); + + const encoded = new TextEncoder().encode(message); + return bytesToHex(this.pair!.sign(Buffer.from(encoded))!); + } + + signPersonalMessage(address: string, message: string) { + return this.signMessage(address, message); + } +} + +export default HDSimpleKey; diff --git a/ts_src/hd/types.ts b/ts_src/hd/types.ts new file mode 100644 index 0000000..32e894a --- /dev/null +++ b/ts_src/hd/types.ts @@ -0,0 +1,71 @@ +import { Psbt } from "belcoinjs-lib"; + +export type Base58String = string; + +export interface PrivateKeyOptions { + seed: string; +} + +export interface PublicKeyOptions + extends Omit { + xkey: Base58String; + publicKey: Uint8Array; +} + +interface SerializedBase { + addressType: AddressType; +} + +export interface SerializedHDKey extends SerializedBase { + seed: string; + numberOfAccounts?: number; +} + +export interface SerializedSimpleKey extends SerializedBase { + privateKey: string; +} + +export type Hex = string; + +export interface ToSignInput { + index: number; + publicKey: string; + sighashTypes?: number[]; +} + +export enum AddressType { + P2PKH, + P2WPKH, + P2TR, + P2SH_P2WPKH, + M44_P2WPKH, + M44_P2TR, +} + +export type Keyring = { + addressType?: AddressType; + generate?: (seed: Uint8Array, entropy: Uint8Array) => Keyring; + + getAccounts(): Hex[]; + addAccounts?(number: number): string[]; + serialize(): State; + deserialize(state: State): Keyring; + exportAccount(address: Hex, options?: Record): string; + exportPublicKey(address: Hex): string; + verifyMessage(address: Hex, text: string, sig: string): boolean; + signPsbt(psbt: Psbt, inputs: ToSignInput[]): void; + signMessage(address: Hex, message: Hex, seed: Uint8Array): string; + signPersonalMessage(address: Hex, message: Hex, seed: Uint8Array): string; + signTypedData( + address: Hex, + typedData: Record, + seed: Uint8Array + ): string; +}; + +export const DISALLOWED_CHILD_METHODS: (keyof Keyring)[] = [ + "deserialize", + "serialize", + "getAccounts", + "generate", +]; diff --git a/ts_src/hd/words/chinese-simplified.ts b/ts_src/hd/words/chinese-simplified.ts new file mode 100644 index 0000000..bba70cf --- /dev/null +++ b/ts_src/hd/words/chinese-simplified.ts @@ -0,0 +1,2050 @@ +export default [ + "的", + "一", + "是", + "在", + "不", + "了", + "有", + "和", + "人", + "这", + "中", + "大", + "为", + "上", + "个", + "国", + "我", + "以", + "要", + "他", + "时", + "来", + "用", + "们", + "生", + "到", + "作", + "地", + "于", + "出", + "就", + "分", + "对", + "成", + "会", + "可", + "主", + "发", + "年", + "动", + "同", + "工", + "也", + "能", + "下", + "过", + "子", + "说", + "产", + "种", + "面", + "而", + "方", + "后", + "多", + "定", + "行", + "学", + "法", + "所", + "民", + "得", + "经", + "十", + "三", + "之", + "进", + "着", + "等", + "部", + "度", + "家", + "电", + "力", + "里", + "如", + "水", + "化", + "高", + "自", + "二", + "理", + "起", + "小", + "物", + "现", + "实", + "加", + "量", + "都", + "两", + "体", + "制", + "机", + "当", + "使", + "点", + "从", + "业", + "本", + "去", + "把", + "性", + "好", + "应", + "开", + "它", + "合", + "还", + "因", + "由", + "其", + "些", + "然", + "前", + "外", + "天", + "政", + "四", + "日", + "那", + "社", + "义", + "事", + "平", + "形", + "相", + "全", + "表", + "间", + "样", + "与", + "关", + "各", + "重", + "新", + "线", + "内", + "数", + "正", + "心", + "反", + "你", + "明", + "看", + "原", + "又", + "么", + "利", + "比", + "或", + "但", + "质", + "气", + "第", + "向", + "道", + "命", + "此", + "变", + "条", + "只", + "没", + "结", + "解", + "问", + "意", + "建", + "月", + "公", + "无", + "系", + "军", + "很", + "情", + "者", + "最", + "立", + "代", + "想", + "已", + "通", + "并", + "提", + "直", + "题", + "党", + "程", + "展", + "五", + "果", + "料", + "象", + "员", + "革", + "位", + "入", + "常", + "文", + "总", + "次", + "品", + "式", + "活", + "设", + "及", + "管", + "特", + "件", + "长", + "求", + "老", + "头", + "基", + "资", + "边", + "流", + "路", + "级", + "少", + "图", + "山", + "统", + "接", + "知", + "较", + "将", + "组", + "见", + "计", + "别", + "她", + "手", + "角", + "期", + "根", + "论", + "运", + "农", + "指", + "几", + "九", + "区", + "强", + "放", + "决", + "西", + "被", + "干", + "做", + "必", + "战", + "先", + "回", + "则", + "任", + "取", + "据", + "处", + "队", + "南", + "给", + "色", + "光", + "门", + "即", + "保", + "治", + "北", + "造", + "百", + "规", + "热", + "领", + "七", + "海", + "口", + "东", + "导", + "器", + "压", + "志", + "世", + "金", + "增", + "争", + "济", + "阶", + "油", + "思", + "术", + "极", + "交", + "受", + "联", + "什", + "认", + "六", + "共", + "权", + "收", + "证", + "改", + "清", + "美", + "再", + "采", + "转", + "更", + "单", + "风", + "切", + "打", + "白", + "教", + "速", + "花", + "带", + "安", + "场", + "身", + "车", + "例", + "真", + "务", + "具", + "万", + "每", + "目", + "至", + "达", + "走", + "积", + "示", + "议", + "声", + "报", + "斗", + "完", + "类", + "八", + "离", + "华", + "名", + "确", + "才", + "科", + "张", + "信", + "马", + "节", + "话", + "米", + "整", + "空", + "元", + "况", + "今", + "集", + "温", + "传", + "土", + "许", + "步", + "群", + "广", + "石", + "记", + "需", + "段", + "研", + "界", + "拉", + "林", + "律", + "叫", + "且", + "究", + "观", + "越", + "织", + "装", + "影", + "算", + "低", + "持", + "音", + "众", + "书", + "布", + "复", + "容", + "儿", + "须", + "际", + "商", + "非", + "验", + "连", + "断", + "深", + "难", + "近", + "矿", + "千", + "周", + "委", + "素", + "技", + "备", + "半", + "办", + "青", + "省", + "列", + "习", + "响", + "约", + "支", + "般", + "史", + "感", + "劳", + "便", + "团", + "往", + "酸", + "历", + "市", + "克", + "何", + "除", + "消", + "构", + "府", + "称", + "太", + "准", + "精", + "值", + "号", + "率", + "族", + "维", + "划", + "选", + "标", + "写", + "存", + "候", + "毛", + "亲", + "快", + "效", + "斯", + "院", + "查", + "江", + "型", + "眼", + "王", + "按", + "格", + "养", + "易", + "置", + "派", + "层", + "片", + "始", + "却", + "专", + "状", + "育", + "厂", + "京", + "识", + "适", + "属", + "圆", + "包", + "火", + "住", + "调", + "满", + "县", + "局", + "照", + "参", + "红", + "细", + "引", + "听", + "该", + "铁", + "价", + "严", + "首", + "底", + "液", + "官", + "德", + "随", + "病", + "苏", + "失", + "尔", + "死", + "讲", + "配", + "女", + "黄", + "推", + "显", + "谈", + "罪", + "神", + "艺", + "呢", + "席", + "含", + "企", + "望", + "密", + "批", + "营", + "项", + "防", + "举", + "球", + "英", + "氧", + "势", + "告", + "李", + "台", + "落", + "木", + "帮", + "轮", + "破", + "亚", + "师", + "围", + "注", + "远", + "字", + "材", + "排", + "供", + "河", + "态", + "封", + "另", + "施", + "减", + "树", + "溶", + "怎", + "止", + "案", + "言", + "士", + "均", + "武", + "固", + "叶", + "鱼", + "波", + "视", + "仅", + "费", + "紧", + "爱", + "左", + "章", + "早", + "朝", + "害", + "续", + "轻", + "服", + "试", + "食", + "充", + "兵", + "源", + "判", + "护", + "司", + "足", + "某", + "练", + "差", + "致", + "板", + "田", + "降", + "黑", + "犯", + "负", + "击", + "范", + "继", + "兴", + "似", + "余", + "坚", + "曲", + "输", + "修", + "故", + "城", + "夫", + "够", + "送", + "笔", + "船", + "占", + "右", + "财", + "吃", + "富", + "春", + "职", + "觉", + "汉", + "画", + "功", + "巴", + "跟", + "虽", + "杂", + "飞", + "检", + "吸", + "助", + "升", + "阳", + "互", + "初", + "创", + "抗", + "考", + "投", + "坏", + "策", + "古", + "径", + "换", + "未", + "跑", + "留", + "钢", + "曾", + "端", + "责", + "站", + "简", + "述", + "钱", + "副", + "尽", + "帝", + "射", + "草", + "冲", + "承", + "独", + "令", + "限", + "阿", + "宣", + "环", + "双", + "请", + "超", + "微", + "让", + "控", + "州", + "良", + "轴", + "找", + "否", + "纪", + "益", + "依", + "优", + "顶", + "础", + "载", + "倒", + "房", + "突", + "坐", + "粉", + "敌", + "略", + "客", + "袁", + "冷", + "胜", + "绝", + "析", + "块", + "剂", + "测", + "丝", + "协", + "诉", + "念", + "陈", + "仍", + "罗", + "盐", + "友", + "洋", + "错", + "苦", + "夜", + "刑", + "移", + "频", + "逐", + "靠", + "混", + "母", + "短", + "皮", + "终", + "聚", + "汽", + "村", + "云", + "哪", + "既", + "距", + "卫", + "停", + "烈", + "央", + "察", + "烧", + "迅", + "境", + "若", + "印", + "洲", + "刻", + "括", + "激", + "孔", + "搞", + "甚", + "室", + "待", + "核", + "校", + "散", + "侵", + "吧", + "甲", + "游", + "久", + "菜", + "味", + "旧", + "模", + "湖", + "货", + "损", + "预", + "阻", + "毫", + "普", + "稳", + "乙", + "妈", + "植", + "息", + "扩", + "银", + "语", + "挥", + "酒", + "守", + "拿", + "序", + "纸", + "医", + "缺", + "雨", + "吗", + "针", + "刘", + "啊", + "急", + "唱", + "误", + "训", + "愿", + "审", + "附", + "获", + "茶", + "鲜", + "粮", + "斤", + "孩", + "脱", + "硫", + "肥", + "善", + "龙", + "演", + "父", + "渐", + "血", + "欢", + "械", + "掌", + "歌", + "沙", + "刚", + "攻", + "谓", + "盾", + "讨", + "晚", + "粒", + "乱", + "燃", + "矛", + "乎", + "杀", + "药", + "宁", + "鲁", + "贵", + "钟", + "煤", + "读", + "班", + "伯", + "香", + "介", + "迫", + "句", + "丰", + "培", + "握", + "兰", + "担", + "弦", + "蛋", + "沉", + "假", + "穿", + "执", + "答", + "乐", + "谁", + "顺", + "烟", + "缩", + "征", + "脸", + "喜", + "松", + "脚", + "困", + "异", + "免", + "背", + "星", + "福", + "买", + "染", + "井", + "概", + "慢", + "怕", + "磁", + "倍", + "祖", + "皇", + "促", + "静", + "补", + "评", + "翻", + "肉", + "践", + "尼", + "衣", + "宽", + "扬", + "棉", + "希", + "伤", + "操", + "垂", + "秋", + "宜", + "氢", + "套", + "督", + "振", + "架", + "亮", + "末", + "宪", + "庆", + "编", + "牛", + "触", + "映", + "雷", + "销", + "诗", + "座", + "居", + "抓", + "裂", + "胞", + "呼", + "娘", + "景", + "威", + "绿", + "晶", + "厚", + "盟", + "衡", + "鸡", + "孙", + "延", + "危", + "胶", + "屋", + "乡", + "临", + "陆", + "顾", + "掉", + "呀", + "灯", + "岁", + "措", + "束", + "耐", + "剧", + "玉", + "赵", + "跳", + "哥", + "季", + "课", + "凯", + "胡", + "额", + "款", + "绍", + "卷", + "齐", + "伟", + "蒸", + "殖", + "永", + "宗", + "苗", + "川", + "炉", + "岩", + "弱", + "零", + "杨", + "奏", + "沿", + "露", + "杆", + "探", + "滑", + "镇", + "饭", + "浓", + "航", + "怀", + "赶", + "库", + "夺", + "伊", + "灵", + "税", + "途", + "灭", + "赛", + "归", + "召", + "鼓", + "播", + "盘", + "裁", + "险", + "康", + "唯", + "录", + "菌", + "纯", + "借", + "糖", + "盖", + "横", + "符", + "私", + "努", + "堂", + "域", + "枪", + "润", + "幅", + "哈", + "竟", + "熟", + "虫", + "泽", + "脑", + "壤", + "碳", + "欧", + "遍", + "侧", + "寨", + "敢", + "彻", + "虑", + "斜", + "薄", + "庭", + "纳", + "弹", + "饲", + "伸", + "折", + "麦", + "湿", + "暗", + "荷", + "瓦", + "塞", + "床", + "筑", + "恶", + "户", + "访", + "塔", + "奇", + "透", + "梁", + "刀", + "旋", + "迹", + "卡", + "氯", + "遇", + "份", + "毒", + "泥", + "退", + "洗", + "摆", + "灰", + "彩", + "卖", + "耗", + "夏", + "择", + "忙", + "铜", + "献", + "硬", + "予", + "繁", + "圈", + "雪", + "函", + "亦", + "抽", + "篇", + "阵", + "阴", + "丁", + "尺", + "追", + "堆", + "雄", + "迎", + "泛", + "爸", + "楼", + "避", + "谋", + "吨", + "野", + "猪", + "旗", + "累", + "偏", + "典", + "馆", + "索", + "秦", + "脂", + "潮", + "爷", + "豆", + "忽", + "托", + "惊", + "塑", + "遗", + "愈", + "朱", + "替", + "纤", + "粗", + "倾", + "尚", + "痛", + "楚", + "谢", + "奋", + "购", + "磨", + "君", + "池", + "旁", + "碎", + "骨", + "监", + "捕", + "弟", + "暴", + "割", + "贯", + "殊", + "释", + "词", + "亡", + "壁", + "顿", + "宝", + "午", + "尘", + "闻", + "揭", + "炮", + "残", + "冬", + "桥", + "妇", + "警", + "综", + "招", + "吴", + "付", + "浮", + "遭", + "徐", + "您", + "摇", + "谷", + "赞", + "箱", + "隔", + "订", + "男", + "吹", + "园", + "纷", + "唐", + "败", + "宋", + "玻", + "巨", + "耕", + "坦", + "荣", + "闭", + "湾", + "键", + "凡", + "驻", + "锅", + "救", + "恩", + "剥", + "凝", + "碱", + "齿", + "截", + "炼", + "麻", + "纺", + "禁", + "废", + "盛", + "版", + "缓", + "净", + "睛", + "昌", + "婚", + "涉", + "筒", + "嘴", + "插", + "岸", + "朗", + "庄", + "街", + "藏", + "姑", + "贸", + "腐", + "奴", + "啦", + "惯", + "乘", + "伙", + "恢", + "匀", + "纱", + "扎", + "辩", + "耳", + "彪", + "臣", + "亿", + "璃", + "抵", + "脉", + "秀", + "萨", + "俄", + "网", + "舞", + "店", + "喷", + "纵", + "寸", + "汗", + "挂", + "洪", + "贺", + "闪", + "柬", + "爆", + "烯", + "津", + "稻", + "墙", + "软", + "勇", + "像", + "滚", + "厘", + "蒙", + "芳", + "肯", + "坡", + "柱", + "荡", + "腿", + "仪", + "旅", + "尾", + "轧", + "冰", + "贡", + "登", + "黎", + "削", + "钻", + "勒", + "逃", + "障", + "氨", + "郭", + "峰", + "币", + "港", + "伏", + "轨", + "亩", + "毕", + "擦", + "莫", + "刺", + "浪", + "秘", + "援", + "株", + "健", + "售", + "股", + "岛", + "甘", + "泡", + "睡", + "童", + "铸", + "汤", + "阀", + "休", + "汇", + "舍", + "牧", + "绕", + "炸", + "哲", + "磷", + "绩", + "朋", + "淡", + "尖", + "启", + "陷", + "柴", + "呈", + "徒", + "颜", + "泪", + "稍", + "忘", + "泵", + "蓝", + "拖", + "洞", + "授", + "镜", + "辛", + "壮", + "锋", + "贫", + "虚", + "弯", + "摩", + "泰", + "幼", + "廷", + "尊", + "窗", + "纲", + "弄", + "隶", + "疑", + "氏", + "宫", + "姐", + "震", + "瑞", + "怪", + "尤", + "琴", + "循", + "描", + "膜", + "违", + "夹", + "腰", + "缘", + "珠", + "穷", + "森", + "枝", + "竹", + "沟", + "催", + "绳", + "忆", + "邦", + "剩", + "幸", + "浆", + "栏", + "拥", + "牙", + "贮", + "礼", + "滤", + "钠", + "纹", + "罢", + "拍", + "咱", + "喊", + "袖", + "埃", + "勤", + "罚", + "焦", + "潜", + "伍", + "墨", + "欲", + "缝", + "姓", + "刊", + "饱", + "仿", + "奖", + "铝", + "鬼", + "丽", + "跨", + "默", + "挖", + "链", + "扫", + "喝", + "袋", + "炭", + "污", + "幕", + "诸", + "弧", + "励", + "梅", + "奶", + "洁", + "灾", + "舟", + "鉴", + "苯", + "讼", + "抱", + "毁", + "懂", + "寒", + "智", + "埔", + "寄", + "届", + "跃", + "渡", + "挑", + "丹", + "艰", + "贝", + "碰", + "拔", + "爹", + "戴", + "码", + "梦", + "芽", + "熔", + "赤", + "渔", + "哭", + "敬", + "颗", + "奔", + "铅", + "仲", + "虎", + "稀", + "妹", + "乏", + "珍", + "申", + "桌", + "遵", + "允", + "隆", + "螺", + "仓", + "魏", + "锐", + "晓", + "氮", + "兼", + "隐", + "碍", + "赫", + "拨", + "忠", + "肃", + "缸", + "牵", + "抢", + "博", + "巧", + "壳", + "兄", + "杜", + "讯", + "诚", + "碧", + "祥", + "柯", + "页", + "巡", + "矩", + "悲", + "灌", + "龄", + "伦", + "票", + "寻", + "桂", + "铺", + "圣", + "恐", + "恰", + "郑", + "趣", + "抬", + "荒", + "腾", + "贴", + "柔", + "滴", + "猛", + "阔", + "辆", + "妻", + "填", + "撤", + "储", + "签", + "闹", + "扰", + "紫", + "砂", + "递", + "戏", + "吊", + "陶", + "伐", + "喂", + "疗", + "瓶", + "婆", + "抚", + "臂", + "摸", + "忍", + "虾", + "蜡", + "邻", + "胸", + "巩", + "挤", + "偶", + "弃", + "槽", + "劲", + "乳", + "邓", + "吉", + "仁", + "烂", + "砖", + "租", + "乌", + "舰", + "伴", + "瓜", + "浅", + "丙", + "暂", + "燥", + "橡", + "柳", + "迷", + "暖", + "牌", + "秧", + "胆", + "详", + "簧", + "踏", + "瓷", + "谱", + "呆", + "宾", + "糊", + "洛", + "辉", + "愤", + "竞", + "隙", + "怒", + "粘", + "乃", + "绪", + "肩", + "籍", + "敏", + "涂", + "熙", + "皆", + "侦", + "悬", + "掘", + "享", + "纠", + "醒", + "狂", + "锁", + "淀", + "恨", + "牲", + "霸", + "爬", + "赏", + "逆", + "玩", + "陵", + "祝", + "秒", + "浙", + "貌", + "役", + "彼", + "悉", + "鸭", + "趋", + "凤", + "晨", + "畜", + "辈", + "秩", + "卵", + "署", + "梯", + "炎", + "滩", + "棋", + "驱", + "筛", + "峡", + "冒", + "啥", + "寿", + "译", + "浸", + "泉", + "帽", + "迟", + "硅", + "疆", + "贷", + "漏", + "稿", + "冠", + "嫩", + "胁", + "芯", + "牢", + "叛", + "蚀", + "奥", + "鸣", + "岭", + "羊", + "凭", + "串", + "塘", + "绘", + "酵", + "融", + "盆", + "锡", + "庙", + "筹", + "冻", + "辅", + "摄", + "袭", + "筋", + "拒", + "僚", + "旱", + "钾", + "鸟", + "漆", + "沈", + "眉", + "疏", + "添", + "棒", + "穗", + "硝", + "韩", + "逼", + "扭", + "侨", + "凉", + "挺", + "碗", + "栽", + "炒", + "杯", + "患", + "馏", + "劝", + "豪", + "辽", + "勃", + "鸿", + "旦", + "吏", + "拜", + "狗", + "埋", + "辊", + "掩", + "饮", + "搬", + "骂", + "辞", + "勾", + "扣", + "估", + "蒋", + "绒", + "雾", + "丈", + "朵", + "姆", + "拟", + "宇", + "辑", + "陕", + "雕", + "偿", + "蓄", + "崇", + "剪", + "倡", + "厅", + "咬", + "驶", + "薯", + "刷", + "斥", + "番", + "赋", + "奉", + "佛", + "浇", + "漫", + "曼", + "扇", + "钙", + "桃", + "扶", + "仔", + "返", + "俗", + "亏", + "腔", + "鞋", + "棱", + "覆", + "框", + "悄", + "叔", + "撞", + "骗", + "勘", + "旺", + "沸", + "孤", + "吐", + "孟", + "渠", + "屈", + "疾", + "妙", + "惜", + "仰", + "狠", + "胀", + "谐", + "抛", + "霉", + "桑", + "岗", + "嘛", + "衰", + "盗", + "渗", + "脏", + "赖", + "涌", + "甜", + "曹", + "阅", + "肌", + "哩", + "厉", + "烃", + "纬", + "毅", + "昨", + "伪", + "症", + "煮", + "叹", + "钉", + "搭", + "茎", + "笼", + "酷", + "偷", + "弓", + "锥", + "恒", + "杰", + "坑", + "鼻", + "翼", + "纶", + "叙", + "狱", + "逮", + "罐", + "络", + "棚", + "抑", + "膨", + "蔬", + "寺", + "骤", + "穆", + "冶", + "枯", + "册", + "尸", + "凸", + "绅", + "坯", + "牺", + "焰", + "轰", + "欣", + "晋", + "瘦", + "御", + "锭", + "锦", + "丧", + "旬", + "锻", + "垄", + "搜", + "扑", + "邀", + "亭", + "酯", + "迈", + "舒", + "脆", + "酶", + "闲", + "忧", + "酚", + "顽", + "羽", + "涨", + "卸", + "仗", + "陪", + "辟", + "惩", + "杭", + "姚", + "肚", + "捉", + "飘", + "漂", + "昆", + "欺", + "吾", + "郎", + "烷", + "汁", + "呵", + "饰", + "萧", + "雅", + "邮", + "迁", + "燕", + "撒", + "姻", + "赴", + "宴", + "烦", + "债", + "帐", + "斑", + "铃", + "旨", + "醇", + "董", + "饼", + "雏", + "姿", + "拌", + "傅", + "腹", + "妥", + "揉", + "贤", + "拆", + "歪", + "葡", + "胺", + "丢", + "浩", + "徽", + "昂", + "垫", + "挡", + "览", + "贪", + "慰", + "缴", + "汪", + "慌", + "冯", + "诺", + "姜", + "谊", + "凶", + "劣", + "诬", + "耀", + "昏", + "躺", + "盈", + "骑", + "乔", + "溪", + "丛", + "卢", + "抹", + "闷", + "咨", + "刮", + "驾", + "缆", + "悟", + "摘", + "铒", + "掷", + "颇", + "幻", + "柄", + "惠", + "惨", + "佳", + "仇", + "腊", + "窝", + "涤", + "剑", + "瞧", + "堡", + "泼", + "葱", + "罩", + "霍", + "捞", + "胎", + "苍", + "滨", + "俩", + "捅", + "湘", + "砍", + "霞", + "邵", + "萄", + "疯", + "淮", + "遂", + "熊", + "粪", + "烘", + "宿", + "档", + "戈", + "驳", + "嫂", + "裕", + "徙", + "箭", + "捐", + "肠", + "撑", + "晒", + "辨", + "殿", + "莲", + "摊", + "搅", + "酱", + "屏", + "疫", + "哀", + "蔡", + "堵", + "沫", + "皱", + "畅", + "叠", + "阁", + "莱", + "敲", + "辖", + "钩", + "痕", + "坝", + "巷", + "饿", + "祸", + "丘", + "玄", + "溜", + "曰", + "逻", + "彭", + "尝", + "卿", + "妨", + "艇", + "吞", + "韦", + "怨", + "矮", + "歇", +]; diff --git a/ts_src/hd/words/chinese-traditional.ts b/ts_src/hd/words/chinese-traditional.ts new file mode 100644 index 0000000..f2ef752 --- /dev/null +++ b/ts_src/hd/words/chinese-traditional.ts @@ -0,0 +1,2050 @@ +export default [ + "的", + "一", + "是", + "在", + "不", + "了", + "有", + "和", + "人", + "這", + "中", + "大", + "為", + "上", + "個", + "國", + "我", + "以", + "要", + "他", + "時", + "來", + "用", + "們", + "生", + "到", + "作", + "地", + "於", + "出", + "就", + "分", + "對", + "成", + "會", + "可", + "主", + "發", + "年", + "動", + "同", + "工", + "也", + "能", + "下", + "過", + "子", + "說", + "產", + "種", + "面", + "而", + "方", + "後", + "多", + "定", + "行", + "學", + "法", + "所", + "民", + "得", + "經", + "十", + "三", + "之", + "進", + "著", + "等", + "部", + "度", + "家", + "電", + "力", + "裡", + "如", + "水", + "化", + "高", + "自", + "二", + "理", + "起", + "小", + "物", + "現", + "實", + "加", + "量", + "都", + "兩", + "體", + "制", + "機", + "當", + "使", + "點", + "從", + "業", + "本", + "去", + "把", + "性", + "好", + "應", + "開", + "它", + "合", + "還", + "因", + "由", + "其", + "些", + "然", + "前", + "外", + "天", + "政", + "四", + "日", + "那", + "社", + "義", + "事", + "平", + "形", + "相", + "全", + "表", + "間", + "樣", + "與", + "關", + "各", + "重", + "新", + "線", + "內", + "數", + "正", + "心", + "反", + "你", + "明", + "看", + "原", + "又", + "麼", + "利", + "比", + "或", + "但", + "質", + "氣", + "第", + "向", + "道", + "命", + "此", + "變", + "條", + "只", + "沒", + "結", + "解", + "問", + "意", + "建", + "月", + "公", + "無", + "系", + "軍", + "很", + "情", + "者", + "最", + "立", + "代", + "想", + "已", + "通", + "並", + "提", + "直", + "題", + "黨", + "程", + "展", + "五", + "果", + "料", + "象", + "員", + "革", + "位", + "入", + "常", + "文", + "總", + "次", + "品", + "式", + "活", + "設", + "及", + "管", + "特", + "件", + "長", + "求", + "老", + "頭", + "基", + "資", + "邊", + "流", + "路", + "級", + "少", + "圖", + "山", + "統", + "接", + "知", + "較", + "將", + "組", + "見", + "計", + "別", + "她", + "手", + "角", + "期", + "根", + "論", + "運", + "農", + "指", + "幾", + "九", + "區", + "強", + "放", + "決", + "西", + "被", + "幹", + "做", + "必", + "戰", + "先", + "回", + "則", + "任", + "取", + "據", + "處", + "隊", + "南", + "給", + "色", + "光", + "門", + "即", + "保", + "治", + "北", + "造", + "百", + "規", + "熱", + "領", + "七", + "海", + "口", + "東", + "導", + "器", + "壓", + "志", + "世", + "金", + "增", + "爭", + "濟", + "階", + "油", + "思", + "術", + "極", + "交", + "受", + "聯", + "什", + "認", + "六", + "共", + "權", + "收", + "證", + "改", + "清", + "美", + "再", + "採", + "轉", + "更", + "單", + "風", + "切", + "打", + "白", + "教", + "速", + "花", + "帶", + "安", + "場", + "身", + "車", + "例", + "真", + "務", + "具", + "萬", + "每", + "目", + "至", + "達", + "走", + "積", + "示", + "議", + "聲", + "報", + "鬥", + "完", + "類", + "八", + "離", + "華", + "名", + "確", + "才", + "科", + "張", + "信", + "馬", + "節", + "話", + "米", + "整", + "空", + "元", + "況", + "今", + "集", + "溫", + "傳", + "土", + "許", + "步", + "群", + "廣", + "石", + "記", + "需", + "段", + "研", + "界", + "拉", + "林", + "律", + "叫", + "且", + "究", + "觀", + "越", + "織", + "裝", + "影", + "算", + "低", + "持", + "音", + "眾", + "書", + "布", + "复", + "容", + "兒", + "須", + "際", + "商", + "非", + "驗", + "連", + "斷", + "深", + "難", + "近", + "礦", + "千", + "週", + "委", + "素", + "技", + "備", + "半", + "辦", + "青", + "省", + "列", + "習", + "響", + "約", + "支", + "般", + "史", + "感", + "勞", + "便", + "團", + "往", + "酸", + "歷", + "市", + "克", + "何", + "除", + "消", + "構", + "府", + "稱", + "太", + "準", + "精", + "值", + "號", + "率", + "族", + "維", + "劃", + "選", + "標", + "寫", + "存", + "候", + "毛", + "親", + "快", + "效", + "斯", + "院", + "查", + "江", + "型", + "眼", + "王", + "按", + "格", + "養", + "易", + "置", + "派", + "層", + "片", + "始", + "卻", + "專", + "狀", + "育", + "廠", + "京", + "識", + "適", + "屬", + "圓", + "包", + "火", + "住", + "調", + "滿", + "縣", + "局", + "照", + "參", + "紅", + "細", + "引", + "聽", + "該", + "鐵", + "價", + "嚴", + "首", + "底", + "液", + "官", + "德", + "隨", + "病", + "蘇", + "失", + "爾", + "死", + "講", + "配", + "女", + "黃", + "推", + "顯", + "談", + "罪", + "神", + "藝", + "呢", + "席", + "含", + "企", + "望", + "密", + "批", + "營", + "項", + "防", + "舉", + "球", + "英", + "氧", + "勢", + "告", + "李", + "台", + "落", + "木", + "幫", + "輪", + "破", + "亞", + "師", + "圍", + "注", + "遠", + "字", + "材", + "排", + "供", + "河", + "態", + "封", + "另", + "施", + "減", + "樹", + "溶", + "怎", + "止", + "案", + "言", + "士", + "均", + "武", + "固", + "葉", + "魚", + "波", + "視", + "僅", + "費", + "緊", + "愛", + "左", + "章", + "早", + "朝", + "害", + "續", + "輕", + "服", + "試", + "食", + "充", + "兵", + "源", + "判", + "護", + "司", + "足", + "某", + "練", + "差", + "致", + "板", + "田", + "降", + "黑", + "犯", + "負", + "擊", + "范", + "繼", + "興", + "似", + "餘", + "堅", + "曲", + "輸", + "修", + "故", + "城", + "夫", + "夠", + "送", + "筆", + "船", + "佔", + "右", + "財", + "吃", + "富", + "春", + "職", + "覺", + "漢", + "畫", + "功", + "巴", + "跟", + "雖", + "雜", + "飛", + "檢", + "吸", + "助", + "昇", + "陽", + "互", + "初", + "創", + "抗", + "考", + "投", + "壞", + "策", + "古", + "徑", + "換", + "未", + "跑", + "留", + "鋼", + "曾", + "端", + "責", + "站", + "簡", + "述", + "錢", + "副", + "盡", + "帝", + "射", + "草", + "衝", + "承", + "獨", + "令", + "限", + "阿", + "宣", + "環", + "雙", + "請", + "超", + "微", + "讓", + "控", + "州", + "良", + "軸", + "找", + "否", + "紀", + "益", + "依", + "優", + "頂", + "礎", + "載", + "倒", + "房", + "突", + "坐", + "粉", + "敵", + "略", + "客", + "袁", + "冷", + "勝", + "絕", + "析", + "塊", + "劑", + "測", + "絲", + "協", + "訴", + "念", + "陳", + "仍", + "羅", + "鹽", + "友", + "洋", + "錯", + "苦", + "夜", + "刑", + "移", + "頻", + "逐", + "靠", + "混", + "母", + "短", + "皮", + "終", + "聚", + "汽", + "村", + "雲", + "哪", + "既", + "距", + "衛", + "停", + "烈", + "央", + "察", + "燒", + "迅", + "境", + "若", + "印", + "洲", + "刻", + "括", + "激", + "孔", + "搞", + "甚", + "室", + "待", + "核", + "校", + "散", + "侵", + "吧", + "甲", + "遊", + "久", + "菜", + "味", + "舊", + "模", + "湖", + "貨", + "損", + "預", + "阻", + "毫", + "普", + "穩", + "乙", + "媽", + "植", + "息", + "擴", + "銀", + "語", + "揮", + "酒", + "守", + "拿", + "序", + "紙", + "醫", + "缺", + "雨", + "嗎", + "針", + "劉", + "啊", + "急", + "唱", + "誤", + "訓", + "願", + "審", + "附", + "獲", + "茶", + "鮮", + "糧", + "斤", + "孩", + "脫", + "硫", + "肥", + "善", + "龍", + "演", + "父", + "漸", + "血", + "歡", + "械", + "掌", + "歌", + "沙", + "剛", + "攻", + "謂", + "盾", + "討", + "晚", + "粒", + "亂", + "燃", + "矛", + "乎", + "殺", + "藥", + "寧", + "魯", + "貴", + "鐘", + "煤", + "讀", + "班", + "伯", + "香", + "介", + "迫", + "句", + "豐", + "培", + "握", + "蘭", + "擔", + "弦", + "蛋", + "沉", + "假", + "穿", + "執", + "答", + "樂", + "誰", + "順", + "煙", + "縮", + "徵", + "臉", + "喜", + "松", + "腳", + "困", + "異", + "免", + "背", + "星", + "福", + "買", + "染", + "井", + "概", + "慢", + "怕", + "磁", + "倍", + "祖", + "皇", + "促", + "靜", + "補", + "評", + "翻", + "肉", + "踐", + "尼", + "衣", + "寬", + "揚", + "棉", + "希", + "傷", + "操", + "垂", + "秋", + "宜", + "氫", + "套", + "督", + "振", + "架", + "亮", + "末", + "憲", + "慶", + "編", + "牛", + "觸", + "映", + "雷", + "銷", + "詩", + "座", + "居", + "抓", + "裂", + "胞", + "呼", + "娘", + "景", + "威", + "綠", + "晶", + "厚", + "盟", + "衡", + "雞", + "孫", + "延", + "危", + "膠", + "屋", + "鄉", + "臨", + "陸", + "顧", + "掉", + "呀", + "燈", + "歲", + "措", + "束", + "耐", + "劇", + "玉", + "趙", + "跳", + "哥", + "季", + "課", + "凱", + "胡", + "額", + "款", + "紹", + "卷", + "齊", + "偉", + "蒸", + "殖", + "永", + "宗", + "苗", + "川", + "爐", + "岩", + "弱", + "零", + "楊", + "奏", + "沿", + "露", + "桿", + "探", + "滑", + "鎮", + "飯", + "濃", + "航", + "懷", + "趕", + "庫", + "奪", + "伊", + "靈", + "稅", + "途", + "滅", + "賽", + "歸", + "召", + "鼓", + "播", + "盤", + "裁", + "險", + "康", + "唯", + "錄", + "菌", + "純", + "借", + "糖", + "蓋", + "橫", + "符", + "私", + "努", + "堂", + "域", + "槍", + "潤", + "幅", + "哈", + "竟", + "熟", + "蟲", + "澤", + "腦", + "壤", + "碳", + "歐", + "遍", + "側", + "寨", + "敢", + "徹", + "慮", + "斜", + "薄", + "庭", + "納", + "彈", + "飼", + "伸", + "折", + "麥", + "濕", + "暗", + "荷", + "瓦", + "塞", + "床", + "築", + "惡", + "戶", + "訪", + "塔", + "奇", + "透", + "梁", + "刀", + "旋", + "跡", + "卡", + "氯", + "遇", + "份", + "毒", + "泥", + "退", + "洗", + "擺", + "灰", + "彩", + "賣", + "耗", + "夏", + "擇", + "忙", + "銅", + "獻", + "硬", + "予", + "繁", + "圈", + "雪", + "函", + "亦", + "抽", + "篇", + "陣", + "陰", + "丁", + "尺", + "追", + "堆", + "雄", + "迎", + "泛", + "爸", + "樓", + "避", + "謀", + "噸", + "野", + "豬", + "旗", + "累", + "偏", + "典", + "館", + "索", + "秦", + "脂", + "潮", + "爺", + "豆", + "忽", + "托", + "驚", + "塑", + "遺", + "愈", + "朱", + "替", + "纖", + "粗", + "傾", + "尚", + "痛", + "楚", + "謝", + "奮", + "購", + "磨", + "君", + "池", + "旁", + "碎", + "骨", + "監", + "捕", + "弟", + "暴", + "割", + "貫", + "殊", + "釋", + "詞", + "亡", + "壁", + "頓", + "寶", + "午", + "塵", + "聞", + "揭", + "炮", + "殘", + "冬", + "橋", + "婦", + "警", + "綜", + "招", + "吳", + "付", + "浮", + "遭", + "徐", + "您", + "搖", + "谷", + "贊", + "箱", + "隔", + "訂", + "男", + "吹", + "園", + "紛", + "唐", + "敗", + "宋", + "玻", + "巨", + "耕", + "坦", + "榮", + "閉", + "灣", + "鍵", + "凡", + "駐", + "鍋", + "救", + "恩", + "剝", + "凝", + "鹼", + "齒", + "截", + "煉", + "麻", + "紡", + "禁", + "廢", + "盛", + "版", + "緩", + "淨", + "睛", + "昌", + "婚", + "涉", + "筒", + "嘴", + "插", + "岸", + "朗", + "莊", + "街", + "藏", + "姑", + "貿", + "腐", + "奴", + "啦", + "慣", + "乘", + "夥", + "恢", + "勻", + "紗", + "扎", + "辯", + "耳", + "彪", + "臣", + "億", + "璃", + "抵", + "脈", + "秀", + "薩", + "俄", + "網", + "舞", + "店", + "噴", + "縱", + "寸", + "汗", + "掛", + "洪", + "賀", + "閃", + "柬", + "爆", + "烯", + "津", + "稻", + "牆", + "軟", + "勇", + "像", + "滾", + "厘", + "蒙", + "芳", + "肯", + "坡", + "柱", + "盪", + "腿", + "儀", + "旅", + "尾", + "軋", + "冰", + "貢", + "登", + "黎", + "削", + "鑽", + "勒", + "逃", + "障", + "氨", + "郭", + "峰", + "幣", + "港", + "伏", + "軌", + "畝", + "畢", + "擦", + "莫", + "刺", + "浪", + "秘", + "援", + "株", + "健", + "售", + "股", + "島", + "甘", + "泡", + "睡", + "童", + "鑄", + "湯", + "閥", + "休", + "匯", + "舍", + "牧", + "繞", + "炸", + "哲", + "磷", + "績", + "朋", + "淡", + "尖", + "啟", + "陷", + "柴", + "呈", + "徒", + "顏", + "淚", + "稍", + "忘", + "泵", + "藍", + "拖", + "洞", + "授", + "鏡", + "辛", + "壯", + "鋒", + "貧", + "虛", + "彎", + "摩", + "泰", + "幼", + "廷", + "尊", + "窗", + "綱", + "弄", + "隸", + "疑", + "氏", + "宮", + "姐", + "震", + "瑞", + "怪", + "尤", + "琴", + "循", + "描", + "膜", + "違", + "夾", + "腰", + "緣", + "珠", + "窮", + "森", + "枝", + "竹", + "溝", + "催", + "繩", + "憶", + "邦", + "剩", + "幸", + "漿", + "欄", + "擁", + "牙", + "貯", + "禮", + "濾", + "鈉", + "紋", + "罷", + "拍", + "咱", + "喊", + "袖", + "埃", + "勤", + "罰", + "焦", + "潛", + "伍", + "墨", + "欲", + "縫", + "姓", + "刊", + "飽", + "仿", + "獎", + "鋁", + "鬼", + "麗", + "跨", + "默", + "挖", + "鏈", + "掃", + "喝", + "袋", + "炭", + "污", + "幕", + "諸", + "弧", + "勵", + "梅", + "奶", + "潔", + "災", + "舟", + "鑑", + "苯", + "訟", + "抱", + "毀", + "懂", + "寒", + "智", + "埔", + "寄", + "屆", + "躍", + "渡", + "挑", + "丹", + "艱", + "貝", + "碰", + "拔", + "爹", + "戴", + "碼", + "夢", + "芽", + "熔", + "赤", + "漁", + "哭", + "敬", + "顆", + "奔", + "鉛", + "仲", + "虎", + "稀", + "妹", + "乏", + "珍", + "申", + "桌", + "遵", + "允", + "隆", + "螺", + "倉", + "魏", + "銳", + "曉", + "氮", + "兼", + "隱", + "礙", + "赫", + "撥", + "忠", + "肅", + "缸", + "牽", + "搶", + "博", + "巧", + "殼", + "兄", + "杜", + "訊", + "誠", + "碧", + "祥", + "柯", + "頁", + "巡", + "矩", + "悲", + "灌", + "齡", + "倫", + "票", + "尋", + "桂", + "鋪", + "聖", + "恐", + "恰", + "鄭", + "趣", + "抬", + "荒", + "騰", + "貼", + "柔", + "滴", + "猛", + "闊", + "輛", + "妻", + "填", + "撤", + "儲", + "簽", + "鬧", + "擾", + "紫", + "砂", + "遞", + "戲", + "吊", + "陶", + "伐", + "餵", + "療", + "瓶", + "婆", + "撫", + "臂", + "摸", + "忍", + "蝦", + "蠟", + "鄰", + "胸", + "鞏", + "擠", + "偶", + "棄", + "槽", + "勁", + "乳", + "鄧", + "吉", + "仁", + "爛", + "磚", + "租", + "烏", + "艦", + "伴", + "瓜", + "淺", + "丙", + "暫", + "燥", + "橡", + "柳", + "迷", + "暖", + "牌", + "秧", + "膽", + "詳", + "簧", + "踏", + "瓷", + "譜", + "呆", + "賓", + "糊", + "洛", + "輝", + "憤", + "競", + "隙", + "怒", + "粘", + "乃", + "緒", + "肩", + "籍", + "敏", + "塗", + "熙", + "皆", + "偵", + "懸", + "掘", + "享", + "糾", + "醒", + "狂", + "鎖", + "淀", + "恨", + "牲", + "霸", + "爬", + "賞", + "逆", + "玩", + "陵", + "祝", + "秒", + "浙", + "貌", + "役", + "彼", + "悉", + "鴨", + "趨", + "鳳", + "晨", + "畜", + "輩", + "秩", + "卵", + "署", + "梯", + "炎", + "灘", + "棋", + "驅", + "篩", + "峽", + "冒", + "啥", + "壽", + "譯", + "浸", + "泉", + "帽", + "遲", + "矽", + "疆", + "貸", + "漏", + "稿", + "冠", + "嫩", + "脅", + "芯", + "牢", + "叛", + "蝕", + "奧", + "鳴", + "嶺", + "羊", + "憑", + "串", + "塘", + "繪", + "酵", + "融", + "盆", + "錫", + "廟", + "籌", + "凍", + "輔", + "攝", + "襲", + "筋", + "拒", + "僚", + "旱", + "鉀", + "鳥", + "漆", + "沈", + "眉", + "疏", + "添", + "棒", + "穗", + "硝", + "韓", + "逼", + "扭", + "僑", + "涼", + "挺", + "碗", + "栽", + "炒", + "杯", + "患", + "餾", + "勸", + "豪", + "遼", + "勃", + "鴻", + "旦", + "吏", + "拜", + "狗", + "埋", + "輥", + "掩", + "飲", + "搬", + "罵", + "辭", + "勾", + "扣", + "估", + "蔣", + "絨", + "霧", + "丈", + "朵", + "姆", + "擬", + "宇", + "輯", + "陝", + "雕", + "償", + "蓄", + "崇", + "剪", + "倡", + "廳", + "咬", + "駛", + "薯", + "刷", + "斥", + "番", + "賦", + "奉", + "佛", + "澆", + "漫", + "曼", + "扇", + "鈣", + "桃", + "扶", + "仔", + "返", + "俗", + "虧", + "腔", + "鞋", + "棱", + "覆", + "框", + "悄", + "叔", + "撞", + "騙", + "勘", + "旺", + "沸", + "孤", + "吐", + "孟", + "渠", + "屈", + "疾", + "妙", + "惜", + "仰", + "狠", + "脹", + "諧", + "拋", + "黴", + "桑", + "崗", + "嘛", + "衰", + "盜", + "滲", + "臟", + "賴", + "湧", + "甜", + "曹", + "閱", + "肌", + "哩", + "厲", + "烴", + "緯", + "毅", + "昨", + "偽", + "症", + "煮", + "嘆", + "釘", + "搭", + "莖", + "籠", + "酷", + "偷", + "弓", + "錐", + "恆", + "傑", + "坑", + "鼻", + "翼", + "綸", + "敘", + "獄", + "逮", + "罐", + "絡", + "棚", + "抑", + "膨", + "蔬", + "寺", + "驟", + "穆", + "冶", + "枯", + "冊", + "屍", + "凸", + "紳", + "坯", + "犧", + "焰", + "轟", + "欣", + "晉", + "瘦", + "禦", + "錠", + "錦", + "喪", + "旬", + "鍛", + "壟", + "搜", + "撲", + "邀", + "亭", + "酯", + "邁", + "舒", + "脆", + "酶", + "閒", + "憂", + "酚", + "頑", + "羽", + "漲", + "卸", + "仗", + "陪", + "闢", + "懲", + "杭", + "姚", + "肚", + "捉", + "飄", + "漂", + "昆", + "欺", + "吾", + "郎", + "烷", + "汁", + "呵", + "飾", + "蕭", + "雅", + "郵", + "遷", + "燕", + "撒", + "姻", + "赴", + "宴", + "煩", + "債", + "帳", + "斑", + "鈴", + "旨", + "醇", + "董", + "餅", + "雛", + "姿", + "拌", + "傅", + "腹", + "妥", + "揉", + "賢", + "拆", + "歪", + "葡", + "胺", + "丟", + "浩", + "徽", + "昂", + "墊", + "擋", + "覽", + "貪", + "慰", + "繳", + "汪", + "慌", + "馮", + "諾", + "姜", + "誼", + "兇", + "劣", + "誣", + "耀", + "昏", + "躺", + "盈", + "騎", + "喬", + "溪", + "叢", + "盧", + "抹", + "悶", + "諮", + "刮", + "駕", + "纜", + "悟", + "摘", + "鉺", + "擲", + "頗", + "幻", + "柄", + "惠", + "慘", + "佳", + "仇", + "臘", + "窩", + "滌", + "劍", + "瞧", + "堡", + "潑", + "蔥", + "罩", + "霍", + "撈", + "胎", + "蒼", + "濱", + "倆", + "捅", + "湘", + "砍", + "霞", + "邵", + "萄", + "瘋", + "淮", + "遂", + "熊", + "糞", + "烘", + "宿", + "檔", + "戈", + "駁", + "嫂", + "裕", + "徙", + "箭", + "捐", + "腸", + "撐", + "曬", + "辨", + "殿", + "蓮", + "攤", + "攪", + "醬", + "屏", + "疫", + "哀", + "蔡", + "堵", + "沫", + "皺", + "暢", + "疊", + "閣", + "萊", + "敲", + "轄", + "鉤", + "痕", + "壩", + "巷", + "餓", + "禍", + "丘", + "玄", + "溜", + "曰", + "邏", + "彭", + "嘗", + "卿", + "妨", + "艇", + "吞", + "韋", + "怨", + "矮", + "歇", +]; diff --git a/ts_src/hd/words/english.ts b/ts_src/hd/words/english.ts new file mode 100644 index 0000000..89667aa --- /dev/null +++ b/ts_src/hd/words/english.ts @@ -0,0 +1,2050 @@ +export default [ + "abandon", + "ability", + "able", + "about", + "above", + "absent", + "absorb", + "abstract", + "absurd", + "abuse", + "access", + "accident", + "account", + "accuse", + "achieve", + "acid", + "acoustic", + "acquire", + "across", + "act", + "action", + "actor", + "actress", + "actual", + "adapt", + "add", + "addict", + "address", + "adjust", + "admit", + "adult", + "advance", + "advice", + "aerobic", + "affair", + "afford", + "afraid", + "again", + "age", + "agent", + "agree", + "ahead", + "aim", + "air", + "airport", + "aisle", + "alarm", + "album", + "alcohol", + "alert", + "alien", + "all", + "alley", + "allow", + "almost", + "alone", + "alpha", + "already", + "also", + "alter", + "always", + "amateur", + "amazing", + "among", + "amount", + "amused", + "analyst", + "anchor", + "ancient", + "anger", + "angle", + "angry", + "animal", + "ankle", + "announce", + "annual", + "another", + "answer", + "antenna", + "antique", + "anxiety", + "any", + "apart", + "apology", + "appear", + "apple", + "approve", + "april", + "arch", + "arctic", + "area", + "arena", + "argue", + "arm", + "armed", + "armor", + "army", + "around", + "arrange", + "arrest", + "arrive", + "arrow", + "art", + "artefact", + "artist", + "artwork", + "ask", + "aspect", + "assault", + "asset", + "assist", + "assume", + "asthma", + "athlete", + "atom", + "attack", + "attend", + "attitude", + "attract", + "auction", + "audit", + "august", + "aunt", + "author", + "auto", + "autumn", + "average", + "avocado", + "avoid", + "awake", + "aware", + "away", + "awesome", + "awful", + "awkward", + "axis", + "baby", + "bachelor", + "bacon", + "badge", + "bag", + "balance", + "balcony", + "ball", + "bamboo", + "banana", + "banner", + "bar", + "barely", + "bargain", + "barrel", + "base", + "basic", + "basket", + "battle", + "beach", + "bean", + "beauty", + "because", + "become", + "beef", + "before", + "begin", + "behave", + "behind", + "believe", + "below", + "belt", + "bench", + "benefit", + "best", + "betray", + "better", + "between", + "beyond", + "bicycle", + "bid", + "bike", + "bind", + "biology", + "bird", + "birth", + "bitter", + "black", + "blade", + "blame", + "blanket", + "blast", + "bleak", + "bless", + "blind", + "blood", + "blossom", + "blouse", + "blue", + "blur", + "blush", + "board", + "boat", + "body", + "boil", + "bomb", + "bone", + "bonus", + "book", + "boost", + "border", + "boring", + "borrow", + "boss", + "bottom", + "bounce", + "box", + "boy", + "bracket", + "brain", + "brand", + "brass", + "brave", + "bread", + "breeze", + "brick", + "bridge", + "brief", + "bright", + "bring", + "brisk", + "broccoli", + "broken", + "bronze", + "broom", + "brother", + "brown", + "brush", + "bubble", + "buddy", + "budget", + "buffalo", + "build", + "bulb", + "bulk", + "bullet", + "bundle", + "bunker", + "burden", + "burger", + "burst", + "bus", + "business", + "busy", + "butter", + "buyer", + "buzz", + "cabbage", + "cabin", + "cable", + "cactus", + "cage", + "cake", + "call", + "calm", + "camera", + "camp", + "can", + "canal", + "cancel", + "candy", + "cannon", + "canoe", + "canvas", + "canyon", + "capable", + "capital", + "captain", + "car", + "carbon", + "card", + "cargo", + "carpet", + "carry", + "cart", + "case", + "cash", + "casino", + "castle", + "casual", + "cat", + "catalog", + "catch", + "category", + "cattle", + "caught", + "cause", + "caution", + "cave", + "ceiling", + "celery", + "cement", + "census", + "century", + "cereal", + "certain", + "chair", + "chalk", + "champion", + "change", + "chaos", + "chapter", + "charge", + "chase", + "chat", + "cheap", + "check", + "cheese", + "chef", + "cherry", + "chest", + "chicken", + "chief", + "child", + "chimney", + "choice", + "choose", + "chronic", + "chuckle", + "chunk", + "churn", + "cigar", + "cinnamon", + "circle", + "citizen", + "city", + "civil", + "claim", + "clap", + "clarify", + "claw", + "clay", + "clean", + "clerk", + "clever", + "click", + "client", + "cliff", + "climb", + "clinic", + "clip", + "clock", + "clog", + "close", + "cloth", + "cloud", + "clown", + "club", + "clump", + "cluster", + "clutch", + "coach", + "coast", + "coconut", + "code", + "coffee", + "coil", + "coin", + "collect", + "color", + "column", + "combine", + "come", + "comfort", + "comic", + "common", + "company", + "concert", + "conduct", + "confirm", + "congress", + "connect", + "consider", + "control", + "convince", + "cook", + "cool", + "copper", + "copy", + "coral", + "core", + "corn", + "correct", + "cost", + "cotton", + "couch", + "country", + "couple", + "course", + "cousin", + "cover", + "coyote", + "crack", + "cradle", + "craft", + "cram", + "crane", + "crash", + "crater", + "crawl", + "crazy", + "cream", + "credit", + "creek", + "crew", + "cricket", + "crime", + "crisp", + "critic", + "crop", + "cross", + "crouch", + "crowd", + "crucial", + "cruel", + "cruise", + "crumble", + "crunch", + "crush", + "cry", + "crystal", + "cube", + "culture", + "cup", + "cupboard", + "curious", + "current", + "curtain", + "curve", + "cushion", + "custom", + "cute", + "cycle", + "dad", + "damage", + "damp", + "dance", + "danger", + "daring", + "dash", + "daughter", + "dawn", + "day", + "deal", + "debate", + "debris", + "decade", + "december", + "decide", + "decline", + "decorate", + "decrease", + "deer", + "defense", + "define", + "defy", + "degree", + "delay", + "deliver", + "demand", + "demise", + "denial", + "dentist", + "deny", + "depart", + "depend", + "deposit", + "depth", + "deputy", + "derive", + "describe", + "desert", + "design", + "desk", + "despair", + "destroy", + "detail", + "detect", + "develop", + "device", + "devote", + "diagram", + "dial", + "diamond", + "diary", + "dice", + "diesel", + "diet", + "differ", + "digital", + "dignity", + "dilemma", + "dinner", + "dinosaur", + "direct", + "dirt", + "disagree", + "discover", + "disease", + "dish", + "dismiss", + "disorder", + "display", + "distance", + "divert", + "divide", + "divorce", + "dizzy", + "doctor", + "document", + "dog", + "doll", + "dolphin", + "domain", + "donate", + "donkey", + "donor", + "door", + "dose", + "double", + "dove", + "draft", + "dragon", + "drama", + "drastic", + "draw", + "dream", + "dress", + "drift", + "drill", + "drink", + "drip", + "drive", + "drop", + "drum", + "dry", + "duck", + "dumb", + "dune", + "during", + "dust", + "dutch", + "duty", + "dwarf", + "dynamic", + "eager", + "eagle", + "early", + "earn", + "earth", + "easily", + "east", + "easy", + "echo", + "ecology", + "economy", + "edge", + "edit", + "educate", + "effort", + "egg", + "eight", + "either", + "elbow", + "elder", + "electric", + "elegant", + "element", + "elephant", + "elevator", + "elite", + "else", + "embark", + "embody", + "embrace", + "emerge", + "emotion", + "employ", + "empower", + "empty", + "enable", + "enact", + "end", + "endless", + "endorse", + "enemy", + "energy", + "enforce", + "engage", + "engine", + "enhance", + "enjoy", + "enlist", + "enough", + "enrich", + "enroll", + "ensure", + "enter", + "entire", + "entry", + "envelope", + "episode", + "equal", + "equip", + "era", + "erase", + "erode", + "erosion", + "error", + "erupt", + "escape", + "essay", + "essence", + "estate", + "eternal", + "ethics", + "evidence", + "evil", + "evoke", + "evolve", + "exact", + "example", + "excess", + "exchange", + "excite", + "exclude", + "excuse", + "execute", + "exercise", + "exhaust", + "exhibit", + "exile", + "exist", + "exit", + "exotic", + "expand", + "expect", + "expire", + "explain", + "expose", + "express", + "extend", + "extra", + "eye", + "eyebrow", + "fabric", + "face", + "faculty", + "fade", + "faint", + "faith", + "fall", + "false", + "fame", + "family", + "famous", + "fan", + "fancy", + "fantasy", + "farm", + "fashion", + "fat", + "fatal", + "father", + "fatigue", + "fault", + "favorite", + "feature", + "february", + "federal", + "fee", + "feed", + "feel", + "female", + "fence", + "festival", + "fetch", + "fever", + "few", + "fiber", + "fiction", + "field", + "figure", + "file", + "film", + "filter", + "final", + "find", + "fine", + "finger", + "finish", + "fire", + "firm", + "first", + "fiscal", + "fish", + "fit", + "fitness", + "fix", + "flag", + "flame", + "flash", + "flat", + "flavor", + "flee", + "flight", + "flip", + "float", + "flock", + "floor", + "flower", + "fluid", + "flush", + "fly", + "foam", + "focus", + "fog", + "foil", + "fold", + "follow", + "food", + "foot", + "force", + "forest", + "forget", + "fork", + "fortune", + "forum", + "forward", + "fossil", + "foster", + "found", + "fox", + "fragile", + "frame", + "frequent", + "fresh", + "friend", + "fringe", + "frog", + "front", + "frost", + "frown", + "frozen", + "fruit", + "fuel", + "fun", + "funny", + "furnace", + "fury", + "future", + "gadget", + "gain", + "galaxy", + "gallery", + "game", + "gap", + "garage", + "garbage", + "garden", + "garlic", + "garment", + "gas", + "gasp", + "gate", + "gather", + "gauge", + "gaze", + "general", + "genius", + "genre", + "gentle", + "genuine", + "gesture", + "ghost", + "giant", + "gift", + "giggle", + "ginger", + "giraffe", + "girl", + "give", + "glad", + "glance", + "glare", + "glass", + "glide", + "glimpse", + "globe", + "gloom", + "glory", + "glove", + "glow", + "glue", + "goat", + "goddess", + "gold", + "good", + "goose", + "gorilla", + "gospel", + "gossip", + "govern", + "gown", + "grab", + "grace", + "grain", + "grant", + "grape", + "grass", + "gravity", + "great", + "green", + "grid", + "grief", + "grit", + "grocery", + "group", + "grow", + "grunt", + "guard", + "guess", + "guide", + "guilt", + "guitar", + "gun", + "gym", + "habit", + "hair", + "half", + "hammer", + "hamster", + "hand", + "happy", + "harbor", + "hard", + "harsh", + "harvest", + "hat", + "have", + "hawk", + "hazard", + "head", + "health", + "heart", + "heavy", + "hedgehog", + "height", + "hello", + "helmet", + "help", + "hen", + "hero", + "hidden", + "high", + "hill", + "hint", + "hip", + "hire", + "history", + "hobby", + "hockey", + "hold", + "hole", + "holiday", + "hollow", + "home", + "honey", + "hood", + "hope", + "horn", + "horror", + "horse", + "hospital", + "host", + "hotel", + "hour", + "hover", + "hub", + "huge", + "human", + "humble", + "humor", + "hundred", + "hungry", + "hunt", + "hurdle", + "hurry", + "hurt", + "husband", + "hybrid", + "ice", + "icon", + "idea", + "identify", + "idle", + "ignore", + "ill", + "illegal", + "illness", + "image", + "imitate", + "immense", + "immune", + "impact", + "impose", + "improve", + "impulse", + "inch", + "include", + "income", + "increase", + "index", + "indicate", + "indoor", + "industry", + "infant", + "inflict", + "inform", + "inhale", + "inherit", + "initial", + "inject", + "injury", + "inmate", + "inner", + "innocent", + "input", + "inquiry", + "insane", + "insect", + "inside", + "inspire", + "install", + "intact", + "interest", + "into", + "invest", + "invite", + "involve", + "iron", + "island", + "isolate", + "issue", + "item", + "ivory", + "jacket", + "jaguar", + "jar", + "jazz", + "jealous", + "jeans", + "jelly", + "jewel", + "job", + "join", + "joke", + "journey", + "joy", + "judge", + "juice", + "jump", + "jungle", + "junior", + "junk", + "just", + "kangaroo", + "keen", + "keep", + "ketchup", + "key", + "kick", + "kid", + "kidney", + "kind", + "kingdom", + "kiss", + "kit", + "kitchen", + "kite", + "kitten", + "kiwi", + "knee", + "knife", + "knock", + "know", + "lab", + "label", + "labor", + "ladder", + "lady", + "lake", + "lamp", + "language", + "laptop", + "large", + "later", + "latin", + "laugh", + "laundry", + "lava", + "law", + "lawn", + "lawsuit", + "layer", + "lazy", + "leader", + "leaf", + "learn", + "leave", + "lecture", + "left", + "leg", + "legal", + "legend", + "leisure", + "lemon", + "lend", + "length", + "lens", + "leopard", + "lesson", + "letter", + "level", + "liar", + "liberty", + "library", + "license", + "life", + "lift", + "light", + "like", + "limb", + "limit", + "link", + "lion", + "liquid", + "list", + "little", + "live", + "lizard", + "load", + "loan", + "lobster", + "local", + "lock", + "logic", + "lonely", + "long", + "loop", + "lottery", + "loud", + "lounge", + "love", + "loyal", + "lucky", + "luggage", + "lumber", + "lunar", + "lunch", + "luxury", + "lyrics", + "machine", + "mad", + "magic", + "magnet", + "maid", + "mail", + "main", + "major", + "make", + "mammal", + "man", + "manage", + "mandate", + "mango", + "mansion", + "manual", + "maple", + "marble", + "march", + "margin", + "marine", + "market", + "marriage", + "mask", + "mass", + "master", + "match", + "material", + "math", + "matrix", + "matter", + "maximum", + "maze", + "meadow", + "mean", + "measure", + "meat", + "mechanic", + "medal", + "media", + "melody", + "melt", + "member", + "memory", + "mention", + "menu", + "mercy", + "merge", + "merit", + "merry", + "mesh", + "message", + "metal", + "method", + "middle", + "midnight", + "milk", + "million", + "mimic", + "mind", + "minimum", + "minor", + "minute", + "miracle", + "mirror", + "misery", + "miss", + "mistake", + "mix", + "mixed", + "mixture", + "mobile", + "model", + "modify", + "mom", + "moment", + "monitor", + "monkey", + "monster", + "month", + "moon", + "moral", + "more", + "morning", + "mosquito", + "mother", + "motion", + "motor", + "mountain", + "mouse", + "move", + "movie", + "much", + "muffin", + "mule", + "multiply", + "muscle", + "museum", + "mushroom", + "music", + "must", + "mutual", + "myself", + "mystery", + "myth", + "naive", + "name", + "napkin", + "narrow", + "nasty", + "nation", + "nature", + "near", + "neck", + "need", + "negative", + "neglect", + "neither", + "nephew", + "nerve", + "nest", + "net", + "network", + "neutral", + "never", + "news", + "next", + "nice", + "night", + "noble", + "noise", + "nominee", + "noodle", + "normal", + "north", + "nose", + "notable", + "note", + "nothing", + "notice", + "novel", + "now", + "nuclear", + "number", + "nurse", + "nut", + "oak", + "obey", + "object", + "oblige", + "obscure", + "observe", + "obtain", + "obvious", + "occur", + "ocean", + "october", + "odor", + "off", + "offer", + "office", + "often", + "oil", + "okay", + "old", + "olive", + "olympic", + "omit", + "once", + "one", + "onion", + "online", + "only", + "open", + "opera", + "opinion", + "oppose", + "option", + "orange", + "orbit", + "orchard", + "order", + "ordinary", + "organ", + "orient", + "original", + "orphan", + "ostrich", + "other", + "outdoor", + "outer", + "output", + "outside", + "oval", + "oven", + "over", + "own", + "owner", + "oxygen", + "oyster", + "ozone", + "pact", + "paddle", + "page", + "pair", + "palace", + "palm", + "panda", + "panel", + "panic", + "panther", + "paper", + "parade", + "parent", + "park", + "parrot", + "party", + "pass", + "patch", + "path", + "patient", + "patrol", + "pattern", + "pause", + "pave", + "payment", + "peace", + "peanut", + "pear", + "peasant", + "pelican", + "pen", + "penalty", + "pencil", + "people", + "pepper", + "perfect", + "permit", + "person", + "pet", + "phone", + "photo", + "phrase", + "physical", + "piano", + "picnic", + "picture", + "piece", + "pig", + "pigeon", + "pill", + "pilot", + "pink", + "pioneer", + "pipe", + "pistol", + "pitch", + "pizza", + "place", + "planet", + "plastic", + "plate", + "play", + "please", + "pledge", + "pluck", + "plug", + "plunge", + "poem", + "poet", + "point", + "polar", + "pole", + "police", + "pond", + "pony", + "pool", + "popular", + "portion", + "position", + "possible", + "post", + "potato", + "pottery", + "poverty", + "powder", + "power", + "practice", + "praise", + "predict", + "prefer", + "prepare", + "present", + "pretty", + "prevent", + "price", + "pride", + "primary", + "print", + "priority", + "prison", + "private", + "prize", + "problem", + "process", + "produce", + "profit", + "program", + "project", + "promote", + "proof", + "property", + "prosper", + "protect", + "proud", + "provide", + "public", + "pudding", + "pull", + "pulp", + "pulse", + "pumpkin", + "punch", + "pupil", + "puppy", + "purchase", + "purity", + "purpose", + "purse", + "push", + "put", + "puzzle", + "pyramid", + "quality", + "quantum", + "quarter", + "question", + "quick", + "quit", + "quiz", + "quote", + "rabbit", + "raccoon", + "race", + "rack", + "radar", + "radio", + "rail", + "rain", + "raise", + "rally", + "ramp", + "ranch", + "random", + "range", + "rapid", + "rare", + "rate", + "rather", + "raven", + "raw", + "razor", + "ready", + "real", + "reason", + "rebel", + "rebuild", + "recall", + "receive", + "recipe", + "record", + "recycle", + "reduce", + "reflect", + "reform", + "refuse", + "region", + "regret", + "regular", + "reject", + "relax", + "release", + "relief", + "rely", + "remain", + "remember", + "remind", + "remove", + "render", + "renew", + "rent", + "reopen", + "repair", + "repeat", + "replace", + "report", + "require", + "rescue", + "resemble", + "resist", + "resource", + "response", + "result", + "retire", + "retreat", + "return", + "reunion", + "reveal", + "review", + "reward", + "rhythm", + "rib", + "ribbon", + "rice", + "rich", + "ride", + "ridge", + "rifle", + "right", + "rigid", + "ring", + "riot", + "ripple", + "risk", + "ritual", + "rival", + "river", + "road", + "roast", + "robot", + "robust", + "rocket", + "romance", + "roof", + "rookie", + "room", + "rose", + "rotate", + "rough", + "round", + "route", + "royal", + "rubber", + "rude", + "rug", + "rule", + "run", + "runway", + "rural", + "sad", + "saddle", + "sadness", + "safe", + "sail", + "salad", + "salmon", + "salon", + "salt", + "salute", + "same", + "sample", + "sand", + "satisfy", + "satoshi", + "sauce", + "sausage", + "save", + "say", + "scale", + "scan", + "scare", + "scatter", + "scene", + "scheme", + "school", + "science", + "scissors", + "scorpion", + "scout", + "scrap", + "screen", + "script", + "scrub", + "sea", + "search", + "season", + "seat", + "second", + "secret", + "section", + "security", + "seed", + "seek", + "segment", + "select", + "sell", + "seminar", + "senior", + "sense", + "sentence", + "series", + "service", + "session", + "settle", + "setup", + "seven", + "shadow", + "shaft", + "shallow", + "share", + "shed", + "shell", + "sheriff", + "shield", + "shift", + "shine", + "ship", + "shiver", + "shock", + "shoe", + "shoot", + "shop", + "short", + "shoulder", + "shove", + "shrimp", + "shrug", + "shuffle", + "shy", + "sibling", + "sick", + "side", + "siege", + "sight", + "sign", + "silent", + "silk", + "silly", + "silver", + "similar", + "simple", + "since", + "sing", + "siren", + "sister", + "situate", + "six", + "size", + "skate", + "sketch", + "ski", + "skill", + "skin", + "skirt", + "skull", + "slab", + "slam", + "sleep", + "slender", + "slice", + "slide", + "slight", + "slim", + "slogan", + "slot", + "slow", + "slush", + "small", + "smart", + "smile", + "smoke", + "smooth", + "snack", + "snake", + "snap", + "sniff", + "snow", + "soap", + "soccer", + "social", + "sock", + "soda", + "soft", + "solar", + "soldier", + "solid", + "solution", + "solve", + "someone", + "song", + "soon", + "sorry", + "sort", + "soul", + "sound", + "soup", + "source", + "south", + "space", + "spare", + "spatial", + "spawn", + "speak", + "special", + "speed", + "spell", + "spend", + "sphere", + "spice", + "spider", + "spike", + "spin", + "spirit", + "split", + "spoil", + "sponsor", + "spoon", + "sport", + "spot", + "spray", + "spread", + "spring", + "spy", + "square", + "squeeze", + "squirrel", + "stable", + "stadium", + "staff", + "stage", + "stairs", + "stamp", + "stand", + "start", + "state", + "stay", + "steak", + "steel", + "stem", + "step", + "stereo", + "stick", + "still", + "sting", + "stock", + "stomach", + "stone", + "stool", + "story", + "stove", + "strategy", + "street", + "strike", + "strong", + "struggle", + "student", + "stuff", + "stumble", + "style", + "subject", + "submit", + "subway", + "success", + "such", + "sudden", + "suffer", + "sugar", + "suggest", + "suit", + "summer", + "sun", + "sunny", + "sunset", + "super", + "supply", + "supreme", + "sure", + "surface", + "surge", + "surprise", + "surround", + "survey", + "suspect", + "sustain", + "swallow", + "swamp", + "swap", + "swarm", + "swear", + "sweet", + "swift", + "swim", + "swing", + "switch", + "sword", + "symbol", + "symptom", + "syrup", + "system", + "table", + "tackle", + "tag", + "tail", + "talent", + "talk", + "tank", + "tape", + "target", + "task", + "taste", + "tattoo", + "taxi", + "teach", + "team", + "tell", + "ten", + "tenant", + "tennis", + "tent", + "term", + "test", + "text", + "thank", + "that", + "theme", + "then", + "theory", + "there", + "they", + "thing", + "this", + "thought", + "three", + "thrive", + "throw", + "thumb", + "thunder", + "ticket", + "tide", + "tiger", + "tilt", + "timber", + "time", + "tiny", + "tip", + "tired", + "tissue", + "title", + "toast", + "tobacco", + "today", + "toddler", + "toe", + "together", + "toilet", + "token", + "tomato", + "tomorrow", + "tone", + "tongue", + "tonight", + "tool", + "tooth", + "top", + "topic", + "topple", + "torch", + "tornado", + "tortoise", + "toss", + "total", + "tourist", + "toward", + "tower", + "town", + "toy", + "track", + "trade", + "traffic", + "tragic", + "train", + "transfer", + "trap", + "trash", + "travel", + "tray", + "treat", + "tree", + "trend", + "trial", + "tribe", + "trick", + "trigger", + "trim", + "trip", + "trophy", + "trouble", + "truck", + "true", + "truly", + "trumpet", + "trust", + "truth", + "try", + "tube", + "tuition", + "tumble", + "tuna", + "tunnel", + "turkey", + "turn", + "turtle", + "twelve", + "twenty", + "twice", + "twin", + "twist", + "two", + "type", + "typical", + "ugly", + "umbrella", + "unable", + "unaware", + "uncle", + "uncover", + "under", + "undo", + "unfair", + "unfold", + "unhappy", + "uniform", + "unique", + "unit", + "universe", + "unknown", + "unlock", + "until", + "unusual", + "unveil", + "update", + "upgrade", + "uphold", + "upon", + "upper", + "upset", + "urban", + "urge", + "usage", + "use", + "used", + "useful", + "useless", + "usual", + "utility", + "vacant", + "vacuum", + "vague", + "valid", + "valley", + "valve", + "van", + "vanish", + "vapor", + "various", + "vast", + "vault", + "vehicle", + "velvet", + "vendor", + "venture", + "venue", + "verb", + "verify", + "version", + "very", + "vessel", + "veteran", + "viable", + "vibrant", + "vicious", + "victory", + "video", + "view", + "village", + "vintage", + "violin", + "virtual", + "virus", + "visa", + "visit", + "visual", + "vital", + "vivid", + "vocal", + "voice", + "void", + "volcano", + "volume", + "vote", + "voyage", + "wage", + "wagon", + "wait", + "walk", + "wall", + "walnut", + "want", + "warfare", + "warm", + "warrior", + "wash", + "wasp", + "waste", + "water", + "wave", + "way", + "wealth", + "weapon", + "wear", + "weasel", + "weather", + "web", + "wedding", + "weekend", + "weird", + "welcome", + "west", + "wet", + "whale", + "what", + "wheat", + "wheel", + "when", + "where", + "whip", + "whisper", + "wide", + "width", + "wife", + "wild", + "will", + "win", + "window", + "wine", + "wing", + "wink", + "winner", + "winter", + "wire", + "wisdom", + "wise", + "wish", + "witness", + "wolf", + "woman", + "wonder", + "wood", + "wool", + "word", + "work", + "world", + "worry", + "worth", + "wrap", + "wreck", + "wrestle", + "wrist", + "write", + "wrong", + "yard", + "year", + "yellow", + "you", + "young", + "youth", + "zebra", + "zero", + "zone", + "zoo", +]; diff --git a/ts_src/hd/words/french.ts b/ts_src/hd/words/french.ts new file mode 100644 index 0000000..001bcb0 --- /dev/null +++ b/ts_src/hd/words/french.ts @@ -0,0 +1,2050 @@ +export default [ + "abaisser", + "abandon", + "abdiquer", + "abeille", + "abolir", + "aborder", + "aboutir", + "aboyer", + "abrasif", + "abreuver", + "abriter", + "abroger", + "abrupt", + "absence", + "absolu", + "absurde", + "abusif", + "abyssal", + "académie", + "acajou", + "acarien", + "accabler", + "accepter", + "acclamer", + "accolade", + "accroche", + "accuser", + "acerbe", + "achat", + "acheter", + "aciduler", + "acier", + "acompte", + "acquérir", + "acronyme", + "acteur", + "actif", + "actuel", + "adepte", + "adéquat", + "adhésif", + "adjectif", + "adjuger", + "admettre", + "admirer", + "adopter", + "adorer", + "adoucir", + "adresse", + "adroit", + "adulte", + "adverbe", + "aérer", + "aéronef", + "affaire", + "affecter", + "affiche", + "affreux", + "affubler", + "agacer", + "agencer", + "agile", + "agiter", + "agrafer", + "agréable", + "agrume", + "aider", + "aiguille", + "ailier", + "aimable", + "aisance", + "ajouter", + "ajuster", + "alarmer", + "alchimie", + "alerte", + "algèbre", + "algue", + "aliéner", + "aliment", + "alléger", + "alliage", + "allouer", + "allumer", + "alourdir", + "alpaga", + "altesse", + "alvéole", + "amateur", + "ambigu", + "ambre", + "aménager", + "amertume", + "amidon", + "amiral", + "amorcer", + "amour", + "amovible", + "amphibie", + "ampleur", + "amusant", + "analyse", + "anaphore", + "anarchie", + "anatomie", + "ancien", + "anéantir", + "angle", + "angoisse", + "anguleux", + "animal", + "annexer", + "annonce", + "annuel", + "anodin", + "anomalie", + "anonyme", + "anormal", + "antenne", + "antidote", + "anxieux", + "apaiser", + "apéritif", + "aplanir", + "apologie", + "appareil", + "appeler", + "apporter", + "appuyer", + "aquarium", + "aqueduc", + "arbitre", + "arbuste", + "ardeur", + "ardoise", + "argent", + "arlequin", + "armature", + "armement", + "armoire", + "armure", + "arpenter", + "arracher", + "arriver", + "arroser", + "arsenic", + "artériel", + "article", + "aspect", + "asphalte", + "aspirer", + "assaut", + "asservir", + "assiette", + "associer", + "assurer", + "asticot", + "astre", + "astuce", + "atelier", + "atome", + "atrium", + "atroce", + "attaque", + "attentif", + "attirer", + "attraper", + "aubaine", + "auberge", + "audace", + "audible", + "augurer", + "aurore", + "automne", + "autruche", + "avaler", + "avancer", + "avarice", + "avenir", + "averse", + "aveugle", + "aviateur", + "avide", + "avion", + "aviser", + "avoine", + "avouer", + "avril", + "axial", + "axiome", + "badge", + "bafouer", + "bagage", + "baguette", + "baignade", + "balancer", + "balcon", + "baleine", + "balisage", + "bambin", + "bancaire", + "bandage", + "banlieue", + "bannière", + "banquier", + "barbier", + "baril", + "baron", + "barque", + "barrage", + "bassin", + "bastion", + "bataille", + "bateau", + "batterie", + "baudrier", + "bavarder", + "belette", + "bélier", + "belote", + "bénéfice", + "berceau", + "berger", + "berline", + "bermuda", + "besace", + "besogne", + "bétail", + "beurre", + "biberon", + "bicycle", + "bidule", + "bijou", + "bilan", + "bilingue", + "billard", + "binaire", + "biologie", + "biopsie", + "biotype", + "biscuit", + "bison", + "bistouri", + "bitume", + "bizarre", + "blafard", + "blague", + "blanchir", + "blessant", + "blinder", + "blond", + "bloquer", + "blouson", + "bobard", + "bobine", + "boire", + "boiser", + "bolide", + "bonbon", + "bondir", + "bonheur", + "bonifier", + "bonus", + "bordure", + "borne", + "botte", + "boucle", + "boueux", + "bougie", + "boulon", + "bouquin", + "bourse", + "boussole", + "boutique", + "boxeur", + "branche", + "brasier", + "brave", + "brebis", + "brèche", + "breuvage", + "bricoler", + "brigade", + "brillant", + "brioche", + "brique", + "brochure", + "broder", + "bronzer", + "brousse", + "broyeur", + "brume", + "brusque", + "brutal", + "bruyant", + "buffle", + "buisson", + "bulletin", + "bureau", + "burin", + "bustier", + "butiner", + "butoir", + "buvable", + "buvette", + "cabanon", + "cabine", + "cachette", + "cadeau", + "cadre", + "caféine", + "caillou", + "caisson", + "calculer", + "calepin", + "calibre", + "calmer", + "calomnie", + "calvaire", + "camarade", + "caméra", + "camion", + "campagne", + "canal", + "caneton", + "canon", + "cantine", + "canular", + "capable", + "caporal", + "caprice", + "capsule", + "capter", + "capuche", + "carabine", + "carbone", + "caresser", + "caribou", + "carnage", + "carotte", + "carreau", + "carton", + "cascade", + "casier", + "casque", + "cassure", + "causer", + "caution", + "cavalier", + "caverne", + "caviar", + "cédille", + "ceinture", + "céleste", + "cellule", + "cendrier", + "censurer", + "central", + "cercle", + "cérébral", + "cerise", + "cerner", + "cerveau", + "cesser", + "chagrin", + "chaise", + "chaleur", + "chambre", + "chance", + "chapitre", + "charbon", + "chasseur", + "chaton", + "chausson", + "chavirer", + "chemise", + "chenille", + "chéquier", + "chercher", + "cheval", + "chien", + "chiffre", + "chignon", + "chimère", + "chiot", + "chlorure", + "chocolat", + "choisir", + "chose", + "chouette", + "chrome", + "chute", + "cigare", + "cigogne", + "cimenter", + "cinéma", + "cintrer", + "circuler", + "cirer", + "cirque", + "citerne", + "citoyen", + "citron", + "civil", + "clairon", + "clameur", + "claquer", + "classe", + "clavier", + "client", + "cligner", + "climat", + "clivage", + "cloche", + "clonage", + "cloporte", + "cobalt", + "cobra", + "cocasse", + "cocotier", + "coder", + "codifier", + "coffre", + "cogner", + "cohésion", + "coiffer", + "coincer", + "colère", + "colibri", + "colline", + "colmater", + "colonel", + "combat", + "comédie", + "commande", + "compact", + "concert", + "conduire", + "confier", + "congeler", + "connoter", + "consonne", + "contact", + "convexe", + "copain", + "copie", + "corail", + "corbeau", + "cordage", + "corniche", + "corpus", + "correct", + "cortège", + "cosmique", + "costume", + "coton", + "coude", + "coupure", + "courage", + "couteau", + "couvrir", + "coyote", + "crabe", + "crainte", + "cravate", + "crayon", + "créature", + "créditer", + "crémeux", + "creuser", + "crevette", + "cribler", + "crier", + "cristal", + "critère", + "croire", + "croquer", + "crotale", + "crucial", + "cruel", + "crypter", + "cubique", + "cueillir", + "cuillère", + "cuisine", + "cuivre", + "culminer", + "cultiver", + "cumuler", + "cupide", + "curatif", + "curseur", + "cyanure", + "cycle", + "cylindre", + "cynique", + "daigner", + "damier", + "danger", + "danseur", + "dauphin", + "débattre", + "débiter", + "déborder", + "débrider", + "débutant", + "décaler", + "décembre", + "déchirer", + "décider", + "déclarer", + "décorer", + "décrire", + "décupler", + "dédale", + "déductif", + "déesse", + "défensif", + "défiler", + "défrayer", + "dégager", + "dégivrer", + "déglutir", + "dégrafer", + "déjeuner", + "délice", + "déloger", + "demander", + "demeurer", + "démolir", + "dénicher", + "dénouer", + "dentelle", + "dénuder", + "départ", + "dépenser", + "déphaser", + "déplacer", + "déposer", + "déranger", + "dérober", + "désastre", + "descente", + "désert", + "désigner", + "désobéir", + "dessiner", + "destrier", + "détacher", + "détester", + "détourer", + "détresse", + "devancer", + "devenir", + "deviner", + "devoir", + "diable", + "dialogue", + "diamant", + "dicter", + "différer", + "digérer", + "digital", + "digne", + "diluer", + "dimanche", + "diminuer", + "dioxyde", + "directif", + "diriger", + "discuter", + "disposer", + "dissiper", + "distance", + "divertir", + "diviser", + "docile", + "docteur", + "dogme", + "doigt", + "domaine", + "domicile", + "dompter", + "donateur", + "donjon", + "donner", + "dopamine", + "dortoir", + "dorure", + "dosage", + "doseur", + "dossier", + "dotation", + "douanier", + "double", + "douceur", + "douter", + "doyen", + "dragon", + "draper", + "dresser", + "dribbler", + "droiture", + "duperie", + "duplexe", + "durable", + "durcir", + "dynastie", + "éblouir", + "écarter", + "écharpe", + "échelle", + "éclairer", + "éclipse", + "éclore", + "écluse", + "école", + "économie", + "écorce", + "écouter", + "écraser", + "écrémer", + "écrivain", + "écrou", + "écume", + "écureuil", + "édifier", + "éduquer", + "effacer", + "effectif", + "effigie", + "effort", + "effrayer", + "effusion", + "égaliser", + "égarer", + "éjecter", + "élaborer", + "élargir", + "électron", + "élégant", + "éléphant", + "élève", + "éligible", + "élitisme", + "éloge", + "élucider", + "éluder", + "emballer", + "embellir", + "embryon", + "émeraude", + "émission", + "emmener", + "émotion", + "émouvoir", + "empereur", + "employer", + "emporter", + "emprise", + "émulsion", + "encadrer", + "enchère", + "enclave", + "encoche", + "endiguer", + "endosser", + "endroit", + "enduire", + "énergie", + "enfance", + "enfermer", + "enfouir", + "engager", + "engin", + "englober", + "énigme", + "enjamber", + "enjeu", + "enlever", + "ennemi", + "ennuyeux", + "enrichir", + "enrobage", + "enseigne", + "entasser", + "entendre", + "entier", + "entourer", + "entraver", + "énumérer", + "envahir", + "enviable", + "envoyer", + "enzyme", + "éolien", + "épaissir", + "épargne", + "épatant", + "épaule", + "épicerie", + "épidémie", + "épier", + "épilogue", + "épine", + "épisode", + "épitaphe", + "époque", + "épreuve", + "éprouver", + "épuisant", + "équerre", + "équipe", + "ériger", + "érosion", + "erreur", + "éruption", + "escalier", + "espadon", + "espèce", + "espiègle", + "espoir", + "esprit", + "esquiver", + "essayer", + "essence", + "essieu", + "essorer", + "estime", + "estomac", + "estrade", + "étagère", + "étaler", + "étanche", + "étatique", + "éteindre", + "étendoir", + "éternel", + "éthanol", + "éthique", + "ethnie", + "étirer", + "étoffer", + "étoile", + "étonnant", + "étourdir", + "étrange", + "étroit", + "étude", + "euphorie", + "évaluer", + "évasion", + "éventail", + "évidence", + "éviter", + "évolutif", + "évoquer", + "exact", + "exagérer", + "exaucer", + "exceller", + "excitant", + "exclusif", + "excuse", + "exécuter", + "exemple", + "exercer", + "exhaler", + "exhorter", + "exigence", + "exiler", + "exister", + "exotique", + "expédier", + "explorer", + "exposer", + "exprimer", + "exquis", + "extensif", + "extraire", + "exulter", + "fable", + "fabuleux", + "facette", + "facile", + "facture", + "faiblir", + "falaise", + "fameux", + "famille", + "farceur", + "farfelu", + "farine", + "farouche", + "fasciner", + "fatal", + "fatigue", + "faucon", + "fautif", + "faveur", + "favori", + "fébrile", + "féconder", + "fédérer", + "félin", + "femme", + "fémur", + "fendoir", + "féodal", + "fermer", + "féroce", + "ferveur", + "festival", + "feuille", + "feutre", + "février", + "fiasco", + "ficeler", + "fictif", + "fidèle", + "figure", + "filature", + "filetage", + "filière", + "filleul", + "filmer", + "filou", + "filtrer", + "financer", + "finir", + "fiole", + "firme", + "fissure", + "fixer", + "flairer", + "flamme", + "flasque", + "flatteur", + "fléau", + "flèche", + "fleur", + "flexion", + "flocon", + "flore", + "fluctuer", + "fluide", + "fluvial", + "folie", + "fonderie", + "fongible", + "fontaine", + "forcer", + "forgeron", + "formuler", + "fortune", + "fossile", + "foudre", + "fougère", + "fouiller", + "foulure", + "fourmi", + "fragile", + "fraise", + "franchir", + "frapper", + "frayeur", + "frégate", + "freiner", + "frelon", + "frémir", + "frénésie", + "frère", + "friable", + "friction", + "frisson", + "frivole", + "froid", + "fromage", + "frontal", + "frotter", + "fruit", + "fugitif", + "fuite", + "fureur", + "furieux", + "furtif", + "fusion", + "futur", + "gagner", + "galaxie", + "galerie", + "gambader", + "garantir", + "gardien", + "garnir", + "garrigue", + "gazelle", + "gazon", + "géant", + "gélatine", + "gélule", + "gendarme", + "général", + "génie", + "genou", + "gentil", + "géologie", + "géomètre", + "géranium", + "germe", + "gestuel", + "geyser", + "gibier", + "gicler", + "girafe", + "givre", + "glace", + "glaive", + "glisser", + "globe", + "gloire", + "glorieux", + "golfeur", + "gomme", + "gonfler", + "gorge", + "gorille", + "goudron", + "gouffre", + "goulot", + "goupille", + "gourmand", + "goutte", + "graduel", + "graffiti", + "graine", + "grand", + "grappin", + "gratuit", + "gravir", + "grenat", + "griffure", + "griller", + "grimper", + "grogner", + "gronder", + "grotte", + "groupe", + "gruger", + "grutier", + "gruyère", + "guépard", + "guerrier", + "guide", + "guimauve", + "guitare", + "gustatif", + "gymnaste", + "gyrostat", + "habitude", + "hachoir", + "halte", + "hameau", + "hangar", + "hanneton", + "haricot", + "harmonie", + "harpon", + "hasard", + "hélium", + "hématome", + "herbe", + "hérisson", + "hermine", + "héron", + "hésiter", + "heureux", + "hiberner", + "hibou", + "hilarant", + "histoire", + "hiver", + "homard", + "hommage", + "homogène", + "honneur", + "honorer", + "honteux", + "horde", + "horizon", + "horloge", + "hormone", + "horrible", + "houleux", + "housse", + "hublot", + "huileux", + "humain", + "humble", + "humide", + "humour", + "hurler", + "hydromel", + "hygiène", + "hymne", + "hypnose", + "idylle", + "ignorer", + "iguane", + "illicite", + "illusion", + "image", + "imbiber", + "imiter", + "immense", + "immobile", + "immuable", + "impact", + "impérial", + "implorer", + "imposer", + "imprimer", + "imputer", + "incarner", + "incendie", + "incident", + "incliner", + "incolore", + "indexer", + "indice", + "inductif", + "inédit", + "ineptie", + "inexact", + "infini", + "infliger", + "informer", + "infusion", + "ingérer", + "inhaler", + "inhiber", + "injecter", + "injure", + "innocent", + "inoculer", + "inonder", + "inscrire", + "insecte", + "insigne", + "insolite", + "inspirer", + "instinct", + "insulter", + "intact", + "intense", + "intime", + "intrigue", + "intuitif", + "inutile", + "invasion", + "inventer", + "inviter", + "invoquer", + "ironique", + "irradier", + "irréel", + "irriter", + "isoler", + "ivoire", + "ivresse", + "jaguar", + "jaillir", + "jambe", + "janvier", + "jardin", + "jauger", + "jaune", + "javelot", + "jetable", + "jeton", + "jeudi", + "jeunesse", + "joindre", + "joncher", + "jongler", + "joueur", + "jouissif", + "journal", + "jovial", + "joyau", + "joyeux", + "jubiler", + "jugement", + "junior", + "jupon", + "juriste", + "justice", + "juteux", + "juvénile", + "kayak", + "kimono", + "kiosque", + "label", + "labial", + "labourer", + "lacérer", + "lactose", + "lagune", + "laine", + "laisser", + "laitier", + "lambeau", + "lamelle", + "lampe", + "lanceur", + "langage", + "lanterne", + "lapin", + "largeur", + "larme", + "laurier", + "lavabo", + "lavoir", + "lecture", + "légal", + "léger", + "légume", + "lessive", + "lettre", + "levier", + "lexique", + "lézard", + "liasse", + "libérer", + "libre", + "licence", + "licorne", + "liège", + "lièvre", + "ligature", + "ligoter", + "ligue", + "limer", + "limite", + "limonade", + "limpide", + "linéaire", + "lingot", + "lionceau", + "liquide", + "lisière", + "lister", + "lithium", + "litige", + "littoral", + "livreur", + "logique", + "lointain", + "loisir", + "lombric", + "loterie", + "louer", + "lourd", + "loutre", + "louve", + "loyal", + "lubie", + "lucide", + "lucratif", + "lueur", + "lugubre", + "luisant", + "lumière", + "lunaire", + "lundi", + "luron", + "lutter", + "luxueux", + "machine", + "magasin", + "magenta", + "magique", + "maigre", + "maillon", + "maintien", + "mairie", + "maison", + "majorer", + "malaxer", + "maléfice", + "malheur", + "malice", + "mallette", + "mammouth", + "mandater", + "maniable", + "manquant", + "manteau", + "manuel", + "marathon", + "marbre", + "marchand", + "mardi", + "maritime", + "marqueur", + "marron", + "marteler", + "mascotte", + "massif", + "matériel", + "matière", + "matraque", + "maudire", + "maussade", + "mauve", + "maximal", + "méchant", + "méconnu", + "médaille", + "médecin", + "méditer", + "méduse", + "meilleur", + "mélange", + "mélodie", + "membre", + "mémoire", + "menacer", + "mener", + "menhir", + "mensonge", + "mentor", + "mercredi", + "mérite", + "merle", + "messager", + "mesure", + "métal", + "météore", + "méthode", + "métier", + "meuble", + "miauler", + "microbe", + "miette", + "mignon", + "migrer", + "milieu", + "million", + "mimique", + "mince", + "minéral", + "minimal", + "minorer", + "minute", + "miracle", + "miroiter", + "missile", + "mixte", + "mobile", + "moderne", + "moelleux", + "mondial", + "moniteur", + "monnaie", + "monotone", + "monstre", + "montagne", + "monument", + "moqueur", + "morceau", + "morsure", + "mortier", + "moteur", + "motif", + "mouche", + "moufle", + "moulin", + "mousson", + "mouton", + "mouvant", + "multiple", + "munition", + "muraille", + "murène", + "murmure", + "muscle", + "muséum", + "musicien", + "mutation", + "muter", + "mutuel", + "myriade", + "myrtille", + "mystère", + "mythique", + "nageur", + "nappe", + "narquois", + "narrer", + "natation", + "nation", + "nature", + "naufrage", + "nautique", + "navire", + "nébuleux", + "nectar", + "néfaste", + "négation", + "négliger", + "négocier", + "neige", + "nerveux", + "nettoyer", + "neurone", + "neutron", + "neveu", + "niche", + "nickel", + "nitrate", + "niveau", + "noble", + "nocif", + "nocturne", + "noirceur", + "noisette", + "nomade", + "nombreux", + "nommer", + "normatif", + "notable", + "notifier", + "notoire", + "nourrir", + "nouveau", + "novateur", + "novembre", + "novice", + "nuage", + "nuancer", + "nuire", + "nuisible", + "numéro", + "nuptial", + "nuque", + "nutritif", + "obéir", + "objectif", + "obliger", + "obscur", + "observer", + "obstacle", + "obtenir", + "obturer", + "occasion", + "occuper", + "océan", + "octobre", + "octroyer", + "octupler", + "oculaire", + "odeur", + "odorant", + "offenser", + "officier", + "offrir", + "ogive", + "oiseau", + "oisillon", + "olfactif", + "olivier", + "ombrage", + "omettre", + "onctueux", + "onduler", + "onéreux", + "onirique", + "opale", + "opaque", + "opérer", + "opinion", + "opportun", + "opprimer", + "opter", + "optique", + "orageux", + "orange", + "orbite", + "ordonner", + "oreille", + "organe", + "orgueil", + "orifice", + "ornement", + "orque", + "ortie", + "osciller", + "osmose", + "ossature", + "otarie", + "ouragan", + "ourson", + "outil", + "outrager", + "ouvrage", + "ovation", + "oxyde", + "oxygène", + "ozone", + "paisible", + "palace", + "palmarès", + "palourde", + "palper", + "panache", + "panda", + "pangolin", + "paniquer", + "panneau", + "panorama", + "pantalon", + "papaye", + "papier", + "papoter", + "papyrus", + "paradoxe", + "parcelle", + "paresse", + "parfumer", + "parler", + "parole", + "parrain", + "parsemer", + "partager", + "parure", + "parvenir", + "passion", + "pastèque", + "paternel", + "patience", + "patron", + "pavillon", + "pavoiser", + "payer", + "paysage", + "peigne", + "peintre", + "pelage", + "pélican", + "pelle", + "pelouse", + "peluche", + "pendule", + "pénétrer", + "pénible", + "pensif", + "pénurie", + "pépite", + "péplum", + "perdrix", + "perforer", + "période", + "permuter", + "perplexe", + "persil", + "perte", + "peser", + "pétale", + "petit", + "pétrir", + "peuple", + "pharaon", + "phobie", + "phoque", + "photon", + "phrase", + "physique", + "piano", + "pictural", + "pièce", + "pierre", + "pieuvre", + "pilote", + "pinceau", + "pipette", + "piquer", + "pirogue", + "piscine", + "piston", + "pivoter", + "pixel", + "pizza", + "placard", + "plafond", + "plaisir", + "planer", + "plaque", + "plastron", + "plateau", + "pleurer", + "plexus", + "pliage", + "plomb", + "plonger", + "pluie", + "plumage", + "pochette", + "poésie", + "poète", + "pointe", + "poirier", + "poisson", + "poivre", + "polaire", + "policier", + "pollen", + "polygone", + "pommade", + "pompier", + "ponctuel", + "pondérer", + "poney", + "portique", + "position", + "posséder", + "posture", + "potager", + "poteau", + "potion", + "pouce", + "poulain", + "poumon", + "pourpre", + "poussin", + "pouvoir", + "prairie", + "pratique", + "précieux", + "prédire", + "préfixe", + "prélude", + "prénom", + "présence", + "prétexte", + "prévoir", + "primitif", + "prince", + "prison", + "priver", + "problème", + "procéder", + "prodige", + "profond", + "progrès", + "proie", + "projeter", + "prologue", + "promener", + "propre", + "prospère", + "protéger", + "prouesse", + "proverbe", + "prudence", + "pruneau", + "psychose", + "public", + "puceron", + "puiser", + "pulpe", + "pulsar", + "punaise", + "punitif", + "pupitre", + "purifier", + "puzzle", + "pyramide", + "quasar", + "querelle", + "question", + "quiétude", + "quitter", + "quotient", + "racine", + "raconter", + "radieux", + "ragondin", + "raideur", + "raisin", + "ralentir", + "rallonge", + "ramasser", + "rapide", + "rasage", + "ratisser", + "ravager", + "ravin", + "rayonner", + "réactif", + "réagir", + "réaliser", + "réanimer", + "recevoir", + "réciter", + "réclamer", + "récolter", + "recruter", + "reculer", + "recycler", + "rédiger", + "redouter", + "refaire", + "réflexe", + "réformer", + "refrain", + "refuge", + "régalien", + "région", + "réglage", + "régulier", + "réitérer", + "rejeter", + "rejouer", + "relatif", + "relever", + "relief", + "remarque", + "remède", + "remise", + "remonter", + "remplir", + "remuer", + "renard", + "renfort", + "renifler", + "renoncer", + "rentrer", + "renvoi", + "replier", + "reporter", + "reprise", + "reptile", + "requin", + "réserve", + "résineux", + "résoudre", + "respect", + "rester", + "résultat", + "rétablir", + "retenir", + "réticule", + "retomber", + "retracer", + "réunion", + "réussir", + "revanche", + "revivre", + "révolte", + "révulsif", + "richesse", + "rideau", + "rieur", + "rigide", + "rigoler", + "rincer", + "riposter", + "risible", + "risque", + "rituel", + "rival", + "rivière", + "rocheux", + "romance", + "rompre", + "ronce", + "rondin", + "roseau", + "rosier", + "rotatif", + "rotor", + "rotule", + "rouge", + "rouille", + "rouleau", + "routine", + "royaume", + "ruban", + "rubis", + "ruche", + "ruelle", + "rugueux", + "ruiner", + "ruisseau", + "ruser", + "rustique", + "rythme", + "sabler", + "saboter", + "sabre", + "sacoche", + "safari", + "sagesse", + "saisir", + "salade", + "salive", + "salon", + "saluer", + "samedi", + "sanction", + "sanglier", + "sarcasme", + "sardine", + "saturer", + "saugrenu", + "saumon", + "sauter", + "sauvage", + "savant", + "savonner", + "scalpel", + "scandale", + "scélérat", + "scénario", + "sceptre", + "schéma", + "science", + "scinder", + "score", + "scrutin", + "sculpter", + "séance", + "sécable", + "sécher", + "secouer", + "sécréter", + "sédatif", + "séduire", + "seigneur", + "séjour", + "sélectif", + "semaine", + "sembler", + "semence", + "séminal", + "sénateur", + "sensible", + "sentence", + "séparer", + "séquence", + "serein", + "sergent", + "sérieux", + "serrure", + "sérum", + "service", + "sésame", + "sévir", + "sevrage", + "sextuple", + "sidéral", + "siècle", + "siéger", + "siffler", + "sigle", + "signal", + "silence", + "silicium", + "simple", + "sincère", + "sinistre", + "siphon", + "sirop", + "sismique", + "situer", + "skier", + "social", + "socle", + "sodium", + "soigneux", + "soldat", + "soleil", + "solitude", + "soluble", + "sombre", + "sommeil", + "somnoler", + "sonde", + "songeur", + "sonnette", + "sonore", + "sorcier", + "sortir", + "sosie", + "sottise", + "soucieux", + "soudure", + "souffle", + "soulever", + "soupape", + "source", + "soutirer", + "souvenir", + "spacieux", + "spatial", + "spécial", + "sphère", + "spiral", + "stable", + "station", + "sternum", + "stimulus", + "stipuler", + "strict", + "studieux", + "stupeur", + "styliste", + "sublime", + "substrat", + "subtil", + "subvenir", + "succès", + "sucre", + "suffixe", + "suggérer", + "suiveur", + "sulfate", + "superbe", + "supplier", + "surface", + "suricate", + "surmener", + "surprise", + "sursaut", + "survie", + "suspect", + "syllabe", + "symbole", + "symétrie", + "synapse", + "syntaxe", + "système", + "tabac", + "tablier", + "tactile", + "tailler", + "talent", + "talisman", + "talonner", + "tambour", + "tamiser", + "tangible", + "tapis", + "taquiner", + "tarder", + "tarif", + "tartine", + "tasse", + "tatami", + "tatouage", + "taupe", + "taureau", + "taxer", + "témoin", + "temporel", + "tenaille", + "tendre", + "teneur", + "tenir", + "tension", + "terminer", + "terne", + "terrible", + "tétine", + "texte", + "thème", + "théorie", + "thérapie", + "thorax", + "tibia", + "tiède", + "timide", + "tirelire", + "tiroir", + "tissu", + "titane", + "titre", + "tituber", + "toboggan", + "tolérant", + "tomate", + "tonique", + "tonneau", + "toponyme", + "torche", + "tordre", + "tornade", + "torpille", + "torrent", + "torse", + "tortue", + "totem", + "toucher", + "tournage", + "tousser", + "toxine", + "traction", + "trafic", + "tragique", + "trahir", + "train", + "trancher", + "travail", + "trèfle", + "tremper", + "trésor", + "treuil", + "triage", + "tribunal", + "tricoter", + "trilogie", + "triomphe", + "tripler", + "triturer", + "trivial", + "trombone", + "tronc", + "tropical", + "troupeau", + "tuile", + "tulipe", + "tumulte", + "tunnel", + "turbine", + "tuteur", + "tutoyer", + "tuyau", + "tympan", + "typhon", + "typique", + "tyran", + "ubuesque", + "ultime", + "ultrason", + "unanime", + "unifier", + "union", + "unique", + "unitaire", + "univers", + "uranium", + "urbain", + "urticant", + "usage", + "usine", + "usuel", + "usure", + "utile", + "utopie", + "vacarme", + "vaccin", + "vagabond", + "vague", + "vaillant", + "vaincre", + "vaisseau", + "valable", + "valise", + "vallon", + "valve", + "vampire", + "vanille", + "vapeur", + "varier", + "vaseux", + "vassal", + "vaste", + "vecteur", + "vedette", + "végétal", + "véhicule", + "veinard", + "véloce", + "vendredi", + "vénérer", + "venger", + "venimeux", + "ventouse", + "verdure", + "vérin", + "vernir", + "verrou", + "verser", + "vertu", + "veston", + "vétéran", + "vétuste", + "vexant", + "vexer", + "viaduc", + "viande", + "victoire", + "vidange", + "vidéo", + "vignette", + "vigueur", + "vilain", + "village", + "vinaigre", + "violon", + "vipère", + "virement", + "virtuose", + "virus", + "visage", + "viseur", + "vision", + "visqueux", + "visuel", + "vital", + "vitesse", + "viticole", + "vitrine", + "vivace", + "vivipare", + "vocation", + "voguer", + "voile", + "voisin", + "voiture", + "volaille", + "volcan", + "voltiger", + "volume", + "vorace", + "vortex", + "voter", + "vouloir", + "voyage", + "voyelle", + "wagon", + "xénon", + "yacht", + "zèbre", + "zénith", + "zeste", + "zoologie", +]; diff --git a/ts_src/hd/words/index.ts b/ts_src/hd/words/index.ts new file mode 100644 index 0000000..6f064d4 --- /dev/null +++ b/ts_src/hd/words/index.ts @@ -0,0 +1,37 @@ +import cs from "./chinese-simplified"; +import ct from "./chinese-traditional"; +import fr from "./french"; +import en from "./english"; +import it from "./italian"; +import jp from "./japanese"; +import sp from "./spanish"; + +export type Language = + | "simplified chinese" + | "traditional chinese" + | "english" + | "french" + | "italian" + | "japanese" + | "spanish"; + +export default function (name: Language): string[] { + switch (name) { + case "simplified chinese": + return cs; + case "traditional chinese": + return ct; + case "english": + return en; + case "french": + return fr; + case "italian": + return it; + case "japanese": + return jp; + case "spanish": + return sp; + default: + throw new Error(`Unknown language: ${name}.`); + } +} diff --git a/ts_src/hd/words/italian.ts b/ts_src/hd/words/italian.ts new file mode 100644 index 0000000..247ee56 --- /dev/null +++ b/ts_src/hd/words/italian.ts @@ -0,0 +1,2050 @@ +export default [ + "abaco", + "abbaglio", + "abbinato", + "abete", + "abisso", + "abolire", + "abrasivo", + "abrogato", + "accadere", + "accenno", + "accusato", + "acetone", + "achille", + "acido", + "acqua", + "acre", + "acrilico", + "acrobata", + "acuto", + "adagio", + "addebito", + "addome", + "adeguato", + "aderire", + "adipe", + "adottare", + "adulare", + "affabile", + "affetto", + "affisso", + "affranto", + "aforisma", + "afoso", + "africano", + "agave", + "agente", + "agevole", + "aggancio", + "agire", + "agitare", + "agonismo", + "agricolo", + "agrumeto", + "aguzzo", + "alabarda", + "alato", + "albatro", + "alberato", + "albo", + "albume", + "alce", + "alcolico", + "alettone", + "alfa", + "algebra", + "aliante", + "alibi", + "alimento", + "allagato", + "allegro", + "allievo", + "allodola", + "allusivo", + "almeno", + "alogeno", + "alpaca", + "alpestre", + "altalena", + "alterno", + "alticcio", + "altrove", + "alunno", + "alveolo", + "alzare", + "amalgama", + "amanita", + "amarena", + "ambito", + "ambrato", + "ameba", + "america", + "ametista", + "amico", + "ammasso", + "ammenda", + "ammirare", + "ammonito", + "amore", + "ampio", + "ampliare", + "amuleto", + "anacardo", + "anagrafe", + "analista", + "anarchia", + "anatra", + "anca", + "ancella", + "ancora", + "andare", + "andrea", + "anello", + "angelo", + "angolare", + "angusto", + "anima", + "annegare", + "annidato", + "anno", + "annuncio", + "anonimo", + "anticipo", + "anzi", + "apatico", + "apertura", + "apode", + "apparire", + "appetito", + "appoggio", + "approdo", + "appunto", + "aprile", + "arabica", + "arachide", + "aragosta", + "araldica", + "arancio", + "aratura", + "arazzo", + "arbitro", + "archivio", + "ardito", + "arenile", + "argento", + "argine", + "arguto", + "aria", + "armonia", + "arnese", + "arredato", + "arringa", + "arrosto", + "arsenico", + "arso", + "artefice", + "arzillo", + "asciutto", + "ascolto", + "asepsi", + "asettico", + "asfalto", + "asino", + "asola", + "aspirato", + "aspro", + "assaggio", + "asse", + "assoluto", + "assurdo", + "asta", + "astenuto", + "astice", + "astratto", + "atavico", + "ateismo", + "atomico", + "atono", + "attesa", + "attivare", + "attorno", + "attrito", + "attuale", + "ausilio", + "austria", + "autista", + "autonomo", + "autunno", + "avanzato", + "avere", + "avvenire", + "avviso", + "avvolgere", + "azione", + "azoto", + "azzimo", + "azzurro", + "babele", + "baccano", + "bacino", + "baco", + "badessa", + "badilata", + "bagnato", + "baita", + "balcone", + "baldo", + "balena", + "ballata", + "balzano", + "bambino", + "bandire", + "baraonda", + "barbaro", + "barca", + "baritono", + "barlume", + "barocco", + "basilico", + "basso", + "batosta", + "battuto", + "baule", + "bava", + "bavosa", + "becco", + "beffa", + "belgio", + "belva", + "benda", + "benevole", + "benigno", + "benzina", + "bere", + "berlina", + "beta", + "bibita", + "bici", + "bidone", + "bifido", + "biga", + "bilancia", + "bimbo", + "binocolo", + "biologo", + "bipede", + "bipolare", + "birbante", + "birra", + "biscotto", + "bisesto", + "bisnonno", + "bisonte", + "bisturi", + "bizzarro", + "blando", + "blatta", + "bollito", + "bonifico", + "bordo", + "bosco", + "botanico", + "bottino", + "bozzolo", + "braccio", + "bradipo", + "brama", + "branca", + "bravura", + "bretella", + "brevetto", + "brezza", + "briglia", + "brillante", + "brindare", + "broccolo", + "brodo", + "bronzina", + "brullo", + "bruno", + "bubbone", + "buca", + "budino", + "buffone", + "buio", + "bulbo", + "buono", + "burlone", + "burrasca", + "bussola", + "busta", + "cadetto", + "caduco", + "calamaro", + "calcolo", + "calesse", + "calibro", + "calmo", + "caloria", + "cambusa", + "camerata", + "camicia", + "cammino", + "camola", + "campale", + "canapa", + "candela", + "cane", + "canino", + "canotto", + "cantina", + "capace", + "capello", + "capitolo", + "capogiro", + "cappero", + "capra", + "capsula", + "carapace", + "carcassa", + "cardo", + "carisma", + "carovana", + "carretto", + "cartolina", + "casaccio", + "cascata", + "caserma", + "caso", + "cassone", + "castello", + "casuale", + "catasta", + "catena", + "catrame", + "cauto", + "cavillo", + "cedibile", + "cedrata", + "cefalo", + "celebre", + "cellulare", + "cena", + "cenone", + "centesimo", + "ceramica", + "cercare", + "certo", + "cerume", + "cervello", + "cesoia", + "cespo", + "ceto", + "chela", + "chiaro", + "chicca", + "chiedere", + "chimera", + "china", + "chirurgo", + "chitarra", + "ciao", + "ciclismo", + "cifrare", + "cigno", + "cilindro", + "ciottolo", + "circa", + "cirrosi", + "citrico", + "cittadino", + "ciuffo", + "civetta", + "civile", + "classico", + "clinica", + "cloro", + "cocco", + "codardo", + "codice", + "coerente", + "cognome", + "collare", + "colmato", + "colore", + "colposo", + "coltivato", + "colza", + "coma", + "cometa", + "commando", + "comodo", + "computer", + "comune", + "conciso", + "condurre", + "conferma", + "congelare", + "coniuge", + "connesso", + "conoscere", + "consumo", + "continuo", + "convegno", + "coperto", + "copione", + "coppia", + "copricapo", + "corazza", + "cordata", + "coricato", + "cornice", + "corolla", + "corpo", + "corredo", + "corsia", + "cortese", + "cosmico", + "costante", + "cottura", + "covato", + "cratere", + "cravatta", + "creato", + "credere", + "cremoso", + "crescita", + "creta", + "criceto", + "crinale", + "crisi", + "critico", + "croce", + "cronaca", + "crostata", + "cruciale", + "crusca", + "cucire", + "cuculo", + "cugino", + "cullato", + "cupola", + "curatore", + "cursore", + "curvo", + "cuscino", + "custode", + "dado", + "daino", + "dalmata", + "damerino", + "daniela", + "dannoso", + "danzare", + "datato", + "davanti", + "davvero", + "debutto", + "decennio", + "deciso", + "declino", + "decollo", + "decreto", + "dedicato", + "definito", + "deforme", + "degno", + "delegare", + "delfino", + "delirio", + "delta", + "demenza", + "denotato", + "dentro", + "deposito", + "derapata", + "derivare", + "deroga", + "descritto", + "deserto", + "desiderio", + "desumere", + "detersivo", + "devoto", + "diametro", + "dicembre", + "diedro", + "difeso", + "diffuso", + "digerire", + "digitale", + "diluvio", + "dinamico", + "dinnanzi", + "dipinto", + "diploma", + "dipolo", + "diradare", + "dire", + "dirotto", + "dirupo", + "disagio", + "discreto", + "disfare", + "disgelo", + "disposto", + "distanza", + "disumano", + "dito", + "divano", + "divelto", + "dividere", + "divorato", + "doblone", + "docente", + "doganale", + "dogma", + "dolce", + "domato", + "domenica", + "dominare", + "dondolo", + "dono", + "dormire", + "dote", + "dottore", + "dovuto", + "dozzina", + "drago", + "druido", + "dubbio", + "dubitare", + "ducale", + "duna", + "duomo", + "duplice", + "duraturo", + "ebano", + "eccesso", + "ecco", + "eclissi", + "economia", + "edera", + "edicola", + "edile", + "editoria", + "educare", + "egemonia", + "egli", + "egoismo", + "egregio", + "elaborato", + "elargire", + "elegante", + "elencato", + "eletto", + "elevare", + "elfico", + "elica", + "elmo", + "elsa", + "eluso", + "emanato", + "emblema", + "emesso", + "emiro", + "emotivo", + "emozione", + "empirico", + "emulo", + "endemico", + "enduro", + "energia", + "enfasi", + "enoteca", + "entrare", + "enzima", + "epatite", + "epilogo", + "episodio", + "epocale", + "eppure", + "equatore", + "erario", + "erba", + "erboso", + "erede", + "eremita", + "erigere", + "ermetico", + "eroe", + "erosivo", + "errante", + "esagono", + "esame", + "esanime", + "esaudire", + "esca", + "esempio", + "esercito", + "esibito", + "esigente", + "esistere", + "esito", + "esofago", + "esortato", + "esoso", + "espanso", + "espresso", + "essenza", + "esso", + "esteso", + "estimare", + "estonia", + "estroso", + "esultare", + "etilico", + "etnico", + "etrusco", + "etto", + "euclideo", + "europa", + "evaso", + "evidenza", + "evitato", + "evoluto", + "evviva", + "fabbrica", + "faccenda", + "fachiro", + "falco", + "famiglia", + "fanale", + "fanfara", + "fango", + "fantasma", + "fare", + "farfalla", + "farinoso", + "farmaco", + "fascia", + "fastoso", + "fasullo", + "faticare", + "fato", + "favoloso", + "febbre", + "fecola", + "fede", + "fegato", + "felpa", + "feltro", + "femmina", + "fendere", + "fenomeno", + "fermento", + "ferro", + "fertile", + "fessura", + "festivo", + "fetta", + "feudo", + "fiaba", + "fiducia", + "fifa", + "figurato", + "filo", + "finanza", + "finestra", + "finire", + "fiore", + "fiscale", + "fisico", + "fiume", + "flacone", + "flamenco", + "flebo", + "flemma", + "florido", + "fluente", + "fluoro", + "fobico", + "focaccia", + "focoso", + "foderato", + "foglio", + "folata", + "folclore", + "folgore", + "fondente", + "fonetico", + "fonia", + "fontana", + "forbito", + "forchetta", + "foresta", + "formica", + "fornaio", + "foro", + "fortezza", + "forzare", + "fosfato", + "fosso", + "fracasso", + "frana", + "frassino", + "fratello", + "freccetta", + "frenata", + "fresco", + "frigo", + "frollino", + "fronde", + "frugale", + "frutta", + "fucilata", + "fucsia", + "fuggente", + "fulmine", + "fulvo", + "fumante", + "fumetto", + "fumoso", + "fune", + "funzione", + "fuoco", + "furbo", + "furgone", + "furore", + "fuso", + "futile", + "gabbiano", + "gaffe", + "galateo", + "gallina", + "galoppo", + "gambero", + "gamma", + "garanzia", + "garbo", + "garofano", + "garzone", + "gasdotto", + "gasolio", + "gastrico", + "gatto", + "gaudio", + "gazebo", + "gazzella", + "geco", + "gelatina", + "gelso", + "gemello", + "gemmato", + "gene", + "genitore", + "gennaio", + "genotipo", + "gergo", + "ghepardo", + "ghiaccio", + "ghisa", + "giallo", + "gilda", + "ginepro", + "giocare", + "gioiello", + "giorno", + "giove", + "girato", + "girone", + "gittata", + "giudizio", + "giurato", + "giusto", + "globulo", + "glutine", + "gnomo", + "gobba", + "golf", + "gomito", + "gommone", + "gonfio", + "gonna", + "governo", + "gracile", + "grado", + "grafico", + "grammo", + "grande", + "grattare", + "gravoso", + "grazia", + "greca", + "gregge", + "grifone", + "grigio", + "grinza", + "grotta", + "gruppo", + "guadagno", + "guaio", + "guanto", + "guardare", + "gufo", + "guidare", + "ibernato", + "icona", + "identico", + "idillio", + "idolo", + "idra", + "idrico", + "idrogeno", + "igiene", + "ignaro", + "ignorato", + "ilare", + "illeso", + "illogico", + "illudere", + "imballo", + "imbevuto", + "imbocco", + "imbuto", + "immane", + "immerso", + "immolato", + "impacco", + "impeto", + "impiego", + "importo", + "impronta", + "inalare", + "inarcare", + "inattivo", + "incanto", + "incendio", + "inchino", + "incisivo", + "incluso", + "incontro", + "incrocio", + "incubo", + "indagine", + "india", + "indole", + "inedito", + "infatti", + "infilare", + "inflitto", + "ingaggio", + "ingegno", + "inglese", + "ingordo", + "ingrosso", + "innesco", + "inodore", + "inoltrare", + "inondato", + "insano", + "insetto", + "insieme", + "insonnia", + "insulina", + "intasato", + "intero", + "intonaco", + "intuito", + "inumidire", + "invalido", + "invece", + "invito", + "iperbole", + "ipnotico", + "ipotesi", + "ippica", + "iride", + "irlanda", + "ironico", + "irrigato", + "irrorare", + "isolato", + "isotopo", + "isterico", + "istituto", + "istrice", + "italia", + "iterare", + "labbro", + "labirinto", + "lacca", + "lacerato", + "lacrima", + "lacuna", + "laddove", + "lago", + "lampo", + "lancetta", + "lanterna", + "lardoso", + "larga", + "laringe", + "lastra", + "latenza", + "latino", + "lattuga", + "lavagna", + "lavoro", + "legale", + "leggero", + "lembo", + "lentezza", + "lenza", + "leone", + "lepre", + "lesivo", + "lessato", + "lesto", + "letterale", + "leva", + "levigato", + "libero", + "lido", + "lievito", + "lilla", + "limatura", + "limitare", + "limpido", + "lineare", + "lingua", + "liquido", + "lira", + "lirica", + "lisca", + "lite", + "litigio", + "livrea", + "locanda", + "lode", + "logica", + "lombare", + "londra", + "longevo", + "loquace", + "lorenzo", + "loto", + "lotteria", + "luce", + "lucidato", + "lumaca", + "luminoso", + "lungo", + "lupo", + "luppolo", + "lusinga", + "lusso", + "lutto", + "macabro", + "macchina", + "macero", + "macinato", + "madama", + "magico", + "maglia", + "magnete", + "magro", + "maiolica", + "malafede", + "malgrado", + "malinteso", + "malsano", + "malto", + "malumore", + "mana", + "mancia", + "mandorla", + "mangiare", + "manifesto", + "mannaro", + "manovra", + "mansarda", + "mantide", + "manubrio", + "mappa", + "maratona", + "marcire", + "maretta", + "marmo", + "marsupio", + "maschera", + "massaia", + "mastino", + "materasso", + "matricola", + "mattone", + "maturo", + "mazurca", + "meandro", + "meccanico", + "mecenate", + "medesimo", + "meditare", + "mega", + "melassa", + "melis", + "melodia", + "meninge", + "meno", + "mensola", + "mercurio", + "merenda", + "merlo", + "meschino", + "mese", + "messere", + "mestolo", + "metallo", + "metodo", + "mettere", + "miagolare", + "mica", + "micelio", + "michele", + "microbo", + "midollo", + "miele", + "migliore", + "milano", + "milite", + "mimosa", + "minerale", + "mini", + "minore", + "mirino", + "mirtillo", + "miscela", + "missiva", + "misto", + "misurare", + "mitezza", + "mitigare", + "mitra", + "mittente", + "mnemonico", + "modello", + "modifica", + "modulo", + "mogano", + "mogio", + "mole", + "molosso", + "monastero", + "monco", + "mondina", + "monetario", + "monile", + "monotono", + "monsone", + "montato", + "monviso", + "mora", + "mordere", + "morsicato", + "mostro", + "motivato", + "motosega", + "motto", + "movenza", + "movimento", + "mozzo", + "mucca", + "mucosa", + "muffa", + "mughetto", + "mugnaio", + "mulatto", + "mulinello", + "multiplo", + "mummia", + "munto", + "muovere", + "murale", + "musa", + "muscolo", + "musica", + "mutevole", + "muto", + "nababbo", + "nafta", + "nanometro", + "narciso", + "narice", + "narrato", + "nascere", + "nastrare", + "naturale", + "nautica", + "naviglio", + "nebulosa", + "necrosi", + "negativo", + "negozio", + "nemmeno", + "neofita", + "neretto", + "nervo", + "nessuno", + "nettuno", + "neutrale", + "neve", + "nevrotico", + "nicchia", + "ninfa", + "nitido", + "nobile", + "nocivo", + "nodo", + "nome", + "nomina", + "nordico", + "normale", + "norvegese", + "nostrano", + "notare", + "notizia", + "notturno", + "novella", + "nucleo", + "nulla", + "numero", + "nuovo", + "nutrire", + "nuvola", + "nuziale", + "oasi", + "obbedire", + "obbligo", + "obelisco", + "oblio", + "obolo", + "obsoleto", + "occasione", + "occhio", + "occidente", + "occorrere", + "occultare", + "ocra", + "oculato", + "odierno", + "odorare", + "offerta", + "offrire", + "offuscato", + "oggetto", + "oggi", + "ognuno", + "olandese", + "olfatto", + "oliato", + "oliva", + "ologramma", + "oltre", + "omaggio", + "ombelico", + "ombra", + "omega", + "omissione", + "ondoso", + "onere", + "onice", + "onnivoro", + "onorevole", + "onta", + "operato", + "opinione", + "opposto", + "oracolo", + "orafo", + "ordine", + "orecchino", + "orefice", + "orfano", + "organico", + "origine", + "orizzonte", + "orma", + "ormeggio", + "ornativo", + "orologio", + "orrendo", + "orribile", + "ortensia", + "ortica", + "orzata", + "orzo", + "osare", + "oscurare", + "osmosi", + "ospedale", + "ospite", + "ossa", + "ossidare", + "ostacolo", + "oste", + "otite", + "otre", + "ottagono", + "ottimo", + "ottobre", + "ovale", + "ovest", + "ovino", + "oviparo", + "ovocito", + "ovunque", + "ovviare", + "ozio", + "pacchetto", + "pace", + "pacifico", + "padella", + "padrone", + "paese", + "paga", + "pagina", + "palazzina", + "palesare", + "pallido", + "palo", + "palude", + "pandoro", + "pannello", + "paolo", + "paonazzo", + "paprica", + "parabola", + "parcella", + "parere", + "pargolo", + "pari", + "parlato", + "parola", + "partire", + "parvenza", + "parziale", + "passivo", + "pasticca", + "patacca", + "patologia", + "pattume", + "pavone", + "peccato", + "pedalare", + "pedonale", + "peggio", + "peloso", + "penare", + "pendice", + "penisola", + "pennuto", + "penombra", + "pensare", + "pentola", + "pepe", + "pepita", + "perbene", + "percorso", + "perdonato", + "perforare", + "pergamena", + "periodo", + "permesso", + "perno", + "perplesso", + "persuaso", + "pertugio", + "pervaso", + "pesatore", + "pesista", + "peso", + "pestifero", + "petalo", + "pettine", + "petulante", + "pezzo", + "piacere", + "pianta", + "piattino", + "piccino", + "picozza", + "piega", + "pietra", + "piffero", + "pigiama", + "pigolio", + "pigro", + "pila", + "pilifero", + "pillola", + "pilota", + "pimpante", + "pineta", + "pinna", + "pinolo", + "pioggia", + "piombo", + "piramide", + "piretico", + "pirite", + "pirolisi", + "pitone", + "pizzico", + "placebo", + "planare", + "plasma", + "platano", + "plenario", + "pochezza", + "poderoso", + "podismo", + "poesia", + "poggiare", + "polenta", + "poligono", + "pollice", + "polmonite", + "polpetta", + "polso", + "poltrona", + "polvere", + "pomice", + "pomodoro", + "ponte", + "popoloso", + "porfido", + "poroso", + "porpora", + "porre", + "portata", + "posa", + "positivo", + "possesso", + "postulato", + "potassio", + "potere", + "pranzo", + "prassi", + "pratica", + "precluso", + "predica", + "prefisso", + "pregiato", + "prelievo", + "premere", + "prenotare", + "preparato", + "presenza", + "pretesto", + "prevalso", + "prima", + "principe", + "privato", + "problema", + "procura", + "produrre", + "profumo", + "progetto", + "prolunga", + "promessa", + "pronome", + "proposta", + "proroga", + "proteso", + "prova", + "prudente", + "prugna", + "prurito", + "psiche", + "pubblico", + "pudica", + "pugilato", + "pugno", + "pulce", + "pulito", + "pulsante", + "puntare", + "pupazzo", + "pupilla", + "puro", + "quadro", + "qualcosa", + "quasi", + "querela", + "quota", + "raccolto", + "raddoppio", + "radicale", + "radunato", + "raffica", + "ragazzo", + "ragione", + "ragno", + "ramarro", + "ramingo", + "ramo", + "randagio", + "rantolare", + "rapato", + "rapina", + "rappreso", + "rasatura", + "raschiato", + "rasente", + "rassegna", + "rastrello", + "rata", + "ravveduto", + "reale", + "recepire", + "recinto", + "recluta", + "recondito", + "recupero", + "reddito", + "redimere", + "regalato", + "registro", + "regola", + "regresso", + "relazione", + "remare", + "remoto", + "renna", + "replica", + "reprimere", + "reputare", + "resa", + "residente", + "responso", + "restauro", + "rete", + "retina", + "retorica", + "rettifica", + "revocato", + "riassunto", + "ribadire", + "ribelle", + "ribrezzo", + "ricarica", + "ricco", + "ricevere", + "riciclato", + "ricordo", + "ricreduto", + "ridicolo", + "ridurre", + "rifasare", + "riflesso", + "riforma", + "rifugio", + "rigare", + "rigettato", + "righello", + "rilassato", + "rilevato", + "rimanere", + "rimbalzo", + "rimedio", + "rimorchio", + "rinascita", + "rincaro", + "rinforzo", + "rinnovo", + "rinomato", + "rinsavito", + "rintocco", + "rinuncia", + "rinvenire", + "riparato", + "ripetuto", + "ripieno", + "riportare", + "ripresa", + "ripulire", + "risata", + "rischio", + "riserva", + "risibile", + "riso", + "rispetto", + "ristoro", + "risultato", + "risvolto", + "ritardo", + "ritegno", + "ritmico", + "ritrovo", + "riunione", + "riva", + "riverso", + "rivincita", + "rivolto", + "rizoma", + "roba", + "robotico", + "robusto", + "roccia", + "roco", + "rodaggio", + "rodere", + "roditore", + "rogito", + "rollio", + "romantico", + "rompere", + "ronzio", + "rosolare", + "rospo", + "rotante", + "rotondo", + "rotula", + "rovescio", + "rubizzo", + "rubrica", + "ruga", + "rullino", + "rumine", + "rumoroso", + "ruolo", + "rupe", + "russare", + "rustico", + "sabato", + "sabbiare", + "sabotato", + "sagoma", + "salasso", + "saldatura", + "salgemma", + "salivare", + "salmone", + "salone", + "saltare", + "saluto", + "salvo", + "sapere", + "sapido", + "saporito", + "saraceno", + "sarcasmo", + "sarto", + "sassoso", + "satellite", + "satira", + "satollo", + "saturno", + "savana", + "savio", + "saziato", + "sbadiglio", + "sbalzo", + "sbancato", + "sbarra", + "sbattere", + "sbavare", + "sbendare", + "sbirciare", + "sbloccato", + "sbocciato", + "sbrinare", + "sbruffone", + "sbuffare", + "scabroso", + "scadenza", + "scala", + "scambiare", + "scandalo", + "scapola", + "scarso", + "scatenare", + "scavato", + "scelto", + "scenico", + "scettro", + "scheda", + "schiena", + "sciarpa", + "scienza", + "scindere", + "scippo", + "sciroppo", + "scivolo", + "sclerare", + "scodella", + "scolpito", + "scomparto", + "sconforto", + "scoprire", + "scorta", + "scossone", + "scozzese", + "scriba", + "scrollare", + "scrutinio", + "scuderia", + "scultore", + "scuola", + "scuro", + "scusare", + "sdebitare", + "sdoganare", + "seccatura", + "secondo", + "sedano", + "seggiola", + "segnalato", + "segregato", + "seguito", + "selciato", + "selettivo", + "sella", + "selvaggio", + "semaforo", + "sembrare", + "seme", + "seminato", + "sempre", + "senso", + "sentire", + "sepolto", + "sequenza", + "serata", + "serbato", + "sereno", + "serio", + "serpente", + "serraglio", + "servire", + "sestina", + "setola", + "settimana", + "sfacelo", + "sfaldare", + "sfamato", + "sfarzoso", + "sfaticato", + "sfera", + "sfida", + "sfilato", + "sfinge", + "sfocato", + "sfoderare", + "sfogo", + "sfoltire", + "sforzato", + "sfratto", + "sfruttato", + "sfuggito", + "sfumare", + "sfuso", + "sgabello", + "sgarbato", + "sgonfiare", + "sgorbio", + "sgrassato", + "sguardo", + "sibilo", + "siccome", + "sierra", + "sigla", + "signore", + "silenzio", + "sillaba", + "simbolo", + "simpatico", + "simulato", + "sinfonia", + "singolo", + "sinistro", + "sino", + "sintesi", + "sinusoide", + "sipario", + "sisma", + "sistole", + "situato", + "slitta", + "slogatura", + "sloveno", + "smarrito", + "smemorato", + "smentito", + "smeraldo", + "smilzo", + "smontare", + "smottato", + "smussato", + "snellire", + "snervato", + "snodo", + "sobbalzo", + "sobrio", + "soccorso", + "sociale", + "sodale", + "soffitto", + "sogno", + "soldato", + "solenne", + "solido", + "sollazzo", + "solo", + "solubile", + "solvente", + "somatico", + "somma", + "sonda", + "sonetto", + "sonnifero", + "sopire", + "soppeso", + "sopra", + "sorgere", + "sorpasso", + "sorriso", + "sorso", + "sorteggio", + "sorvolato", + "sospiro", + "sosta", + "sottile", + "spada", + "spalla", + "spargere", + "spatola", + "spavento", + "spazzola", + "specie", + "spedire", + "spegnere", + "spelatura", + "speranza", + "spessore", + "spettrale", + "spezzato", + "spia", + "spigoloso", + "spillato", + "spinoso", + "spirale", + "splendido", + "sportivo", + "sposo", + "spranga", + "sprecare", + "spronato", + "spruzzo", + "spuntino", + "squillo", + "sradicare", + "srotolato", + "stabile", + "stacco", + "staffa", + "stagnare", + "stampato", + "stantio", + "starnuto", + "stasera", + "statuto", + "stelo", + "steppa", + "sterzo", + "stiletto", + "stima", + "stirpe", + "stivale", + "stizzoso", + "stonato", + "storico", + "strappo", + "stregato", + "stridulo", + "strozzare", + "strutto", + "stuccare", + "stufo", + "stupendo", + "subentro", + "succoso", + "sudore", + "suggerito", + "sugo", + "sultano", + "suonare", + "superbo", + "supporto", + "surgelato", + "surrogato", + "sussurro", + "sutura", + "svagare", + "svedese", + "sveglio", + "svelare", + "svenuto", + "svezia", + "sviluppo", + "svista", + "svizzera", + "svolta", + "svuotare", + "tabacco", + "tabulato", + "tacciare", + "taciturno", + "tale", + "talismano", + "tampone", + "tannino", + "tara", + "tardivo", + "targato", + "tariffa", + "tarpare", + "tartaruga", + "tasto", + "tattico", + "taverna", + "tavolata", + "tazza", + "teca", + "tecnico", + "telefono", + "temerario", + "tempo", + "temuto", + "tendone", + "tenero", + "tensione", + "tentacolo", + "teorema", + "terme", + "terrazzo", + "terzetto", + "tesi", + "tesserato", + "testato", + "tetro", + "tettoia", + "tifare", + "tigella", + "timbro", + "tinto", + "tipico", + "tipografo", + "tiraggio", + "tiro", + "titanio", + "titolo", + "titubante", + "tizio", + "tizzone", + "toccare", + "tollerare", + "tolto", + "tombola", + "tomo", + "tonfo", + "tonsilla", + "topazio", + "topologia", + "toppa", + "torba", + "tornare", + "torrone", + "tortora", + "toscano", + "tossire", + "tostatura", + "totano", + "trabocco", + "trachea", + "trafila", + "tragedia", + "tralcio", + "tramonto", + "transito", + "trapano", + "trarre", + "trasloco", + "trattato", + "trave", + "treccia", + "tremolio", + "trespolo", + "tributo", + "tricheco", + "trifoglio", + "trillo", + "trincea", + "trio", + "tristezza", + "triturato", + "trivella", + "tromba", + "trono", + "troppo", + "trottola", + "trovare", + "truccato", + "tubatura", + "tuffato", + "tulipano", + "tumulto", + "tunisia", + "turbare", + "turchino", + "tuta", + "tutela", + "ubicato", + "uccello", + "uccisore", + "udire", + "uditivo", + "uffa", + "ufficio", + "uguale", + "ulisse", + "ultimato", + "umano", + "umile", + "umorismo", + "uncinetto", + "ungere", + "ungherese", + "unicorno", + "unificato", + "unisono", + "unitario", + "unte", + "uovo", + "upupa", + "uragano", + "urgenza", + "urlo", + "usanza", + "usato", + "uscito", + "usignolo", + "usuraio", + "utensile", + "utilizzo", + "utopia", + "vacante", + "vaccinato", + "vagabondo", + "vagliato", + "valanga", + "valgo", + "valico", + "valletta", + "valoroso", + "valutare", + "valvola", + "vampata", + "vangare", + "vanitoso", + "vano", + "vantaggio", + "vanvera", + "vapore", + "varano", + "varcato", + "variante", + "vasca", + "vedetta", + "vedova", + "veduto", + "vegetale", + "veicolo", + "velcro", + "velina", + "velluto", + "veloce", + "venato", + "vendemmia", + "vento", + "verace", + "verbale", + "vergogna", + "verifica", + "vero", + "verruca", + "verticale", + "vescica", + "vessillo", + "vestale", + "veterano", + "vetrina", + "vetusto", + "viandante", + "vibrante", + "vicenda", + "vichingo", + "vicinanza", + "vidimare", + "vigilia", + "vigneto", + "vigore", + "vile", + "villano", + "vimini", + "vincitore", + "viola", + "vipera", + "virgola", + "virologo", + "virulento", + "viscoso", + "visione", + "vispo", + "vissuto", + "visura", + "vita", + "vitello", + "vittima", + "vivanda", + "vivido", + "viziare", + "voce", + "voga", + "volatile", + "volere", + "volpe", + "voragine", + "vulcano", + "zampogna", + "zanna", + "zappato", + "zattera", + "zavorra", + "zefiro", + "zelante", + "zelo", + "zenzero", + "zerbino", + "zibetto", + "zinco", + "zircone", + "zitto", + "zolla", + "zotico", + "zucchero", + "zufolo", + "zulu", + "zuppa", +]; diff --git a/ts_src/hd/words/japanese.ts b/ts_src/hd/words/japanese.ts new file mode 100644 index 0000000..80c2734 --- /dev/null +++ b/ts_src/hd/words/japanese.ts @@ -0,0 +1,2050 @@ +export default [ + "あいこくしん", + "あいさつ", + "あいだ", + "あおぞら", + "あかちゃん", + "あきる", + "あけがた", + "あける", + "あこがれる", + "あさい", + "あさひ", + "あしあと", + "あじわう", + "あずかる", + "あずき", + "あそぶ", + "あたえる", + "あたためる", + "あたりまえ", + "あたる", + "あつい", + "あつかう", + "あっしゅく", + "あつまり", + "あつめる", + "あてな", + "あてはまる", + "あひる", + "あぶら", + "あぶる", + "あふれる", + "あまい", + "あまど", + "あまやかす", + "あまり", + "あみもの", + "あめりか", + "あやまる", + "あゆむ", + "あらいぐま", + "あらし", + "あらすじ", + "あらためる", + "あらゆる", + "あらわす", + "ありがとう", + "あわせる", + "あわてる", + "あんい", + "あんがい", + "あんこ", + "あんぜん", + "あんてい", + "あんない", + "あんまり", + "いいだす", + "いおん", + "いがい", + "いがく", + "いきおい", + "いきなり", + "いきもの", + "いきる", + "いくじ", + "いくぶん", + "いけばな", + "いけん", + "いこう", + "いこく", + "いこつ", + "いさましい", + "いさん", + "いしき", + "いじゅう", + "いじょう", + "いじわる", + "いずみ", + "いずれ", + "いせい", + "いせえび", + "いせかい", + "いせき", + "いぜん", + "いそうろう", + "いそがしい", + "いだい", + "いだく", + "いたずら", + "いたみ", + "いたりあ", + "いちおう", + "いちじ", + "いちど", + "いちば", + "いちぶ", + "いちりゅう", + "いつか", + "いっしゅん", + "いっせい", + "いっそう", + "いったん", + "いっち", + "いってい", + "いっぽう", + "いてざ", + "いてん", + "いどう", + "いとこ", + "いない", + "いなか", + "いねむり", + "いのち", + "いのる", + "いはつ", + "いばる", + "いはん", + "いびき", + "いひん", + "いふく", + "いへん", + "いほう", + "いみん", + "いもうと", + "いもたれ", + "いもり", + "いやがる", + "いやす", + "いよかん", + "いよく", + "いらい", + "いらすと", + "いりぐち", + "いりょう", + "いれい", + "いれもの", + "いれる", + "いろえんぴつ", + "いわい", + "いわう", + "いわかん", + "いわば", + "いわゆる", + "いんげんまめ", + "いんさつ", + "いんしょう", + "いんよう", + "うえき", + "うえる", + "うおざ", + "うがい", + "うかぶ", + "うかべる", + "うきわ", + "うくらいな", + "うくれれ", + "うけたまわる", + "うけつけ", + "うけとる", + "うけもつ", + "うける", + "うごかす", + "うごく", + "うこん", + "うさぎ", + "うしなう", + "うしろがみ", + "うすい", + "うすぎ", + "うすぐらい", + "うすめる", + "うせつ", + "うちあわせ", + "うちがわ", + "うちき", + "うちゅう", + "うっかり", + "うつくしい", + "うったえる", + "うつる", + "うどん", + "うなぎ", + "うなじ", + "うなずく", + "うなる", + "うねる", + "うのう", + "うぶげ", + "うぶごえ", + "うまれる", + "うめる", + "うもう", + "うやまう", + "うよく", + "うらがえす", + "うらぐち", + "うらない", + "うりあげ", + "うりきれ", + "うるさい", + "うれしい", + "うれゆき", + "うれる", + "うろこ", + "うわき", + "うわさ", + "うんこう", + "うんちん", + "うんてん", + "うんどう", + "えいえん", + "えいが", + "えいきょう", + "えいご", + "えいせい", + "えいぶん", + "えいよう", + "えいわ", + "えおり", + "えがお", + "えがく", + "えきたい", + "えくせる", + "えしゃく", + "えすて", + "えつらん", + "えのぐ", + "えほうまき", + "えほん", + "えまき", + "えもじ", + "えもの", + "えらい", + "えらぶ", + "えりあ", + "えんえん", + "えんかい", + "えんぎ", + "えんげき", + "えんしゅう", + "えんぜつ", + "えんそく", + "えんちょう", + "えんとつ", + "おいかける", + "おいこす", + "おいしい", + "おいつく", + "おうえん", + "おうさま", + "おうじ", + "おうせつ", + "おうたい", + "おうふく", + "おうべい", + "おうよう", + "おえる", + "おおい", + "おおう", + "おおどおり", + "おおや", + "おおよそ", + "おかえり", + "おかず", + "おがむ", + "おかわり", + "おぎなう", + "おきる", + "おくさま", + "おくじょう", + "おくりがな", + "おくる", + "おくれる", + "おこす", + "おこなう", + "おこる", + "おさえる", + "おさない", + "おさめる", + "おしいれ", + "おしえる", + "おじぎ", + "おじさん", + "おしゃれ", + "おそらく", + "おそわる", + "おたがい", + "おたく", + "おだやか", + "おちつく", + "おっと", + "おつり", + "おでかけ", + "おとしもの", + "おとなしい", + "おどり", + "おどろかす", + "おばさん", + "おまいり", + "おめでとう", + "おもいで", + "おもう", + "おもたい", + "おもちゃ", + "おやつ", + "おやゆび", + "およぼす", + "おらんだ", + "おろす", + "おんがく", + "おんけい", + "おんしゃ", + "おんせん", + "おんだん", + "おんちゅう", + "おんどけい", + "かあつ", + "かいが", + "がいき", + "がいけん", + "がいこう", + "かいさつ", + "かいしゃ", + "かいすいよく", + "かいぜん", + "かいぞうど", + "かいつう", + "かいてん", + "かいとう", + "かいふく", + "がいへき", + "かいほう", + "かいよう", + "がいらい", + "かいわ", + "かえる", + "かおり", + "かかえる", + "かがく", + "かがし", + "かがみ", + "かくご", + "かくとく", + "かざる", + "がぞう", + "かたい", + "かたち", + "がちょう", + "がっきゅう", + "がっこう", + "がっさん", + "がっしょう", + "かなざわし", + "かのう", + "がはく", + "かぶか", + "かほう", + "かほご", + "かまう", + "かまぼこ", + "かめれおん", + "かゆい", + "かようび", + "からい", + "かるい", + "かろう", + "かわく", + "かわら", + "がんか", + "かんけい", + "かんこう", + "かんしゃ", + "かんそう", + "かんたん", + "かんち", + "がんばる", + "きあい", + "きあつ", + "きいろ", + "ぎいん", + "きうい", + "きうん", + "きえる", + "きおう", + "きおく", + "きおち", + "きおん", + "きかい", + "きかく", + "きかんしゃ", + "ききて", + "きくばり", + "きくらげ", + "きけんせい", + "きこう", + "きこえる", + "きこく", + "きさい", + "きさく", + "きさま", + "きさらぎ", + "ぎじかがく", + "ぎしき", + "ぎじたいけん", + "ぎじにってい", + "ぎじゅつしゃ", + "きすう", + "きせい", + "きせき", + "きせつ", + "きそう", + "きぞく", + "きぞん", + "きたえる", + "きちょう", + "きつえん", + "ぎっちり", + "きつつき", + "きつね", + "きてい", + "きどう", + "きどく", + "きない", + "きなが", + "きなこ", + "きぬごし", + "きねん", + "きのう", + "きのした", + "きはく", + "きびしい", + "きひん", + "きふく", + "きぶん", + "きぼう", + "きほん", + "きまる", + "きみつ", + "きむずかしい", + "きめる", + "きもだめし", + "きもち", + "きもの", + "きゃく", + "きやく", + "ぎゅうにく", + "きよう", + "きょうりゅう", + "きらい", + "きらく", + "きりん", + "きれい", + "きれつ", + "きろく", + "ぎろん", + "きわめる", + "ぎんいろ", + "きんかくじ", + "きんじょ", + "きんようび", + "ぐあい", + "くいず", + "くうかん", + "くうき", + "くうぐん", + "くうこう", + "ぐうせい", + "くうそう", + "ぐうたら", + "くうふく", + "くうぼ", + "くかん", + "くきょう", + "くげん", + "ぐこう", + "くさい", + "くさき", + "くさばな", + "くさる", + "くしゃみ", + "くしょう", + "くすのき", + "くすりゆび", + "くせげ", + "くせん", + "ぐたいてき", + "くださる", + "くたびれる", + "くちこみ", + "くちさき", + "くつした", + "ぐっすり", + "くつろぐ", + "くとうてん", + "くどく", + "くなん", + "くねくね", + "くのう", + "くふう", + "くみあわせ", + "くみたてる", + "くめる", + "くやくしょ", + "くらす", + "くらべる", + "くるま", + "くれる", + "くろう", + "くわしい", + "ぐんかん", + "ぐんしょく", + "ぐんたい", + "ぐんて", + "けあな", + "けいかく", + "けいけん", + "けいこ", + "けいさつ", + "げいじゅつ", + "けいたい", + "げいのうじん", + "けいれき", + "けいろ", + "けおとす", + "けおりもの", + "げきか", + "げきげん", + "げきだん", + "げきちん", + "げきとつ", + "げきは", + "げきやく", + "げこう", + "げこくじょう", + "げざい", + "けさき", + "げざん", + "けしき", + "けしごむ", + "けしょう", + "げすと", + "けたば", + "けちゃっぷ", + "けちらす", + "けつあつ", + "けつい", + "けつえき", + "けっこん", + "けつじょ", + "けっせき", + "けってい", + "けつまつ", + "げつようび", + "げつれい", + "けつろん", + "げどく", + "けとばす", + "けとる", + "けなげ", + "けなす", + "けなみ", + "けぬき", + "げねつ", + "けねん", + "けはい", + "げひん", + "けぶかい", + "げぼく", + "けまり", + "けみかる", + "けむし", + "けむり", + "けもの", + "けらい", + "けろけろ", + "けわしい", + "けんい", + "けんえつ", + "けんお", + "けんか", + "げんき", + "けんげん", + "けんこう", + "けんさく", + "けんしゅう", + "けんすう", + "げんそう", + "けんちく", + "けんてい", + "けんとう", + "けんない", + "けんにん", + "げんぶつ", + "けんま", + "けんみん", + "けんめい", + "けんらん", + "けんり", + "こあくま", + "こいぬ", + "こいびと", + "ごうい", + "こうえん", + "こうおん", + "こうかん", + "ごうきゅう", + "ごうけい", + "こうこう", + "こうさい", + "こうじ", + "こうすい", + "ごうせい", + "こうそく", + "こうたい", + "こうちゃ", + "こうつう", + "こうてい", + "こうどう", + "こうない", + "こうはい", + "ごうほう", + "ごうまん", + "こうもく", + "こうりつ", + "こえる", + "こおり", + "ごかい", + "ごがつ", + "ごかん", + "こくご", + "こくさい", + "こくとう", + "こくない", + "こくはく", + "こぐま", + "こけい", + "こける", + "ここのか", + "こころ", + "こさめ", + "こしつ", + "こすう", + "こせい", + "こせき", + "こぜん", + "こそだて", + "こたい", + "こたえる", + "こたつ", + "こちょう", + "こっか", + "こつこつ", + "こつばん", + "こつぶ", + "こてい", + "こてん", + "ことがら", + "ことし", + "ことば", + "ことり", + "こなごな", + "こねこね", + "このまま", + "このみ", + "このよ", + "ごはん", + "こひつじ", + "こふう", + "こふん", + "こぼれる", + "ごまあぶら", + "こまかい", + "ごますり", + "こまつな", + "こまる", + "こむぎこ", + "こもじ", + "こもち", + "こもの", + "こもん", + "こやく", + "こやま", + "こゆう", + "こゆび", + "こよい", + "こよう", + "こりる", + "これくしょん", + "ころっけ", + "こわもて", + "こわれる", + "こんいん", + "こんかい", + "こんき", + "こんしゅう", + "こんすい", + "こんだて", + "こんとん", + "こんなん", + "こんびに", + "こんぽん", + "こんまけ", + "こんや", + "こんれい", + "こんわく", + "ざいえき", + "さいかい", + "さいきん", + "ざいげん", + "ざいこ", + "さいしょ", + "さいせい", + "ざいたく", + "ざいちゅう", + "さいてき", + "ざいりょう", + "さうな", + "さかいし", + "さがす", + "さかな", + "さかみち", + "さがる", + "さぎょう", + "さくし", + "さくひん", + "さくら", + "さこく", + "さこつ", + "さずかる", + "ざせき", + "さたん", + "さつえい", + "ざつおん", + "ざっか", + "ざつがく", + "さっきょく", + "ざっし", + "さつじん", + "ざっそう", + "さつたば", + "さつまいも", + "さてい", + "さといも", + "さとう", + "さとおや", + "さとし", + "さとる", + "さのう", + "さばく", + "さびしい", + "さべつ", + "さほう", + "さほど", + "さます", + "さみしい", + "さみだれ", + "さむけ", + "さめる", + "さやえんどう", + "さゆう", + "さよう", + "さよく", + "さらだ", + "ざるそば", + "さわやか", + "さわる", + "さんいん", + "さんか", + "さんきゃく", + "さんこう", + "さんさい", + "ざんしょ", + "さんすう", + "さんせい", + "さんそ", + "さんち", + "さんま", + "さんみ", + "さんらん", + "しあい", + "しあげ", + "しあさって", + "しあわせ", + "しいく", + "しいん", + "しうち", + "しえい", + "しおけ", + "しかい", + "しかく", + "じかん", + "しごと", + "しすう", + "じだい", + "したうけ", + "したぎ", + "したて", + "したみ", + "しちょう", + "しちりん", + "しっかり", + "しつじ", + "しつもん", + "してい", + "してき", + "してつ", + "じてん", + "じどう", + "しなぎれ", + "しなもの", + "しなん", + "しねま", + "しねん", + "しのぐ", + "しのぶ", + "しはい", + "しばかり", + "しはつ", + "しはらい", + "しはん", + "しひょう", + "しふく", + "じぶん", + "しへい", + "しほう", + "しほん", + "しまう", + "しまる", + "しみん", + "しむける", + "じむしょ", + "しめい", + "しめる", + "しもん", + "しゃいん", + "しゃうん", + "しゃおん", + "じゃがいも", + "しやくしょ", + "しゃくほう", + "しゃけん", + "しゃこ", + "しゃざい", + "しゃしん", + "しゃせん", + "しゃそう", + "しゃたい", + "しゃちょう", + "しゃっきん", + "じゃま", + "しゃりん", + "しゃれい", + "じゆう", + "じゅうしょ", + "しゅくはく", + "じゅしん", + "しゅっせき", + "しゅみ", + "しゅらば", + "じゅんばん", + "しょうかい", + "しょくたく", + "しょっけん", + "しょどう", + "しょもつ", + "しらせる", + "しらべる", + "しんか", + "しんこう", + "じんじゃ", + "しんせいじ", + "しんちく", + "しんりん", + "すあげ", + "すあし", + "すあな", + "ずあん", + "すいえい", + "すいか", + "すいとう", + "ずいぶん", + "すいようび", + "すうがく", + "すうじつ", + "すうせん", + "すおどり", + "すきま", + "すくう", + "すくない", + "すける", + "すごい", + "すこし", + "ずさん", + "すずしい", + "すすむ", + "すすめる", + "すっかり", + "ずっしり", + "ずっと", + "すてき", + "すてる", + "すねる", + "すのこ", + "すはだ", + "すばらしい", + "ずひょう", + "ずぶぬれ", + "すぶり", + "すふれ", + "すべて", + "すべる", + "ずほう", + "すぼん", + "すまい", + "すめし", + "すもう", + "すやき", + "すらすら", + "するめ", + "すれちがう", + "すろっと", + "すわる", + "すんぜん", + "すんぽう", + "せあぶら", + "せいかつ", + "せいげん", + "せいじ", + "せいよう", + "せおう", + "せかいかん", + "せきにん", + "せきむ", + "せきゆ", + "せきらんうん", + "せけん", + "せこう", + "せすじ", + "せたい", + "せたけ", + "せっかく", + "せっきゃく", + "ぜっく", + "せっけん", + "せっこつ", + "せっさたくま", + "せつぞく", + "せつだん", + "せつでん", + "せっぱん", + "せつび", + "せつぶん", + "せつめい", + "せつりつ", + "せなか", + "せのび", + "せはば", + "せびろ", + "せぼね", + "せまい", + "せまる", + "せめる", + "せもたれ", + "せりふ", + "ぜんあく", + "せんい", + "せんえい", + "せんか", + "せんきょ", + "せんく", + "せんげん", + "ぜんご", + "せんさい", + "せんしゅ", + "せんすい", + "せんせい", + "せんぞ", + "せんたく", + "せんちょう", + "せんてい", + "せんとう", + "せんぬき", + "せんねん", + "せんぱい", + "ぜんぶ", + "ぜんぽう", + "せんむ", + "せんめんじょ", + "せんもん", + "せんやく", + "せんゆう", + "せんよう", + "ぜんら", + "ぜんりゃく", + "せんれい", + "せんろ", + "そあく", + "そいとげる", + "そいね", + "そうがんきょう", + "そうき", + "そうご", + "そうしん", + "そうだん", + "そうなん", + "そうび", + "そうめん", + "そうり", + "そえもの", + "そえん", + "そがい", + "そげき", + "そこう", + "そこそこ", + "そざい", + "そしな", + "そせい", + "そせん", + "そそぐ", + "そだてる", + "そつう", + "そつえん", + "そっかん", + "そつぎょう", + "そっけつ", + "そっこう", + "そっせん", + "そっと", + "そとがわ", + "そとづら", + "そなえる", + "そなた", + "そふぼ", + "そぼく", + "そぼろ", + "そまつ", + "そまる", + "そむく", + "そむりえ", + "そめる", + "そもそも", + "そよかぜ", + "そらまめ", + "そろう", + "そんかい", + "そんけい", + "そんざい", + "そんしつ", + "そんぞく", + "そんちょう", + "ぞんび", + "ぞんぶん", + "そんみん", + "たあい", + "たいいん", + "たいうん", + "たいえき", + "たいおう", + "だいがく", + "たいき", + "たいぐう", + "たいけん", + "たいこ", + "たいざい", + "だいじょうぶ", + "だいすき", + "たいせつ", + "たいそう", + "だいたい", + "たいちょう", + "たいてい", + "だいどころ", + "たいない", + "たいねつ", + "たいのう", + "たいはん", + "だいひょう", + "たいふう", + "たいへん", + "たいほ", + "たいまつばな", + "たいみんぐ", + "たいむ", + "たいめん", + "たいやき", + "たいよう", + "たいら", + "たいりょく", + "たいる", + "たいわん", + "たうえ", + "たえる", + "たおす", + "たおる", + "たおれる", + "たかい", + "たかね", + "たきび", + "たくさん", + "たこく", + "たこやき", + "たさい", + "たしざん", + "だじゃれ", + "たすける", + "たずさわる", + "たそがれ", + "たたかう", + "たたく", + "ただしい", + "たたみ", + "たちばな", + "だっかい", + "だっきゃく", + "だっこ", + "だっしゅつ", + "だったい", + "たてる", + "たとえる", + "たなばた", + "たにん", + "たぬき", + "たのしみ", + "たはつ", + "たぶん", + "たべる", + "たぼう", + "たまご", + "たまる", + "だむる", + "ためいき", + "ためす", + "ためる", + "たもつ", + "たやすい", + "たよる", + "たらす", + "たりきほんがん", + "たりょう", + "たりる", + "たると", + "たれる", + "たれんと", + "たろっと", + "たわむれる", + "だんあつ", + "たんい", + "たんおん", + "たんか", + "たんき", + "たんけん", + "たんご", + "たんさん", + "たんじょうび", + "だんせい", + "たんそく", + "たんたい", + "だんち", + "たんてい", + "たんとう", + "だんな", + "たんにん", + "だんねつ", + "たんのう", + "たんぴん", + "だんぼう", + "たんまつ", + "たんめい", + "だんれつ", + "だんろ", + "だんわ", + "ちあい", + "ちあん", + "ちいき", + "ちいさい", + "ちえん", + "ちかい", + "ちから", + "ちきゅう", + "ちきん", + "ちけいず", + "ちけん", + "ちこく", + "ちさい", + "ちしき", + "ちしりょう", + "ちせい", + "ちそう", + "ちたい", + "ちたん", + "ちちおや", + "ちつじょ", + "ちてき", + "ちてん", + "ちぬき", + "ちぬり", + "ちのう", + "ちひょう", + "ちへいせん", + "ちほう", + "ちまた", + "ちみつ", + "ちみどろ", + "ちめいど", + "ちゃんこなべ", + "ちゅうい", + "ちゆりょく", + "ちょうし", + "ちょさくけん", + "ちらし", + "ちらみ", + "ちりがみ", + "ちりょう", + "ちるど", + "ちわわ", + "ちんたい", + "ちんもく", + "ついか", + "ついたち", + "つうか", + "つうじょう", + "つうはん", + "つうわ", + "つかう", + "つかれる", + "つくね", + "つくる", + "つけね", + "つける", + "つごう", + "つたえる", + "つづく", + "つつじ", + "つつむ", + "つとめる", + "つながる", + "つなみ", + "つねづね", + "つのる", + "つぶす", + "つまらない", + "つまる", + "つみき", + "つめたい", + "つもり", + "つもる", + "つよい", + "つるぼ", + "つるみく", + "つわもの", + "つわり", + "てあし", + "てあて", + "てあみ", + "ていおん", + "ていか", + "ていき", + "ていけい", + "ていこく", + "ていさつ", + "ていし", + "ていせい", + "ていたい", + "ていど", + "ていねい", + "ていひょう", + "ていへん", + "ていぼう", + "てうち", + "ておくれ", + "てきとう", + "てくび", + "でこぼこ", + "てさぎょう", + "てさげ", + "てすり", + "てそう", + "てちがい", + "てちょう", + "てつがく", + "てつづき", + "でっぱ", + "てつぼう", + "てつや", + "でぬかえ", + "てぬき", + "てぬぐい", + "てのひら", + "てはい", + "てぶくろ", + "てふだ", + "てほどき", + "てほん", + "てまえ", + "てまきずし", + "てみじか", + "てみやげ", + "てらす", + "てれび", + "てわけ", + "てわたし", + "でんあつ", + "てんいん", + "てんかい", + "てんき", + "てんぐ", + "てんけん", + "てんごく", + "てんさい", + "てんし", + "てんすう", + "でんち", + "てんてき", + "てんとう", + "てんない", + "てんぷら", + "てんぼうだい", + "てんめつ", + "てんらんかい", + "でんりょく", + "でんわ", + "どあい", + "といれ", + "どうかん", + "とうきゅう", + "どうぐ", + "とうし", + "とうむぎ", + "とおい", + "とおか", + "とおく", + "とおす", + "とおる", + "とかい", + "とかす", + "ときおり", + "ときどき", + "とくい", + "とくしゅう", + "とくてん", + "とくに", + "とくべつ", + "とけい", + "とける", + "とこや", + "とさか", + "としょかん", + "とそう", + "とたん", + "とちゅう", + "とっきゅう", + "とっくん", + "とつぜん", + "とつにゅう", + "とどける", + "ととのえる", + "とない", + "となえる", + "となり", + "とのさま", + "とばす", + "どぶがわ", + "とほう", + "とまる", + "とめる", + "ともだち", + "ともる", + "どようび", + "とらえる", + "とんかつ", + "どんぶり", + "ないかく", + "ないこう", + "ないしょ", + "ないす", + "ないせん", + "ないそう", + "なおす", + "ながい", + "なくす", + "なげる", + "なこうど", + "なさけ", + "なたでここ", + "なっとう", + "なつやすみ", + "ななおし", + "なにごと", + "なにもの", + "なにわ", + "なのか", + "なふだ", + "なまいき", + "なまえ", + "なまみ", + "なみだ", + "なめらか", + "なめる", + "なやむ", + "ならう", + "ならび", + "ならぶ", + "なれる", + "なわとび", + "なわばり", + "にあう", + "にいがた", + "にうけ", + "におい", + "にかい", + "にがて", + "にきび", + "にくしみ", + "にくまん", + "にげる", + "にさんかたんそ", + "にしき", + "にせもの", + "にちじょう", + "にちようび", + "にっか", + "にっき", + "にっけい", + "にっこう", + "にっさん", + "にっしょく", + "にっすう", + "にっせき", + "にってい", + "になう", + "にほん", + "にまめ", + "にもつ", + "にやり", + "にゅういん", + "にりんしゃ", + "にわとり", + "にんい", + "にんか", + "にんき", + "にんげん", + "にんしき", + "にんずう", + "にんそう", + "にんたい", + "にんち", + "にんてい", + "にんにく", + "にんぷ", + "にんまり", + "にんむ", + "にんめい", + "にんよう", + "ぬいくぎ", + "ぬかす", + "ぬぐいとる", + "ぬぐう", + "ぬくもり", + "ぬすむ", + "ぬまえび", + "ぬめり", + "ぬらす", + "ぬんちゃく", + "ねあげ", + "ねいき", + "ねいる", + "ねいろ", + "ねぐせ", + "ねくたい", + "ねくら", + "ねこぜ", + "ねこむ", + "ねさげ", + "ねすごす", + "ねそべる", + "ねだん", + "ねつい", + "ねっしん", + "ねつぞう", + "ねったいぎょ", + "ねぶそく", + "ねふだ", + "ねぼう", + "ねほりはほり", + "ねまき", + "ねまわし", + "ねみみ", + "ねむい", + "ねむたい", + "ねもと", + "ねらう", + "ねわざ", + "ねんいり", + "ねんおし", + "ねんかん", + "ねんきん", + "ねんぐ", + "ねんざ", + "ねんし", + "ねんちゃく", + "ねんど", + "ねんぴ", + "ねんぶつ", + "ねんまつ", + "ねんりょう", + "ねんれい", + "のいず", + "のおづま", + "のがす", + "のきなみ", + "のこぎり", + "のこす", + "のこる", + "のせる", + "のぞく", + "のぞむ", + "のたまう", + "のちほど", + "のっく", + "のばす", + "のはら", + "のべる", + "のぼる", + "のみもの", + "のやま", + "のらいぬ", + "のらねこ", + "のりもの", + "のりゆき", + "のれん", + "のんき", + "ばあい", + "はあく", + "ばあさん", + "ばいか", + "ばいく", + "はいけん", + "はいご", + "はいしん", + "はいすい", + "はいせん", + "はいそう", + "はいち", + "ばいばい", + "はいれつ", + "はえる", + "はおる", + "はかい", + "ばかり", + "はかる", + "はくしゅ", + "はけん", + "はこぶ", + "はさみ", + "はさん", + "はしご", + "ばしょ", + "はしる", + "はせる", + "ぱそこん", + "はそん", + "はたん", + "はちみつ", + "はつおん", + "はっかく", + "はづき", + "はっきり", + "はっくつ", + "はっけん", + "はっこう", + "はっさん", + "はっしん", + "はったつ", + "はっちゅう", + "はってん", + "はっぴょう", + "はっぽう", + "はなす", + "はなび", + "はにかむ", + "はぶらし", + "はみがき", + "はむかう", + "はめつ", + "はやい", + "はやし", + "はらう", + "はろうぃん", + "はわい", + "はんい", + "はんえい", + "はんおん", + "はんかく", + "はんきょう", + "ばんぐみ", + "はんこ", + "はんしゃ", + "はんすう", + "はんだん", + "ぱんち", + "ぱんつ", + "はんてい", + "はんとし", + "はんのう", + "はんぱ", + "はんぶん", + "はんぺん", + "はんぼうき", + "はんめい", + "はんらん", + "はんろん", + "ひいき", + "ひうん", + "ひえる", + "ひかく", + "ひかり", + "ひかる", + "ひかん", + "ひくい", + "ひけつ", + "ひこうき", + "ひこく", + "ひさい", + "ひさしぶり", + "ひさん", + "びじゅつかん", + "ひしょ", + "ひそか", + "ひそむ", + "ひたむき", + "ひだり", + "ひたる", + "ひつぎ", + "ひっこし", + "ひっし", + "ひつじゅひん", + "ひっす", + "ひつぜん", + "ぴったり", + "ぴっちり", + "ひつよう", + "ひてい", + "ひとごみ", + "ひなまつり", + "ひなん", + "ひねる", + "ひはん", + "ひびく", + "ひひょう", + "ひほう", + "ひまわり", + "ひまん", + "ひみつ", + "ひめい", + "ひめじし", + "ひやけ", + "ひやす", + "ひよう", + "びょうき", + "ひらがな", + "ひらく", + "ひりつ", + "ひりょう", + "ひるま", + "ひるやすみ", + "ひれい", + "ひろい", + "ひろう", + "ひろき", + "ひろゆき", + "ひんかく", + "ひんけつ", + "ひんこん", + "ひんしゅ", + "ひんそう", + "ぴんち", + "ひんぱん", + "びんぼう", + "ふあん", + "ふいうち", + "ふうけい", + "ふうせん", + "ぷうたろう", + "ふうとう", + "ふうふ", + "ふえる", + "ふおん", + "ふかい", + "ふきん", + "ふくざつ", + "ふくぶくろ", + "ふこう", + "ふさい", + "ふしぎ", + "ふじみ", + "ふすま", + "ふせい", + "ふせぐ", + "ふそく", + "ぶたにく", + "ふたん", + "ふちょう", + "ふつう", + "ふつか", + "ふっかつ", + "ふっき", + "ふっこく", + "ぶどう", + "ふとる", + "ふとん", + "ふのう", + "ふはい", + "ふひょう", + "ふへん", + "ふまん", + "ふみん", + "ふめつ", + "ふめん", + "ふよう", + "ふりこ", + "ふりる", + "ふるい", + "ふんいき", + "ぶんがく", + "ぶんぐ", + "ふんしつ", + "ぶんせき", + "ふんそう", + "ぶんぽう", + "へいあん", + "へいおん", + "へいがい", + "へいき", + "へいげん", + "へいこう", + "へいさ", + "へいしゃ", + "へいせつ", + "へいそ", + "へいたく", + "へいてん", + "へいねつ", + "へいわ", + "へきが", + "へこむ", + "べにいろ", + "べにしょうが", + "へらす", + "へんかん", + "べんきょう", + "べんごし", + "へんさい", + "へんたい", + "べんり", + "ほあん", + "ほいく", + "ぼうぎょ", + "ほうこく", + "ほうそう", + "ほうほう", + "ほうもん", + "ほうりつ", + "ほえる", + "ほおん", + "ほかん", + "ほきょう", + "ぼきん", + "ほくろ", + "ほけつ", + "ほけん", + "ほこう", + "ほこる", + "ほしい", + "ほしつ", + "ほしゅ", + "ほしょう", + "ほせい", + "ほそい", + "ほそく", + "ほたて", + "ほたる", + "ぽちぶくろ", + "ほっきょく", + "ほっさ", + "ほったん", + "ほとんど", + "ほめる", + "ほんい", + "ほんき", + "ほんけ", + "ほんしつ", + "ほんやく", + "まいにち", + "まかい", + "まかせる", + "まがる", + "まける", + "まこと", + "まさつ", + "まじめ", + "ますく", + "まぜる", + "まつり", + "まとめ", + "まなぶ", + "まぬけ", + "まねく", + "まほう", + "まもる", + "まゆげ", + "まよう", + "まろやか", + "まわす", + "まわり", + "まわる", + "まんが", + "まんきつ", + "まんぞく", + "まんなか", + "みいら", + "みうち", + "みえる", + "みがく", + "みかた", + "みかん", + "みけん", + "みこん", + "みじかい", + "みすい", + "みすえる", + "みせる", + "みっか", + "みつかる", + "みつける", + "みてい", + "みとめる", + "みなと", + "みなみかさい", + "みねらる", + "みのう", + "みのがす", + "みほん", + "みもと", + "みやげ", + "みらい", + "みりょく", + "みわく", + "みんか", + "みんぞく", + "むいか", + "むえき", + "むえん", + "むかい", + "むかう", + "むかえ", + "むかし", + "むぎちゃ", + "むける", + "むげん", + "むさぼる", + "むしあつい", + "むしば", + "むじゅん", + "むしろ", + "むすう", + "むすこ", + "むすぶ", + "むすめ", + "むせる", + "むせん", + "むちゅう", + "むなしい", + "むのう", + "むやみ", + "むよう", + "むらさき", + "むりょう", + "むろん", + "めいあん", + "めいうん", + "めいえん", + "めいかく", + "めいきょく", + "めいさい", + "めいし", + "めいそう", + "めいぶつ", + "めいれい", + "めいわく", + "めぐまれる", + "めざす", + "めした", + "めずらしい", + "めだつ", + "めまい", + "めやす", + "めんきょ", + "めんせき", + "めんどう", + "もうしあげる", + "もうどうけん", + "もえる", + "もくし", + "もくてき", + "もくようび", + "もちろん", + "もどる", + "もらう", + "もんく", + "もんだい", + "やおや", + "やける", + "やさい", + "やさしい", + "やすい", + "やすたろう", + "やすみ", + "やせる", + "やそう", + "やたい", + "やちん", + "やっと", + "やっぱり", + "やぶる", + "やめる", + "ややこしい", + "やよい", + "やわらかい", + "ゆうき", + "ゆうびんきょく", + "ゆうべ", + "ゆうめい", + "ゆけつ", + "ゆしゅつ", + "ゆせん", + "ゆそう", + "ゆたか", + "ゆちゃく", + "ゆでる", + "ゆにゅう", + "ゆびわ", + "ゆらい", + "ゆれる", + "ようい", + "ようか", + "ようきゅう", + "ようじ", + "ようす", + "ようちえん", + "よかぜ", + "よかん", + "よきん", + "よくせい", + "よくぼう", + "よけい", + "よごれる", + "よさん", + "よしゅう", + "よそう", + "よそく", + "よっか", + "よてい", + "よどがわく", + "よねつ", + "よやく", + "よゆう", + "よろこぶ", + "よろしい", + "らいう", + "らくがき", + "らくご", + "らくさつ", + "らくだ", + "らしんばん", + "らせん", + "らぞく", + "らたい", + "らっか", + "られつ", + "りえき", + "りかい", + "りきさく", + "りきせつ", + "りくぐん", + "りくつ", + "りけん", + "りこう", + "りせい", + "りそう", + "りそく", + "りてん", + "りねん", + "りゆう", + "りゅうがく", + "りよう", + "りょうり", + "りょかん", + "りょくちゃ", + "りょこう", + "りりく", + "りれき", + "りろん", + "りんご", + "るいけい", + "るいさい", + "るいじ", + "るいせき", + "るすばん", + "るりがわら", + "れいかん", + "れいぎ", + "れいせい", + "れいぞうこ", + "れいとう", + "れいぼう", + "れきし", + "れきだい", + "れんあい", + "れんけい", + "れんこん", + "れんさい", + "れんしゅう", + "れんぞく", + "れんらく", + "ろうか", + "ろうご", + "ろうじん", + "ろうそく", + "ろくが", + "ろこつ", + "ろじうら", + "ろしゅつ", + "ろせん", + "ろてん", + "ろめん", + "ろれつ", + "ろんぎ", + "ろんぱ", + "ろんぶん", + "ろんり", + "わかす", + "わかめ", + "わかやま", + "わかれる", + "わしつ", + "わじまし", + "わすれもの", + "わらう", + "われる", +]; diff --git a/ts_src/hd/words/spanish.ts b/ts_src/hd/words/spanish.ts new file mode 100644 index 0000000..ad891ce --- /dev/null +++ b/ts_src/hd/words/spanish.ts @@ -0,0 +1,2050 @@ +export default [ + "ábaco", + "abdomen", + "abeja", + "abierto", + "abogado", + "abono", + "aborto", + "abrazo", + "abrir", + "abuelo", + "abuso", + "acabar", + "academia", + "acceso", + "acción", + "aceite", + "acelga", + "acento", + "aceptar", + "ácido", + "aclarar", + "acné", + "acoger", + "acoso", + "activo", + "acto", + "actriz", + "actuar", + "acudir", + "acuerdo", + "acusar", + "adicto", + "admitir", + "adoptar", + "adorno", + "aduana", + "adulto", + "aéreo", + "afectar", + "afición", + "afinar", + "afirmar", + "ágil", + "agitar", + "agonía", + "agosto", + "agotar", + "agregar", + "agrio", + "agua", + "agudo", + "águila", + "aguja", + "ahogo", + "ahorro", + "aire", + "aislar", + "ajedrez", + "ajeno", + "ajuste", + "alacrán", + "alambre", + "alarma", + "alba", + "álbum", + "alcalde", + "aldea", + "alegre", + "alejar", + "alerta", + "aleta", + "alfiler", + "alga", + "algodón", + "aliado", + "aliento", + "alivio", + "alma", + "almeja", + "almíbar", + "altar", + "alteza", + "altivo", + "alto", + "altura", + "alumno", + "alzar", + "amable", + "amante", + "amapola", + "amargo", + "amasar", + "ámbar", + "ámbito", + "ameno", + "amigo", + "amistad", + "amor", + "amparo", + "amplio", + "ancho", + "anciano", + "ancla", + "andar", + "andén", + "anemia", + "ángulo", + "anillo", + "ánimo", + "anís", + "anotar", + "antena", + "antiguo", + "antojo", + "anual", + "anular", + "anuncio", + "añadir", + "añejo", + "año", + "apagar", + "aparato", + "apetito", + "apio", + "aplicar", + "apodo", + "aporte", + "apoyo", + "aprender", + "aprobar", + "apuesta", + "apuro", + "arado", + "araña", + "arar", + "árbitro", + "árbol", + "arbusto", + "archivo", + "arco", + "arder", + "ardilla", + "arduo", + "área", + "árido", + "aries", + "armonía", + "arnés", + "aroma", + "arpa", + "arpón", + "arreglo", + "arroz", + "arruga", + "arte", + "artista", + "asa", + "asado", + "asalto", + "ascenso", + "asegurar", + "aseo", + "asesor", + "asiento", + "asilo", + "asistir", + "asno", + "asombro", + "áspero", + "astilla", + "astro", + "astuto", + "asumir", + "asunto", + "atajo", + "ataque", + "atar", + "atento", + "ateo", + "ático", + "atleta", + "átomo", + "atraer", + "atroz", + "atún", + "audaz", + "audio", + "auge", + "aula", + "aumento", + "ausente", + "autor", + "aval", + "avance", + "avaro", + "ave", + "avellana", + "avena", + "avestruz", + "avión", + "aviso", + "ayer", + "ayuda", + "ayuno", + "azafrán", + "azar", + "azote", + "azúcar", + "azufre", + "azul", + "baba", + "babor", + "bache", + "bahía", + "baile", + "bajar", + "balanza", + "balcón", + "balde", + "bambú", + "banco", + "banda", + "baño", + "barba", + "barco", + "barniz", + "barro", + "báscula", + "bastón", + "basura", + "batalla", + "batería", + "batir", + "batuta", + "baúl", + "bazar", + "bebé", + "bebida", + "bello", + "besar", + "beso", + "bestia", + "bicho", + "bien", + "bingo", + "blanco", + "bloque", + "blusa", + "boa", + "bobina", + "bobo", + "boca", + "bocina", + "boda", + "bodega", + "boina", + "bola", + "bolero", + "bolsa", + "bomba", + "bondad", + "bonito", + "bono", + "bonsái", + "borde", + "borrar", + "bosque", + "bote", + "botín", + "bóveda", + "bozal", + "bravo", + "brazo", + "brecha", + "breve", + "brillo", + "brinco", + "brisa", + "broca", + "broma", + "bronce", + "brote", + "bruja", + "brusco", + "bruto", + "buceo", + "bucle", + "bueno", + "buey", + "bufanda", + "bufón", + "búho", + "buitre", + "bulto", + "burbuja", + "burla", + "burro", + "buscar", + "butaca", + "buzón", + "caballo", + "cabeza", + "cabina", + "cabra", + "cacao", + "cadáver", + "cadena", + "caer", + "café", + "caída", + "caimán", + "caja", + "cajón", + "cal", + "calamar", + "calcio", + "caldo", + "calidad", + "calle", + "calma", + "calor", + "calvo", + "cama", + "cambio", + "camello", + "camino", + "campo", + "cáncer", + "candil", + "canela", + "canguro", + "canica", + "canto", + "caña", + "cañón", + "caoba", + "caos", + "capaz", + "capitán", + "capote", + "captar", + "capucha", + "cara", + "carbón", + "cárcel", + "careta", + "carga", + "cariño", + "carne", + "carpeta", + "carro", + "carta", + "casa", + "casco", + "casero", + "caspa", + "castor", + "catorce", + "catre", + "caudal", + "causa", + "cazo", + "cebolla", + "ceder", + "cedro", + "celda", + "célebre", + "celoso", + "célula", + "cemento", + "ceniza", + "centro", + "cerca", + "cerdo", + "cereza", + "cero", + "cerrar", + "certeza", + "césped", + "cetro", + "chacal", + "chaleco", + "champú", + "chancla", + "chapa", + "charla", + "chico", + "chiste", + "chivo", + "choque", + "choza", + "chuleta", + "chupar", + "ciclón", + "ciego", + "cielo", + "cien", + "cierto", + "cifra", + "cigarro", + "cima", + "cinco", + "cine", + "cinta", + "ciprés", + "circo", + "ciruela", + "cisne", + "cita", + "ciudad", + "clamor", + "clan", + "claro", + "clase", + "clave", + "cliente", + "clima", + "clínica", + "cobre", + "cocción", + "cochino", + "cocina", + "coco", + "código", + "codo", + "cofre", + "coger", + "cohete", + "cojín", + "cojo", + "cola", + "colcha", + "colegio", + "colgar", + "colina", + "collar", + "colmo", + "columna", + "combate", + "comer", + "comida", + "cómodo", + "compra", + "conde", + "conejo", + "conga", + "conocer", + "consejo", + "contar", + "copa", + "copia", + "corazón", + "corbata", + "corcho", + "cordón", + "corona", + "correr", + "coser", + "cosmos", + "costa", + "cráneo", + "cráter", + "crear", + "crecer", + "creído", + "crema", + "cría", + "crimen", + "cripta", + "crisis", + "cromo", + "crónica", + "croqueta", + "crudo", + "cruz", + "cuadro", + "cuarto", + "cuatro", + "cubo", + "cubrir", + "cuchara", + "cuello", + "cuento", + "cuerda", + "cuesta", + "cueva", + "cuidar", + "culebra", + "culpa", + "culto", + "cumbre", + "cumplir", + "cuna", + "cuneta", + "cuota", + "cupón", + "cúpula", + "curar", + "curioso", + "curso", + "curva", + "cutis", + "dama", + "danza", + "dar", + "dardo", + "dátil", + "deber", + "débil", + "década", + "decir", + "dedo", + "defensa", + "definir", + "dejar", + "delfín", + "delgado", + "delito", + "demora", + "denso", + "dental", + "deporte", + "derecho", + "derrota", + "desayuno", + "deseo", + "desfile", + "desnudo", + "destino", + "desvío", + "detalle", + "detener", + "deuda", + "día", + "diablo", + "diadema", + "diamante", + "diana", + "diario", + "dibujo", + "dictar", + "diente", + "dieta", + "diez", + "difícil", + "digno", + "dilema", + "diluir", + "dinero", + "directo", + "dirigir", + "disco", + "diseño", + "disfraz", + "diva", + "divino", + "doble", + "doce", + "dolor", + "domingo", + "don", + "donar", + "dorado", + "dormir", + "dorso", + "dos", + "dosis", + "dragón", + "droga", + "ducha", + "duda", + "duelo", + "dueño", + "dulce", + "dúo", + "duque", + "durar", + "dureza", + "duro", + "ébano", + "ebrio", + "echar", + "eco", + "ecuador", + "edad", + "edición", + "edificio", + "editor", + "educar", + "efecto", + "eficaz", + "eje", + "ejemplo", + "elefante", + "elegir", + "elemento", + "elevar", + "elipse", + "élite", + "elixir", + "elogio", + "eludir", + "embudo", + "emitir", + "emoción", + "empate", + "empeño", + "empleo", + "empresa", + "enano", + "encargo", + "enchufe", + "encía", + "enemigo", + "enero", + "enfado", + "enfermo", + "engaño", + "enigma", + "enlace", + "enorme", + "enredo", + "ensayo", + "enseñar", + "entero", + "entrar", + "envase", + "envío", + "época", + "equipo", + "erizo", + "escala", + "escena", + "escolar", + "escribir", + "escudo", + "esencia", + "esfera", + "esfuerzo", + "espada", + "espejo", + "espía", + "esposa", + "espuma", + "esquí", + "estar", + "este", + "estilo", + "estufa", + "etapa", + "eterno", + "ética", + "etnia", + "evadir", + "evaluar", + "evento", + "evitar", + "exacto", + "examen", + "exceso", + "excusa", + "exento", + "exigir", + "exilio", + "existir", + "éxito", + "experto", + "explicar", + "exponer", + "extremo", + "fábrica", + "fábula", + "fachada", + "fácil", + "factor", + "faena", + "faja", + "falda", + "fallo", + "falso", + "faltar", + "fama", + "familia", + "famoso", + "faraón", + "farmacia", + "farol", + "farsa", + "fase", + "fatiga", + "fauna", + "favor", + "fax", + "febrero", + "fecha", + "feliz", + "feo", + "feria", + "feroz", + "fértil", + "fervor", + "festín", + "fiable", + "fianza", + "fiar", + "fibra", + "ficción", + "ficha", + "fideo", + "fiebre", + "fiel", + "fiera", + "fiesta", + "figura", + "fijar", + "fijo", + "fila", + "filete", + "filial", + "filtro", + "fin", + "finca", + "fingir", + "finito", + "firma", + "flaco", + "flauta", + "flecha", + "flor", + "flota", + "fluir", + "flujo", + "flúor", + "fobia", + "foca", + "fogata", + "fogón", + "folio", + "folleto", + "fondo", + "forma", + "forro", + "fortuna", + "forzar", + "fosa", + "foto", + "fracaso", + "frágil", + "franja", + "frase", + "fraude", + "freír", + "freno", + "fresa", + "frío", + "frito", + "fruta", + "fuego", + "fuente", + "fuerza", + "fuga", + "fumar", + "función", + "funda", + "furgón", + "furia", + "fusil", + "fútbol", + "futuro", + "gacela", + "gafas", + "gaita", + "gajo", + "gala", + "galería", + "gallo", + "gamba", + "ganar", + "gancho", + "ganga", + "ganso", + "garaje", + "garza", + "gasolina", + "gastar", + "gato", + "gavilán", + "gemelo", + "gemir", + "gen", + "género", + "genio", + "gente", + "geranio", + "gerente", + "germen", + "gesto", + "gigante", + "gimnasio", + "girar", + "giro", + "glaciar", + "globo", + "gloria", + "gol", + "golfo", + "goloso", + "golpe", + "goma", + "gordo", + "gorila", + "gorra", + "gota", + "goteo", + "gozar", + "grada", + "gráfico", + "grano", + "grasa", + "gratis", + "grave", + "grieta", + "grillo", + "gripe", + "gris", + "grito", + "grosor", + "grúa", + "grueso", + "grumo", + "grupo", + "guante", + "guapo", + "guardia", + "guerra", + "guía", + "guiño", + "guion", + "guiso", + "guitarra", + "gusano", + "gustar", + "haber", + "hábil", + "hablar", + "hacer", + "hacha", + "hada", + "hallar", + "hamaca", + "harina", + "haz", + "hazaña", + "hebilla", + "hebra", + "hecho", + "helado", + "helio", + "hembra", + "herir", + "hermano", + "héroe", + "hervir", + "hielo", + "hierro", + "hígado", + "higiene", + "hijo", + "himno", + "historia", + "hocico", + "hogar", + "hoguera", + "hoja", + "hombre", + "hongo", + "honor", + "honra", + "hora", + "hormiga", + "horno", + "hostil", + "hoyo", + "hueco", + "huelga", + "huerta", + "hueso", + "huevo", + "huida", + "huir", + "humano", + "húmedo", + "humilde", + "humo", + "hundir", + "huracán", + "hurto", + "icono", + "ideal", + "idioma", + "ídolo", + "iglesia", + "iglú", + "igual", + "ilegal", + "ilusión", + "imagen", + "imán", + "imitar", + "impar", + "imperio", + "imponer", + "impulso", + "incapaz", + "índice", + "inerte", + "infiel", + "informe", + "ingenio", + "inicio", + "inmenso", + "inmune", + "innato", + "insecto", + "instante", + "interés", + "íntimo", + "intuir", + "inútil", + "invierno", + "ira", + "iris", + "ironía", + "isla", + "islote", + "jabalí", + "jabón", + "jamón", + "jarabe", + "jardín", + "jarra", + "jaula", + "jazmín", + "jefe", + "jeringa", + "jinete", + "jornada", + "joroba", + "joven", + "joya", + "juerga", + "jueves", + "juez", + "jugador", + "jugo", + "juguete", + "juicio", + "junco", + "jungla", + "junio", + "juntar", + "júpiter", + "jurar", + "justo", + "juvenil", + "juzgar", + "kilo", + "koala", + "labio", + "lacio", + "lacra", + "lado", + "ladrón", + "lagarto", + "lágrima", + "laguna", + "laico", + "lamer", + "lámina", + "lámpara", + "lana", + "lancha", + "langosta", + "lanza", + "lápiz", + "largo", + "larva", + "lástima", + "lata", + "látex", + "latir", + "laurel", + "lavar", + "lazo", + "leal", + "lección", + "leche", + "lector", + "leer", + "legión", + "legumbre", + "lejano", + "lengua", + "lento", + "leña", + "león", + "leopardo", + "lesión", + "letal", + "letra", + "leve", + "leyenda", + "libertad", + "libro", + "licor", + "líder", + "lidiar", + "lienzo", + "liga", + "ligero", + "lima", + "límite", + "limón", + "limpio", + "lince", + "lindo", + "línea", + "lingote", + "lino", + "linterna", + "líquido", + "liso", + "lista", + "litera", + "litio", + "litro", + "llaga", + "llama", + "llanto", + "llave", + "llegar", + "llenar", + "llevar", + "llorar", + "llover", + "lluvia", + "lobo", + "loción", + "loco", + "locura", + "lógica", + "logro", + "lombriz", + "lomo", + "lonja", + "lote", + "lucha", + "lucir", + "lugar", + "lujo", + "luna", + "lunes", + "lupa", + "lustro", + "luto", + "luz", + "maceta", + "macho", + "madera", + "madre", + "maduro", + "maestro", + "mafia", + "magia", + "mago", + "maíz", + "maldad", + "maleta", + "malla", + "malo", + "mamá", + "mambo", + "mamut", + "manco", + "mando", + "manejar", + "manga", + "maniquí", + "manjar", + "mano", + "manso", + "manta", + "mañana", + "mapa", + "máquina", + "mar", + "marco", + "marea", + "marfil", + "margen", + "marido", + "mármol", + "marrón", + "martes", + "marzo", + "masa", + "máscara", + "masivo", + "matar", + "materia", + "matiz", + "matriz", + "máximo", + "mayor", + "mazorca", + "mecha", + "medalla", + "medio", + "médula", + "mejilla", + "mejor", + "melena", + "melón", + "memoria", + "menor", + "mensaje", + "mente", + "menú", + "mercado", + "merengue", + "mérito", + "mes", + "mesón", + "meta", + "meter", + "método", + "metro", + "mezcla", + "miedo", + "miel", + "miembro", + "miga", + "mil", + "milagro", + "militar", + "millón", + "mimo", + "mina", + "minero", + "mínimo", + "minuto", + "miope", + "mirar", + "misa", + "miseria", + "misil", + "mismo", + "mitad", + "mito", + "mochila", + "moción", + "moda", + "modelo", + "moho", + "mojar", + "molde", + "moler", + "molino", + "momento", + "momia", + "monarca", + "moneda", + "monja", + "monto", + "moño", + "morada", + "morder", + "moreno", + "morir", + "morro", + "morsa", + "mortal", + "mosca", + "mostrar", + "motivo", + "mover", + "móvil", + "mozo", + "mucho", + "mudar", + "mueble", + "muela", + "muerte", + "muestra", + "mugre", + "mujer", + "mula", + "muleta", + "multa", + "mundo", + "muñeca", + "mural", + "muro", + "músculo", + "museo", + "musgo", + "música", + "muslo", + "nácar", + "nación", + "nadar", + "naipe", + "naranja", + "nariz", + "narrar", + "nasal", + "natal", + "nativo", + "natural", + "náusea", + "naval", + "nave", + "navidad", + "necio", + "néctar", + "negar", + "negocio", + "negro", + "neón", + "nervio", + "neto", + "neutro", + "nevar", + "nevera", + "nicho", + "nido", + "niebla", + "nieto", + "niñez", + "niño", + "nítido", + "nivel", + "nobleza", + "noche", + "nómina", + "noria", + "norma", + "norte", + "nota", + "noticia", + "novato", + "novela", + "novio", + "nube", + "nuca", + "núcleo", + "nudillo", + "nudo", + "nuera", + "nueve", + "nuez", + "nulo", + "número", + "nutria", + "oasis", + "obeso", + "obispo", + "objeto", + "obra", + "obrero", + "observar", + "obtener", + "obvio", + "oca", + "ocaso", + "océano", + "ochenta", + "ocho", + "ocio", + "ocre", + "octavo", + "octubre", + "oculto", + "ocupar", + "ocurrir", + "odiar", + "odio", + "odisea", + "oeste", + "ofensa", + "oferta", + "oficio", + "ofrecer", + "ogro", + "oído", + "oír", + "ojo", + "ola", + "oleada", + "olfato", + "olivo", + "olla", + "olmo", + "olor", + "olvido", + "ombligo", + "onda", + "onza", + "opaco", + "opción", + "ópera", + "opinar", + "oponer", + "optar", + "óptica", + "opuesto", + "oración", + "orador", + "oral", + "órbita", + "orca", + "orden", + "oreja", + "órgano", + "orgía", + "orgullo", + "oriente", + "origen", + "orilla", + "oro", + "orquesta", + "oruga", + "osadía", + "oscuro", + "osezno", + "oso", + "ostra", + "otoño", + "otro", + "oveja", + "óvulo", + "óxido", + "oxígeno", + "oyente", + "ozono", + "pacto", + "padre", + "paella", + "página", + "pago", + "país", + "pájaro", + "palabra", + "palco", + "paleta", + "pálido", + "palma", + "paloma", + "palpar", + "pan", + "panal", + "pánico", + "pantera", + "pañuelo", + "papá", + "papel", + "papilla", + "paquete", + "parar", + "parcela", + "pared", + "parir", + "paro", + "párpado", + "parque", + "párrafo", + "parte", + "pasar", + "paseo", + "pasión", + "paso", + "pasta", + "pata", + "patio", + "patria", + "pausa", + "pauta", + "pavo", + "payaso", + "peatón", + "pecado", + "pecera", + "pecho", + "pedal", + "pedir", + "pegar", + "peine", + "pelar", + "peldaño", + "pelea", + "peligro", + "pellejo", + "pelo", + "peluca", + "pena", + "pensar", + "peñón", + "peón", + "peor", + "pepino", + "pequeño", + "pera", + "percha", + "perder", + "pereza", + "perfil", + "perico", + "perla", + "permiso", + "perro", + "persona", + "pesa", + "pesca", + "pésimo", + "pestaña", + "pétalo", + "petróleo", + "pez", + "pezuña", + "picar", + "pichón", + "pie", + "piedra", + "pierna", + "pieza", + "pijama", + "pilar", + "piloto", + "pimienta", + "pino", + "pintor", + "pinza", + "piña", + "piojo", + "pipa", + "pirata", + "pisar", + "piscina", + "piso", + "pista", + "pitón", + "pizca", + "placa", + "plan", + "plata", + "playa", + "plaza", + "pleito", + "pleno", + "plomo", + "pluma", + "plural", + "pobre", + "poco", + "poder", + "podio", + "poema", + "poesía", + "poeta", + "polen", + "policía", + "pollo", + "polvo", + "pomada", + "pomelo", + "pomo", + "pompa", + "poner", + "porción", + "portal", + "posada", + "poseer", + "posible", + "poste", + "potencia", + "potro", + "pozo", + "prado", + "precoz", + "pregunta", + "premio", + "prensa", + "preso", + "previo", + "primo", + "príncipe", + "prisión", + "privar", + "proa", + "probar", + "proceso", + "producto", + "proeza", + "profesor", + "programa", + "prole", + "promesa", + "pronto", + "propio", + "próximo", + "prueba", + "público", + "puchero", + "pudor", + "pueblo", + "puerta", + "puesto", + "pulga", + "pulir", + "pulmón", + "pulpo", + "pulso", + "puma", + "punto", + "puñal", + "puño", + "pupa", + "pupila", + "puré", + "quedar", + "queja", + "quemar", + "querer", + "queso", + "quieto", + "química", + "quince", + "quitar", + "rábano", + "rabia", + "rabo", + "ración", + "radical", + "raíz", + "rama", + "rampa", + "rancho", + "rango", + "rapaz", + "rápido", + "rapto", + "rasgo", + "raspa", + "rato", + "rayo", + "raza", + "razón", + "reacción", + "realidad", + "rebaño", + "rebote", + "recaer", + "receta", + "rechazo", + "recoger", + "recreo", + "recto", + "recurso", + "red", + "redondo", + "reducir", + "reflejo", + "reforma", + "refrán", + "refugio", + "regalo", + "regir", + "regla", + "regreso", + "rehén", + "reino", + "reír", + "reja", + "relato", + "relevo", + "relieve", + "relleno", + "reloj", + "remar", + "remedio", + "remo", + "rencor", + "rendir", + "renta", + "reparto", + "repetir", + "reposo", + "reptil", + "res", + "rescate", + "resina", + "respeto", + "resto", + "resumen", + "retiro", + "retorno", + "retrato", + "reunir", + "revés", + "revista", + "rey", + "rezar", + "rico", + "riego", + "rienda", + "riesgo", + "rifa", + "rígido", + "rigor", + "rincón", + "riñón", + "río", + "riqueza", + "risa", + "ritmo", + "rito", + "rizo", + "roble", + "roce", + "rociar", + "rodar", + "rodeo", + "rodilla", + "roer", + "rojizo", + "rojo", + "romero", + "romper", + "ron", + "ronco", + "ronda", + "ropa", + "ropero", + "rosa", + "rosca", + "rostro", + "rotar", + "rubí", + "rubor", + "rudo", + "rueda", + "rugir", + "ruido", + "ruina", + "ruleta", + "rulo", + "rumbo", + "rumor", + "ruptura", + "ruta", + "rutina", + "sábado", + "saber", + "sabio", + "sable", + "sacar", + "sagaz", + "sagrado", + "sala", + "saldo", + "salero", + "salir", + "salmón", + "salón", + "salsa", + "salto", + "salud", + "salvar", + "samba", + "sanción", + "sandía", + "sanear", + "sangre", + "sanidad", + "sano", + "santo", + "sapo", + "saque", + "sardina", + "sartén", + "sastre", + "satán", + "sauna", + "saxofón", + "sección", + "seco", + "secreto", + "secta", + "sed", + "seguir", + "seis", + "sello", + "selva", + "semana", + "semilla", + "senda", + "sensor", + "señal", + "señor", + "separar", + "sepia", + "sequía", + "ser", + "serie", + "sermón", + "servir", + "sesenta", + "sesión", + "seta", + "setenta", + "severo", + "sexo", + "sexto", + "sidra", + "siesta", + "siete", + "siglo", + "signo", + "sílaba", + "silbar", + "silencio", + "silla", + "símbolo", + "simio", + "sirena", + "sistema", + "sitio", + "situar", + "sobre", + "socio", + "sodio", + "sol", + "solapa", + "soldado", + "soledad", + "sólido", + "soltar", + "solución", + "sombra", + "sondeo", + "sonido", + "sonoro", + "sonrisa", + "sopa", + "soplar", + "soporte", + "sordo", + "sorpresa", + "sorteo", + "sostén", + "sótano", + "suave", + "subir", + "suceso", + "sudor", + "suegra", + "suelo", + "sueño", + "suerte", + "sufrir", + "sujeto", + "sultán", + "sumar", + "superar", + "suplir", + "suponer", + "supremo", + "sur", + "surco", + "sureño", + "surgir", + "susto", + "sutil", + "tabaco", + "tabique", + "tabla", + "tabú", + "taco", + "tacto", + "tajo", + "talar", + "talco", + "talento", + "talla", + "talón", + "tamaño", + "tambor", + "tango", + "tanque", + "tapa", + "tapete", + "tapia", + "tapón", + "taquilla", + "tarde", + "tarea", + "tarifa", + "tarjeta", + "tarot", + "tarro", + "tarta", + "tatuaje", + "tauro", + "taza", + "tazón", + "teatro", + "techo", + "tecla", + "técnica", + "tejado", + "tejer", + "tejido", + "tela", + "teléfono", + "tema", + "temor", + "templo", + "tenaz", + "tender", + "tener", + "tenis", + "tenso", + "teoría", + "terapia", + "terco", + "término", + "ternura", + "terror", + "tesis", + "tesoro", + "testigo", + "tetera", + "texto", + "tez", + "tibio", + "tiburón", + "tiempo", + "tienda", + "tierra", + "tieso", + "tigre", + "tijera", + "tilde", + "timbre", + "tímido", + "timo", + "tinta", + "tío", + "típico", + "tipo", + "tira", + "tirón", + "titán", + "títere", + "título", + "tiza", + "toalla", + "tobillo", + "tocar", + "tocino", + "todo", + "toga", + "toldo", + "tomar", + "tono", + "tonto", + "topar", + "tope", + "toque", + "tórax", + "torero", + "tormenta", + "torneo", + "toro", + "torpedo", + "torre", + "torso", + "tortuga", + "tos", + "tosco", + "toser", + "tóxico", + "trabajo", + "tractor", + "traer", + "tráfico", + "trago", + "traje", + "tramo", + "trance", + "trato", + "trauma", + "trazar", + "trébol", + "tregua", + "treinta", + "tren", + "trepar", + "tres", + "tribu", + "trigo", + "tripa", + "triste", + "triunfo", + "trofeo", + "trompa", + "tronco", + "tropa", + "trote", + "trozo", + "truco", + "trueno", + "trufa", + "tubería", + "tubo", + "tuerto", + "tumba", + "tumor", + "túnel", + "túnica", + "turbina", + "turismo", + "turno", + "tutor", + "ubicar", + "úlcera", + "umbral", + "unidad", + "unir", + "universo", + "uno", + "untar", + "uña", + "urbano", + "urbe", + "urgente", + "urna", + "usar", + "usuario", + "útil", + "utopía", + "uva", + "vaca", + "vacío", + "vacuna", + "vagar", + "vago", + "vaina", + "vajilla", + "vale", + "válido", + "valle", + "valor", + "válvula", + "vampiro", + "vara", + "variar", + "varón", + "vaso", + "vecino", + "vector", + "vehículo", + "veinte", + "vejez", + "vela", + "velero", + "veloz", + "vena", + "vencer", + "venda", + "veneno", + "vengar", + "venir", + "venta", + "venus", + "ver", + "verano", + "verbo", + "verde", + "vereda", + "verja", + "verso", + "verter", + "vía", + "viaje", + "vibrar", + "vicio", + "víctima", + "vida", + "vídeo", + "vidrio", + "viejo", + "viernes", + "vigor", + "vil", + "villa", + "vinagre", + "vino", + "viñedo", + "violín", + "viral", + "virgo", + "virtud", + "visor", + "víspera", + "vista", + "vitamina", + "viudo", + "vivaz", + "vivero", + "vivir", + "vivo", + "volcán", + "volumen", + "volver", + "voraz", + "votar", + "voto", + "voz", + "vuelo", + "vulgar", + "yacer", + "yate", + "yegua", + "yema", + "yerno", + "yeso", + "yodo", + "yoga", + "yogur", + "zafiro", + "zanja", + "zapato", + "zarza", + "zona", + "zorro", + "zumo", + "zurdo", +]; diff --git a/ts_src/index.ts b/ts_src/index.ts new file mode 100644 index 0000000..266cadc --- /dev/null +++ b/ts_src/index.ts @@ -0,0 +1 @@ +export * from "./hd"; diff --git a/ts_src/protocol/consensus.ts b/ts_src/protocol/consensus.ts new file mode 100644 index 0000000..d2c1f11 --- /dev/null +++ b/ts_src/protocol/consensus.ts @@ -0,0 +1,107 @@ +import BN from "bn.js"; +import { assert } from "../hd/common"; + +export const COIN = 100000000; +export const MAX_MONEY = 21000000 * COIN; +export const BASE_REWARD = 40 * COIN; +export const HALF_REWARD = Math.floor(BASE_REWARD / 2); +export const MAX_BLOCK_SIZE = 6000000; +export const MAX_RAW_BLOCK_SIZE = 8000000; +export const MAX_BLOCK_WEIGHT = 8000000; +export const MAX_BLOCK_SIGOPS = 1000000 / 50; +export const MAX_BLOCK_SIGOPS_COST = 80000; +export const MEDIAN_TIMESPAN = 11; +export const VERSION_TOP_BITS = 0x20000000; +export const VERSION_TOP_MASK = 0xe0000000; +export const COINBASE_MATURITY = 100; +export const WITNESS_SCALE_FACTOR = 4; +export const LOCKTIME_THRESHOLD = 500000000; +export const SEQUENCE_DISABLE_FLAG = (1 << 31) >>> 0; +export const SEQUENCE_TYPE_FLAG = 1 << 22; +export const SEQUENCE_GRANULARITY = 9; +export const SEQUENCE_MASK = 0x0000ffff; +export const MAX_SCRIPT_SIZE = 100000; +export const MAX_SCRIPT_STACK = 2000; +export const MAX_SCRIPT_PUSH = 1897; +export const MAX_SCRIPT_OPS = 201; +export const MAX_MULTISIG_PUBKEYS = 20; +export const BIP16_TIME = 1333238400; +export const ZERO_HASH = Buffer.allocUnsafe(32); +export const ZERO_FALCON_HASH = Buffer.allocUnsafe(48); + +export function fromCompact(compact: number) { + if (compact === 0) return new BN(0); + + const exponent = compact >>> 24; + const negative = (compact >>> 23) & 1; + + let mantissa = compact & 0x7fffff; + let num; + + if (exponent <= 3) { + mantissa >>>= 8 * (3 - exponent); + num = new BN(mantissa); + } else { + num = new BN(mantissa); + num.iushln(8 * (exponent - 3)); + } + + if (negative) num.ineg(); + + return num; +} + +export function toCompact(num: BN): number { + if (num.isZero()) return 0; + + let exponent = num.byteLength(); + let mantissa; + + if (exponent <= 3) { + mantissa = num.toNumber(); + mantissa <<= 8 * (3 - exponent); + } else { + mantissa = num.ushrn(8 * (exponent - 3)).toNumber(); + } + + if (mantissa & 0x800000) { + mantissa >>= 8; + exponent++; + } + + let compact = (exponent << 24) | mantissa; + + if (num.isNeg()) compact |= 0x800000; + + compact >>>= 0; + + return compact; +} + +export function verifyPOW(hash: string, bits: number): boolean { + const target = fromCompact(bits); + if (target.isNeg() || target.isZero()) return false; + + const num = new BN(hash, "le"); + if (num.cmp(target) > 0) return false; + return true; +} + +export function getReward(height: number, interval: number): number { + assert(height >= 0, "Bad height for reward."); + + const halvings = Math.floor(height / interval); + + if (halvings >= 33) return 0; + if (halvings === 0) return BASE_REWARD; + + return HALF_REWARD >>> (halvings - 1); +} + +export function hasBit(version: number, bit: number): boolean { + const TOP_MASK = exports.VERSION_TOP_MASK; + const TOP_BITS = exports.VERSION_TOP_BITS; + const bits = (version & TOP_MASK) >>> 0; + const mask = 1 << bit; + return bits === TOP_BITS && (version & mask) !== 0; +} diff --git a/ts_src/protocol/network.ts b/ts_src/protocol/network.ts new file mode 100644 index 0000000..b0f93e9 --- /dev/null +++ b/ts_src/protocol/network.ts @@ -0,0 +1,173 @@ +import TimeData from "./timedelta"; +import { VERSION_TOP_MASK } from "./consensus"; +import { search } from "../utils/binary"; +import { NetType } from "./types"; +import { MAINNET } from "./networks"; + +class Network { + network: NetType; + checkpoints: { + hash: Uint8Array; + height: number; + }[]; + unknownBits: unknown; + time: TimeData; + + constructor(network: NetType = MAINNET) { + this.network = network; + this.checkpoints = []; + this.unknownBits = ~VERSION_TOP_MASK; + this.time = new TimeData(); + + this.init(); + } + + init() { + let bits = 0; + + for (const deployment of this.network.deploys) bits |= 1 << deployment.bit; + + bits |= VERSION_TOP_MASK; + + this.unknownBits = ~bits >>> 0; + + for (const key of Object.keys( + this.network.checkpointMap + ) as any as number[]) { + const hash = this.network.checkpointMap[key]; + const height = Number(key); + + this.checkpoints.push({ hash, height }); + } + + this.checkpoints.sort(cmpNode); + } + + byBit(bit: number): unknown { + const index = search(this.network.deploys, bit, cmpBit); + + if (index === -1) return null; + + return this.network.deploys[index]; + } + + now(): number { + return this.time.now(); + } + + ms(): number { + return this.time.ms(); + } + + static by( + value: string | number, + compare: (v1: any, v2: any) => boolean, + network?: NetType, + name?: string + ) { + if (network) { + if (compare(network!, value)) return new Network(network); + throw new Error(`Network mismatch for ${name}.`); + } + + throw new Error(`Network not found for ${name}.`); + } + + static fromMagic(value: number, network?: NetType): Network { + return Network.by(value, cmpMagic, network, "magic number"); + } + + static fromWIF(prefix: number, network?: NetType): Network { + return Network.by(prefix, cmpWIF, network, "WIF"); + } + + static fromPublic(prefix: number, network?: NetType): Network { + return Network.by(prefix, cmpPub, network, "xpubkey"); + } + + static fromPrivate(prefix: number, network?: NetType): Network { + return Network.by(prefix, cmpPriv, network, "xprivkey"); + } + + static fromPublic58(prefix: string, network?: NetType): Network { + return Network.by(prefix, cmpPub58, network, "xpubkey"); + } + + static fromPrivate58(prefix: string, network?: NetType): Network { + return Network.by(prefix, cmpPriv58, network, "xprivkey"); + } + + static fromBase58(prefix: number, network?: NetType): Network { + return Network.by(prefix, cmpBase58, network, "base58 address"); + } + + static fromBech32(hrp: string, network?: NetType): Network { + return Network.by(hrp, cmpBech32, network, "bech32 address"); + } + + static fromBech32m(hrp: string, network?: NetType): Network { + return Network.by(hrp, cmpBech32, network, "bech32m address"); + } + + toString(): string { + return this.network.type; + } + + inspect(): string { + return ``; + } + + static isNetwork(obj: unknown): boolean { + return obj instanceof Network; + } +} + +function cmpBit(a: any, b: any) { + return a.bit - b; +} + +function cmpNode(a: { height: number }, b: { height: number }) { + return a.height - b.height; +} + +function cmpMagic(network: Network, magic: unknown) { + return network.network.magic === magic; +} + +function cmpWIF(network: Network, prefix: number) { + return network.network.keyPrefix.privkey === prefix; +} + +function cmpPub(network: Network, prefix: number) { + return network.network.keyPrefix.xpubkey === prefix; +} + +function cmpPriv(network: Network, prefix: number) { + return network.network.keyPrefix.xprivkey === prefix; +} + +function cmpPub58(network: Network, prefix: string) { + return network.network.keyPrefix.xpubkey58 === prefix; +} + +function cmpPriv58(network: Network, prefix: string) { + return network.network.keyPrefix.xprivkey58 === prefix; +} + +function cmpBase58(network: Network, prefix: number) { + const prefixes = network.network.addressPrefix; + + switch (prefix) { + case prefixes.pubkeyhash: + case prefixes.scripthash: + return true; + } + + return false; +} + +function cmpBech32(network: Network, hrp: string) { + return network.network.addressPrefix.bech32 === hrp; +} + +export default Network; diff --git a/ts_src/protocol/networks.ts b/ts_src/protocol/networks.ts new file mode 100644 index 0000000..6a51c2b --- /dev/null +++ b/ts_src/protocol/networks.ts @@ -0,0 +1,74 @@ +import { NetType } from "./types"; +import { hexToBytes } from "@noble/hashes/utils"; + +const b = hexToBytes; + +export const MAINNET: NetType = { + type: "main", + magic: 0xc0c0c0c0, + checkpointMap: { + 1000: b("35668ee4f0fc1334849813c8a8e583814e9b22bfe5dc5a2bd2ded2b3aeec6643"), + }, + deployments: { + csv: { + name: "csv", + bit: 0, + startTime: -1, + timeout: 1493596800, + threshold: -1, + window: -1, + required: false, + force: true, + }, + segwit: { + name: "segwit", + bit: 1, + startTime: -1, + timeout: 1510704000, + threshold: -1, + window: -1, + required: true, + force: false, + }, + segsignal: { + name: "segsignal", + bit: 4, + startTime: 1496275200, + timeout: 1510704000, + threshold: 269, + window: 336, + required: false, + force: false, + }, + testdummy: { + name: "testdummy", + bit: 28, + startTime: -1, + timeout: 1230767999, + threshold: -1, + window: -1, + required: false, + force: true, + }, + }, + deploys: [], + keyPrefix: { + privkey: 0x7d, + xpubkey: 0x0768acde, + xprivkey: 0x0768feb1, + xpubkey58: "xpub", + xprivkey58: "xprv", + coinType: 0, + }, + addressPrefix: { + pubkeyhash: 25, + scripthash: 30, + bech32: "", + }, +}; + +MAINNET.deploys = [ + MAINNET.deployments.csv, + MAINNET.deployments.segwit, + MAINNET.deployments.testdummy, +]; diff --git a/ts_src/protocol/policy.ts b/ts_src/protocol/policy.ts new file mode 100644 index 0000000..892b4bd --- /dev/null +++ b/ts_src/protocol/policy.ts @@ -0,0 +1,64 @@ +import { + COIN, + MAX_BLOCK_SIGOPS, + MAX_BLOCK_SIGOPS_COST, + MAX_BLOCK_SIZE, + WITNESS_SCALE_FACTOR, +} from "./consensus"; + +export const MAX_TX_VERSION = 2; +export const MAX_TX_SIZE = MAX_BLOCK_SIZE / 10; +export const MAX_BLOCK_WEIGHT = 6000000 * WITNESS_SCALE_FACTOR; +export const MAX_TX_WEIGHT = MAX_BLOCK_WEIGHT / 10; +export const MAX_TX_SIGOPS = MAX_BLOCK_SIGOPS / 5; +export const MAX_TX_SIGOPS_COST = MAX_BLOCK_SIGOPS_COST / 5; +export const BYTES_PER_SIGOP = 20; +export const MIN_RELAY = 1000; +export const BARE_MULTISIG = true; +export const FREE_THRESHOLD = (COIN * 144) / 250; +export const MAX_P2SH_SIGOPS = 15; +export const MAX_OP_RETURN_BYTES = 83; +export const MAX_OP_RETURN = 80; +export const MAX_P2WSH_STACK = 100; +export const MAX_P2WSH_PUSH = 80; +export const MAX_P2WSH_SIZE = 3600; +export const MEMPOOL_MAX_ANCESTORS = 25; +export const MEMPOOL_MAX_SIZE = 100 * 1000000; +export const MEMPOOL_EXPIRY_TIME = 72 * 60 * 60; +export const MEMPOOL_MAX_ORPHANS = 100; +export const MIN_BLOCK_WEIGHT = 0; +export const SIGNATURE_SIZE = 690; +export const PUBKEY_SIZE = 898; +export const PRIVKEY_SIZE = 1281; +export const BLOCK_PRIORITY_WEIGHT = 0; +export const BLOCK_PRIORITY_THRESHOLD = FREE_THRESHOLD; + +export function getMinFee(size?: number, rate?: number): number { + if (rate === undefined) rate = MIN_RELAY; + + if (size === 0 || size === undefined) return 0; + + let fee = Math.floor((rate * size) / 1000); + + if (fee === 0 && rate > 0) fee = rate; + + return fee; +} + +export function getRoundFee(size?: number, rate?: number): number { + if (rate === undefined) rate = MIN_RELAY; + + if (size === 0 || size === undefined) return 0; + + let fee = rate * Math.ceil(size / 1000); + + if (fee === 0 && rate > 0) fee = rate; + + return fee; +} + +export function getRate(size: number, fee: number): number { + if (size === 0) return 0; + + return Math.floor((fee * 1000) / size); +} diff --git a/ts_src/protocol/timedelta.ts b/ts_src/protocol/timedelta.ts new file mode 100644 index 0000000..29748eb --- /dev/null +++ b/ts_src/protocol/timedelta.ts @@ -0,0 +1,80 @@ +import { now } from "../utils/util"; +import { insert } from "../utils/binary"; + +const EventEmitter = require("events"); + +class TimeData extends EventEmitter { + samples: number[] = []; + known: Map = new Map(); + offset = 0; + checked = false; + + constructor(limit: number = 200) { + super(); + + this.limit = limit; + } + + add(id: string, time: number) { + if (this.samples.length >= this.limit) return; + + if (this.known.has(id)) return; + + const sample = time - now(); + + this.known.set(id, sample); + + insert(this.samples, sample, compare); + + this.emit("sample", sample, this.samples.length); + + if (this.samples.length >= 5 && this.samples.length % 2 === 1) { + let median = this.samples[this.samples.length >>> 1]; + + if (Math.abs(median) >= 70 * 60) { + if (!this.checked) { + let match = false; + + for (const offset of this.samples) { + if (offset !== 0 && Math.abs(offset) < 5 * 60) { + match = true; + break; + } + } + + if (!match) { + this.checked = true; + this.emit("mismatch"); + } + } + + median = 0; + } + + this.offset = median; + this.emit("offset", this.offset); + } + } + + now(): number { + return now() + this.offset; + } + + adjust(time: number): number { + return time + this.offset; + } + + local(time: number): number { + return time - this.offset; + } + + ms(): number { + return Date.now() + this.offset * 1000; + } +} + +function compare(a: number, b: number): number { + return a - b; +} + +export default TimeData; diff --git a/ts_src/protocol/types.ts b/ts_src/protocol/types.ts new file mode 100644 index 0000000..f06a69b --- /dev/null +++ b/ts_src/protocol/types.ts @@ -0,0 +1,37 @@ +interface Deployment { + name: string; + bit: number; + startTime: number; + timeout: number; + threshold: number; + window: number; + required: boolean; + force: boolean; +} + +interface KeyPrefix { + privkey: number; + xpubkey: number; + xprivkey: number; + xpubkey58: string; + xprivkey58: string; + coinType: number; +} + +interface AddressPrefix { + pubkeyhash: number; + scripthash: number; + bech32: string; +} + +export type NetworkType = "main" | "testnet"; + +export interface NetType { + type: NetworkType; + magic: number; + checkpointMap: Record; + deployments: Record; + deploys: Deployment[]; + keyPrefix: KeyPrefix; + addressPrefix: AddressPrefix; +} diff --git a/ts_src/utils/binary.ts b/ts_src/utils/binary.ts new file mode 100644 index 0000000..3cba5b2 --- /dev/null +++ b/ts_src/utils/binary.ts @@ -0,0 +1,69 @@ +export function search( + items: T[], + key: K, + compare: (item: T, key: K) => number, + insert?: boolean +): number { + let start = 0; + let end = items.length - 1; + + while (start <= end) { + const pos = (start + end) >>> 1; + const cmp = compare(items[pos], key); + + if (cmp === 0) return pos; + + if (cmp < 0) start = pos + 1; + else end = pos - 1; + } + + if (!insert) return -1; + + return start; +} + +export function insert( + items: T[], + item: T, + compare: (item1: T, item2: T) => number, + uniq?: boolean +): number { + const i = exports.search(items, item, compare, true); + + if (uniq && i < items.length) { + if (compare(items[i], item) === 0) return -1; + } + + if (i === 0) items.unshift(item); + else if (i === items.length) items.push(item); + else items.splice(i, 0, item); + + return i; +} + +export function remove( + items: T[], + item: K, + compare: (item: T, key: K) => number +) { + const i = search(items, item, compare, false); + + if (i === -1) return false; + + splice(items, i); + + return true; +} + +function splice(list: T[], i: number) { + if (i === 0) { + list.shift(); + return; + } + + let k = i + 1; + + while (k < list.length) list[i++] = list[k++]; + + list.pop(); +} diff --git a/ts_src/utils/util.ts b/ts_src/utils/util.ts new file mode 100644 index 0000000..8c9cfb9 --- /dev/null +++ b/ts_src/utils/util.ts @@ -0,0 +1,90 @@ +import { + bytesToHex as toHex, + hexToBytes as fromHex, +} from "@noble/hashes/utils"; + +export function bench(time: [number, number]) { + if (!process.hrtime) { + const now = Date.now(); + + if (time) { + const [hi, lo] = time; + const start = hi * 1000 + lo / 1e6; + return now - start; + } + + const ms = now % 1000; + + // Seconds + const hi = (now - ms) / 1000; + + // Nanoseconds + const lo = ms * 1e6; + + return [hi, lo]; + } + + if (time) { + const [hi, lo] = process.hrtime(time); + return hi * 1000 + lo / 1e6; + } + + return process.hrtime(); +} + +export function now(): number { + return Math.floor(Date.now() / 1000); +} + +export function ms(): number { + return Number(Date.now()); +} + +export function date(time?: number): string { + if (time === undefined) time = now(); + + return new Date(time! * 1000).toISOString().slice(0, -5) + "Z"; +} + +export function time(date?: string): number { + if (date == null) return now(); + + return (Number(new Date(date)) / 1000) | 0; +} + +export function revHex(buf: Uint8Array): string { + return toHex(buf.reverse()); +} + +export function fromRev(str: string): Uint8Array { + if ((str.length & 1) !== 0) throw new Error("Invalid rev"); + + return fromHex(str).reverse(); +} + +export function parsePath(path: string): number[] { + const parts = path.split("/"); + const root = parts[0]; + + if (root !== "m" && root !== "M" && root !== "m'" && root !== "M'") { + throw new Error("Invalid path root."); + } + + const result = []; + + for (let i = 1; i < parts.length; i++) { + let part = parts[i]; + + if (part.length > 10) throw new Error("Path index too large."); + + if (!/^\d+$/.test(part)) throw new Error("Path index is non-numeric."); + + let index = parseInt(part, 10); + + if (index >>> 0 !== index) throw new Error("Path index out of range."); + + result.push(index); + } + + return result; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..ab29913 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "outDir": "./src", + "declaration": true, + "rootDir": "./ts_src", + "types": ["node"], + "allowJs": false, + "strict": true, + "esModuleInterop": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + }, + "include": ["ts_src/**/*.ts"], + "exclude": ["**/*.spec.ts", "node_modules/**/*"] +}