story_key 0.2.0 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +5 -2
- data/.rubocop.yml +2 -1
- data/.ruby-version +1 -1
- data/.travis.yml +1 -1
- data/Gemfile.lock +57 -38
- data/README.md +42 -31
- data/assets/BarlowSemiCondensed-Regular.ttf +0 -0
- data/assets/error.png +0 -0
- data/lexicons/adjectives/misc.txt +1 -4
- data/lexicons/adjectives/personable.txt +7 -4
- data/lexicons/verbs/entries.txt +1037 -0
- data/lib/story_key/class_methods.rb +1 -1
- data/lib/story_key/console.rb +20 -9
- data/lib/story_key/data.rb +11 -13
- data/lib/story_key/decoder.rb +2 -2
- data/lib/story_key/encoder.rb +17 -6
- data/lib/story_key/image_generator.rb +174 -0
- data/lib/story_key/{generator.rb → key_generator.rb} +7 -3
- data/lib/story_key/lexicon.rb +1 -1
- data/lib/story_key/tokenizer.rb +1 -1
- data/lib/story_key/version.rb +3 -3
- data/lib/story_key.rb +6 -5
- data/rakelib/lexicon.rake +32 -20
- data/story_key.gemspec +13 -10
- data/tmp/.keep +0 -0
- metadata +69 -24
- data/.DS_Store +0 -0
- data/lexicons/verbs/misc.txt +0 -1039
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eeeb70d8a72b1bc5e5d79ddfbcdd209e99fc0a06585e39a962e03c23e16668da
|
4
|
+
data.tar.gz: 65f19dfe8a2dea256fd81b9e89cc408abbf49bec3cdca1ab2c11d5e0f727d595
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b20a511ddc38ac544dcf5f9d406ac2828d9f0f0605bf4e8d645742d2fe0e032f0581f8b0faec9d7bf9983a7231bca0ceccde8d2f7334263a610295f4aa2bd797
|
7
|
+
data.tar.gz: 1b10fdb21424a1712520e2d12b6c48bd4766bfc7f9d49e0880524469aa4ca060c881860e1e7180acd595ed2ccf3c81688e91d4b3618d00c1d51f31ba2ffffbd5
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require:
|
2
2
|
- rubocop-performance
|
3
|
+
- rubocop-rake
|
3
4
|
- rubocop-rspec
|
4
5
|
|
5
6
|
AllCops:
|
@@ -8,7 +9,7 @@ AllCops:
|
|
8
9
|
- vendor/**/*
|
9
10
|
- lib/story_key/data.rb
|
10
11
|
NewCops: enable
|
11
|
-
TargetRubyVersion: 3.
|
12
|
+
TargetRubyVersion: 3.2.0
|
12
13
|
Gemspec/RequireMFA:
|
13
14
|
Enabled: false
|
14
15
|
Layout/EmptyLineAfterGuardClause:
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.
|
1
|
+
3.2.0
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,21 +1,24 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
story_key (0.
|
5
|
-
activesupport (~> 7.0.
|
4
|
+
story_key (0.4.0)
|
5
|
+
activesupport (~> 7.0.4)
|
6
6
|
awesome_print (~> 1.9.2)
|
7
7
|
base58 (~> 0.2.3)
|
8
|
+
dotenv (~> 2.8.1)
|
8
9
|
dry-initializer (~> 3.1.1)
|
9
|
-
indefinite_article (~> 0.2.
|
10
|
+
indefinite_article (~> 0.2.5)
|
10
11
|
pry (~> 0.14.1)
|
11
12
|
remedy (~> 0.3.0)
|
13
|
+
rmagick (~> 5.1.0)
|
14
|
+
ruby-openai (~> 3.0.2)
|
12
15
|
thor (~> 1.2.1)
|
13
|
-
zeitwerk (~> 2.
|
16
|
+
zeitwerk (~> 2.6.6)
|
14
17
|
|
15
18
|
GEM
|
16
19
|
remote: https://rubygems.org/
|
17
20
|
specs:
|
18
|
-
activesupport (7.0.
|
21
|
+
activesupport (7.0.4)
|
19
22
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
20
23
|
i18n (>= 1.6, < 2)
|
21
24
|
minitest (>= 5.1)
|
@@ -26,75 +29,91 @@ GEM
|
|
26
29
|
coderay (1.1.3)
|
27
30
|
concurrent-ruby (1.1.10)
|
28
31
|
diff-lcs (1.5.0)
|
32
|
+
dotenv (2.8.1)
|
29
33
|
dry-initializer (3.1.1)
|
30
|
-
|
34
|
+
httparty (0.20.0)
|
35
|
+
mime-types (~> 3.0)
|
36
|
+
multi_xml (>= 0.5.2)
|
37
|
+
i18n (1.12.0)
|
31
38
|
concurrent-ruby (~> 1.0)
|
32
|
-
indefinite_article (0.2.
|
39
|
+
indefinite_article (0.2.5)
|
33
40
|
activesupport
|
41
|
+
json (2.6.3)
|
34
42
|
method_source (1.0.0)
|
35
|
-
|
43
|
+
mime-types (3.4.1)
|
44
|
+
mime-types-data (~> 3.2015)
|
45
|
+
mime-types-data (3.2022.0105)
|
46
|
+
minitest (5.16.3)
|
47
|
+
multi_xml (0.6.0)
|
36
48
|
parallel (1.22.1)
|
37
|
-
parser (3.1.
|
49
|
+
parser (3.1.3.0)
|
38
50
|
ast (~> 2.4.1)
|
51
|
+
pkg-config (1.5.1)
|
39
52
|
pry (0.14.1)
|
40
53
|
coderay (~> 1.1)
|
41
54
|
method_source (~> 1.0)
|
42
55
|
rainbow (3.1.1)
|
43
56
|
rake (13.0.6)
|
44
|
-
regexp_parser (2.
|
57
|
+
regexp_parser (2.6.1)
|
45
58
|
remedy (0.3.0)
|
46
59
|
rexml (3.2.5)
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
rspec-
|
51
|
-
|
52
|
-
rspec-
|
53
|
-
rspec-
|
60
|
+
rmagick (5.1.0)
|
61
|
+
pkg-config (~> 1.4)
|
62
|
+
rspec (3.12.0)
|
63
|
+
rspec-core (~> 3.12.0)
|
64
|
+
rspec-expectations (~> 3.12.0)
|
65
|
+
rspec-mocks (~> 3.12.0)
|
66
|
+
rspec-core (3.12.0)
|
67
|
+
rspec-support (~> 3.12.0)
|
68
|
+
rspec-expectations (3.12.1)
|
54
69
|
diff-lcs (>= 1.2.0, < 2.0)
|
55
|
-
rspec-support (~> 3.
|
56
|
-
rspec-mocks (3.
|
70
|
+
rspec-support (~> 3.12.0)
|
71
|
+
rspec-mocks (3.12.1)
|
57
72
|
diff-lcs (>= 1.2.0, < 2.0)
|
58
|
-
rspec-support (~> 3.
|
59
|
-
rspec-support (3.
|
60
|
-
rubocop (1.
|
73
|
+
rspec-support (~> 3.12.0)
|
74
|
+
rspec-support (3.12.0)
|
75
|
+
rubocop (1.41.1)
|
76
|
+
json (~> 2.3)
|
61
77
|
parallel (~> 1.10)
|
62
|
-
parser (>= 3.1.
|
78
|
+
parser (>= 3.1.2.1)
|
63
79
|
rainbow (>= 2.2.2, < 4.0)
|
64
80
|
regexp_parser (>= 1.8, < 3.0)
|
65
|
-
rexml
|
66
|
-
rubocop-ast (>= 1.
|
81
|
+
rexml (>= 3.2.5, < 4.0)
|
82
|
+
rubocop-ast (>= 1.23.0, < 2.0)
|
67
83
|
ruby-progressbar (~> 1.7)
|
68
84
|
unicode-display_width (>= 1.4.0, < 3.0)
|
69
|
-
rubocop-ast (1.
|
85
|
+
rubocop-ast (1.24.1)
|
70
86
|
parser (>= 3.1.1.0)
|
71
|
-
rubocop-performance (1.
|
87
|
+
rubocop-performance (1.15.2)
|
72
88
|
rubocop (>= 1.7.0, < 2.0)
|
73
89
|
rubocop-ast (>= 0.4.0)
|
74
90
|
rubocop-rake (0.6.0)
|
75
91
|
rubocop (~> 1.0)
|
76
|
-
rubocop-rspec (2.
|
77
|
-
rubocop (~> 1.
|
92
|
+
rubocop-rspec (2.16.0)
|
93
|
+
rubocop (~> 1.33)
|
94
|
+
ruby-openai (3.0.2)
|
95
|
+
httparty (>= 0.18.1, < 0.21.0)
|
78
96
|
ruby-progressbar (1.11.0)
|
79
97
|
thor (1.2.1)
|
80
|
-
tzinfo (2.0.
|
98
|
+
tzinfo (2.0.5)
|
81
99
|
concurrent-ruby (~> 1.0)
|
82
|
-
unicode-display_width (2.
|
83
|
-
zeitwerk (2.
|
100
|
+
unicode-display_width (2.3.0)
|
101
|
+
zeitwerk (2.6.6)
|
84
102
|
|
85
103
|
PLATFORMS
|
86
104
|
arm64-darwin-21
|
105
|
+
arm64-darwin-22
|
87
106
|
x86_64-linux
|
88
107
|
|
89
108
|
DEPENDENCIES
|
90
|
-
bundler (~> 2.
|
109
|
+
bundler (~> 2.4.1)
|
91
110
|
rake (~> 13.0.6)
|
92
|
-
rspec (~> 3.
|
93
|
-
rubocop (~> 1.
|
94
|
-
rubocop-performance (~> 1.
|
111
|
+
rspec (~> 3.12.0)
|
112
|
+
rubocop (~> 1.41.1)
|
113
|
+
rubocop-performance (~> 1.15.2)
|
95
114
|
rubocop-rake (~> 0.6.0)
|
96
|
-
rubocop-rspec (~> 2.
|
115
|
+
rubocop-rspec (~> 2.16.0)
|
97
116
|
story_key!
|
98
117
|
|
99
118
|
BUNDLED WITH
|
100
|
-
2.
|
119
|
+
2.4.1
|
data/README.md
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
[![Gem Version](https://badge.fury.io/rb/story_key.svg)](https://badge.fury.io/rb/story_key)
|
2
|
-
![Gem Downloads](https://ruby-gem-downloads-badge.herokuapp.com/story_key?type=total)
|
3
2
|
[![Build Status](https://travis-ci.org/jcraigk/story_key.svg?branch=main)](https://travis-ci.org/jcraigk/story_key)
|
4
3
|
[![Maintainability](https://api.codeclimate.com/v1/badges/6046413814d7f6417ce9/maintainability)](https://codeclimate.com/github/jcraigk/story_key/maintainability)
|
5
4
|
|
@@ -8,23 +7,28 @@
|
|
8
7
|
|
9
8
|
| Gem Version | Locale | Lexicon SHA |
|
10
9
|
|-------------|--------|-------------|
|
11
|
-
| 0.
|
10
|
+
| 0.4.0 | Miami | 3bfbbf9 |
|
11
|
+
|
12
|
+
Locale will not change until v1.0 release
|
12
13
|
|
13
14
|
|
14
15
|
# StoryKey
|
15
16
|
|
16
|
-
StoryKey is a [Brainwallet](https://en.bitcoin.it/wiki/Brainwallet) inspired by [BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) written in [Ruby](https://www.ruby-lang.org/en/). It converts an arbitrary string of data, such as a [cryptocurrency private key](https://en.bitcoin.it/wiki/Private_key), into an English paragraph intended for longterm human memory. It also assists in decoding the story back into its original form.
|
17
|
+
StoryKey is a proof of concept [Brainwallet](https://en.bitcoin.it/wiki/Brainwallet) inspired by [BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) written in [Ruby](https://www.ruby-lang.org/en/). It converts an arbitrary string of data, such as a [cryptocurrency private key](https://en.bitcoin.it/wiki/Private_key), into an English paragraph intended for longterm human memory. It also assists in decoding the story back into its original form. Optionally, a visual representation of the paragraph is also provided using [OpenAI DALL-E](https://openai.com/dall-e-2).
|
17
18
|
|
18
|
-
Each story is provided in
|
19
|
-
* Humanized
|
19
|
+
Each story is provided in multiple formats:
|
20
|
+
* Humanized Text
|
20
21
|
* Version locale header ("In Miami I saw...")
|
21
22
|
* Enumerated phrases
|
22
23
|
* Colorized parts of speech (adjectives, verbs, nouns)
|
23
24
|
* Grammatical filler (articles, prepositions, conjunctions, punctuation)
|
24
|
-
* Tokenized
|
25
|
+
* Tokenized Text
|
25
26
|
* Ordered list of unique tokens
|
26
27
|
* Space-delimited lowercase alphanumeric/dash
|
27
28
|
* Useful as a seed phrase for generating derivative keys
|
29
|
+
* Graphical
|
30
|
+
* AI-generated images via [DALL-E](https://openai.com/dall-e-2)
|
31
|
+
* Requires OpenAI key
|
28
32
|
|
29
33
|
## Features
|
30
34
|
|
@@ -33,7 +37,7 @@ Each story is provided in two formats:
|
|
33
37
|
* Includes version slug to ensure accurate decoding
|
34
38
|
* Uses a repeating English grammar to aid in mnemonics
|
35
39
|
* Uses a lexicon curated for mental visualization
|
36
|
-
* Avoids
|
40
|
+
* Avoids word repetition
|
37
41
|
* Provides interactive command-line recovery
|
38
42
|
|
39
43
|
Each token of the story, which may be a single word or short compound phrase, encodes 10 bits. The checksum length is variable based on the input size and space available in the last two tokens after accounting for a 4-bit footer. Here are a few example key sizes along with their respective story and checksum sizes.
|
@@ -47,24 +51,25 @@ Each token of the story, which may be a single word or short compound phrase, en
|
|
47
51
|
| 384 | 40 | 12 |
|
48
52
|
| 512 | 53 | 14 |
|
49
53
|
|
50
|
-
An example key
|
54
|
+
An example key with its associated story, seed phrase, and image are shown below.
|
51
55
|
|
52
|
-
![
|
56
|
+
![KeyStory Example Text](https://user-images.githubusercontent.com/104095/210197560-45494c50-6382-465b-8163-a61b3783ac76.png)
|
57
|
+
![KeyStory Example Image](https://user-images.githubusercontent.com/104095/210197577-11e1d6ac-a32f-4438-b7eb-f766bf62f0f2.png)
|
53
58
|
|
54
59
|
```
|
55
60
|
Key:
|
56
|
-
|
61
|
+
CgCLLXvoch7sLaQWe5Y3Evtzety2Vr9XJGRmAq9YZUXY
|
57
62
|
Story:
|
58
63
|
In Miami I saw
|
59
|
-
1. a
|
60
|
-
2.
|
61
|
-
3.
|
62
|
-
4. a
|
63
|
-
5. a
|
64
|
-
6. a
|
65
|
-
7. and a
|
64
|
+
1. a practical theorist eating toast with a shopkeeper,
|
65
|
+
2. a jobless macaw disowning a scientist,
|
66
|
+
3. a toothsome brother eating dumplings with Paul Cezanne,
|
67
|
+
4. a rabid outsider leveling a vulture,
|
68
|
+
5. a hysterical Marge Simpson threatening Moe Szyslak,
|
69
|
+
6. a rancid cyborg demanding a jeweler,
|
70
|
+
7. and a wife paging Jimi Hendrix.
|
66
71
|
Seed Phrase:
|
67
|
-
|
72
|
+
miami practical theorist eating-toast shopkeeper jobless macaw disowning scientist toothsome brother eating-dumplings paul-cezanne rabid outsider leveling vulture hysterical marge-simpson threatening moe-szyslak rancid cyborg demanding jeweler wife paging jimi-hendrix
|
68
73
|
````
|
69
74
|
|
70
75
|
This paragraph or seed phrase can be deterministically decoded back into its original form using the same version of StoryKey. The locale of the story (e.g. `Miami`) identifies that version. During key recovery, an exception will be raised if:
|
@@ -86,11 +91,6 @@ The lexicon was selected using the following criteria:
|
|
86
91
|
* Balance brevity with clarity.
|
87
92
|
|
88
93
|
|
89
|
-
### Graphical Visualization
|
90
|
-
|
91
|
-
When AI becomes more common, StoryKey stories may be converted to graphical panels similar to the [DALL-E Project](https://openai.com/blog/dall-e/). This will likely aid in mnemonics process for many users.
|
92
|
-
|
93
|
-
|
94
94
|
## Installation
|
95
95
|
|
96
96
|
Add this line to your application's Gemfile:
|
@@ -113,7 +113,16 @@ $ gem install story_key
|
|
113
113
|
|
114
114
|
## Usage
|
115
115
|
|
116
|
-
This library may be used
|
116
|
+
This library may be used directly from the command line or by calling Ruby methods.
|
117
|
+
|
118
|
+
If you want to generate images of the story along with the text, create a file named `.env` in the project directory and add your [OpenAI key](https://beta.openai.com/account/api-keys) as an environment variable:
|
119
|
+
|
120
|
+
```
|
121
|
+
# .env
|
122
|
+
OPENAI_KEY=<your-api-key>
|
123
|
+
```
|
124
|
+
|
125
|
+
You must have [ImageMagick](https://imagemagick.org/index.php) installed locally.
|
117
126
|
|
118
127
|
|
119
128
|
### Command Line Usage
|
@@ -129,6 +138,8 @@ StoryKey commands:
|
|
129
138
|
storykey recover # Decode a story interactively
|
130
139
|
```
|
131
140
|
|
141
|
+
To see help on a specific command, run `bin/storyke --help [command]`.
|
142
|
+
|
132
143
|
The command line also features an interactive recovery tool to aid in converting a story back into its source key. Run `bin/storykey recover` to initiate the process:
|
133
144
|
|
134
145
|
![Key/Story Example](https://user-images.githubusercontent.com/104095/161376334-4a591100-e3fc-41ce-b931-4773bebc23fd.png)
|
@@ -141,10 +152,10 @@ After installing the gem, you may run `bin/console` or `require` the gem in your
|
|
141
152
|
|
142
153
|
### Generate new key/story
|
143
154
|
|
144
|
-
Generate a new random key
|
155
|
+
Generate a new random key and associated story.
|
145
156
|
|
146
157
|
```
|
147
|
-
|
158
|
+
# StoryKey.generate
|
148
159
|
=>
|
149
160
|
["4eqfoXzMDyqQW6p8zAQj7c8KkynK5K2BW6D5Vfp7xCaQ",
|
150
161
|
#<struct StoryKey::Story
|
@@ -157,12 +168,12 @@ Generate a new random key/story pair.
|
|
157
168
|
```
|
158
169
|
|
159
170
|
|
160
|
-
### Encode
|
171
|
+
### Encode an existing key
|
161
172
|
|
162
173
|
Produce an English paragraph given input data (e.g. a cryptocurrency private key):
|
163
174
|
|
164
175
|
```
|
165
|
-
|
176
|
+
# StoryKey.encode(key: '4eqfoXzMDyqQW6p8zAQj7c8KkynK5K2BW6D5Vfp7xCaQ')
|
166
177
|
=>
|
167
178
|
#<struct StoryKey::Story
|
168
179
|
text=
|
@@ -176,12 +187,12 @@ Produce an English paragraph given input data (e.g. a cryptocurrency private key
|
|
176
187
|
`key` may be in the form of a hexidecimal (`ab29f3`), a binary string (`1001101`), a decimal (`230938`), or a base58 string (`uMBca`). If not in the default base58, `format` must be provided.
|
177
188
|
|
178
189
|
|
179
|
-
### Decode
|
190
|
+
### Decode an existing story
|
180
191
|
|
181
192
|
Recover source data (e.g. a cryptocurrency private key) based on the English paragraph:
|
182
193
|
|
183
194
|
```
|
184
|
-
|
195
|
+
# StoryKey.decode(story: 'In Miami I saw an official Benjamin Franklin transport Matt Damon')
|
185
196
|
=> "4NTM"
|
186
197
|
```
|
187
198
|
|
@@ -195,7 +206,7 @@ When editing the lexicon, be sure to:
|
|
195
206
|
2. Copy the lexicon SHA into `version.rb` as well as this README (if publishing)
|
196
207
|
3. Increment the semantic version of the gem (if publishing)
|
197
208
|
|
198
|
-
When incrementing the semantic version, be sure to:
|
209
|
+
When incrementing the semantic version post-1.0, be sure to:
|
199
210
|
1. Create a new `VERSION_SLUG`, adhering to the locale convention
|
200
211
|
2. Append a row to the version reference at the top of this README
|
201
212
|
|
Binary file
|
data/assets/error.png
ADDED
Binary file
|
@@ -46,13 +46,11 @@ clear
|
|
46
46
|
cold
|
47
47
|
colorful
|
48
48
|
comical
|
49
|
-
complex
|
50
49
|
cosmic
|
51
50
|
coy
|
52
51
|
cynical
|
53
52
|
dangerous
|
54
53
|
dark
|
55
|
-
dead
|
56
54
|
decayed
|
57
55
|
deficient
|
58
56
|
delicate
|
@@ -152,7 +150,6 @@ late
|
|
152
150
|
lewd
|
153
151
|
liberal
|
154
152
|
limpid
|
155
|
-
limping
|
156
153
|
little
|
157
154
|
lively
|
158
155
|
lofty
|
@@ -307,11 +304,11 @@ volatile
|
|
307
304
|
wasteful
|
308
305
|
wholesome
|
309
306
|
wide
|
307
|
+
wide-eyed
|
310
308
|
wild
|
311
309
|
winged
|
312
310
|
wintery
|
313
311
|
wobbly
|
314
|
-
wonderful
|
315
312
|
woozy
|
316
313
|
worried
|
317
314
|
wrinkled
|
@@ -1,8 +1,8 @@
|
|
1
1
|
adamant
|
2
|
-
|
2
|
+
adament
|
3
3
|
affable
|
4
4
|
affluent
|
5
|
-
|
5
|
+
aging
|
6
6
|
albino
|
7
7
|
alcoholic
|
8
8
|
alluring
|
@@ -50,8 +50,8 @@ chaste
|
|
50
50
|
cheap
|
51
51
|
childish
|
52
52
|
childlike
|
53
|
-
choking
|
54
53
|
chubby
|
54
|
+
churlish
|
55
55
|
civilized
|
56
56
|
clairvoyant
|
57
57
|
clammy
|
@@ -91,6 +91,7 @@ dapper
|
|
91
91
|
dashing
|
92
92
|
dastardly
|
93
93
|
dazed
|
94
|
+
dead
|
94
95
|
deaf
|
95
96
|
decadent
|
96
97
|
decisive
|
@@ -107,6 +108,7 @@ difficult
|
|
107
108
|
dignified
|
108
109
|
diligent
|
109
110
|
dim
|
111
|
+
disabled
|
110
112
|
discreet
|
111
113
|
diseased
|
112
114
|
disguised
|
@@ -126,7 +128,6 @@ drunk
|
|
126
128
|
dull
|
127
129
|
dumb
|
128
130
|
dutiful
|
129
|
-
dying
|
130
131
|
eager
|
131
132
|
earnest
|
132
133
|
elderly
|
@@ -358,6 +359,7 @@ purring
|
|
358
359
|
pushy
|
359
360
|
queasy
|
360
361
|
quirky
|
362
|
+
quivering
|
361
363
|
rambling
|
362
364
|
rash
|
363
365
|
reckless
|
@@ -465,6 +467,7 @@ trashy
|
|
465
467
|
trembling
|
466
468
|
trendy
|
467
469
|
truthful
|
470
|
+
twitching
|
468
471
|
unconscious
|
469
472
|
undead
|
470
473
|
unkempt
|