Spaces:
Running
Running
added: trained tokenizer plus gradio app
Browse files- .gitignore +51 -0
- app.py +39 -4
- notebooks/train_eng.ipynb +885 -0
- notebooks/train_hindi.ipynb +0 -0
- requirements.txt +2 -2
- tokenizer/__init__.py +0 -0
- tokenizer/base.py +108 -0
- tokenizer/basic_bpe.py +73 -0
- tokenizer/regex_bpe.py +169 -0
- tokenizer/utils.py +55 -0
- tokenizer_model/hindi_sentiments_basic.model +4747 -0
- tokenizer_model/hindi_sentiments_basic.vocab +0 -0
- train.py +24 -0
.gitignore
ADDED
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Python
|
2 |
+
*.pyc
|
3 |
+
__pycache__/
|
4 |
+
*.pyo
|
5 |
+
*.pyd
|
6 |
+
|
7 |
+
# Virtual Environment
|
8 |
+
venv/
|
9 |
+
env/
|
10 |
+
env.bak/
|
11 |
+
env1/
|
12 |
+
venv1/
|
13 |
+
.venv/
|
14 |
+
.venv1/
|
15 |
+
env/
|
16 |
+
ENV/
|
17 |
+
env.bak/
|
18 |
+
ENV.bak/
|
19 |
+
env1/
|
20 |
+
ENV1/
|
21 |
+
.venv/
|
22 |
+
.venv1/
|
23 |
+
env/
|
24 |
+
ENV/
|
25 |
+
env.bak/
|
26 |
+
ENV.bak/
|
27 |
+
env1/
|
28 |
+
ENV1/
|
29 |
+
.venv/
|
30 |
+
.venv1/
|
31 |
+
|
32 |
+
# IDE
|
33 |
+
.idea/
|
34 |
+
.vscode/
|
35 |
+
|
36 |
+
# Logs
|
37 |
+
*.log
|
38 |
+
|
39 |
+
# Data
|
40 |
+
data/
|
41 |
+
|
42 |
+
# Compiled files
|
43 |
+
*.exe
|
44 |
+
*.dll
|
45 |
+
*.so
|
46 |
+
*.dylib
|
47 |
+
|
48 |
+
# Miscellaneous
|
49 |
+
*.swp
|
50 |
+
.DS_Store
|
51 |
+
data/
|
app.py
CHANGED
@@ -1,7 +1,42 @@
|
|
1 |
import gradio as gr
|
|
|
|
|
2 |
|
3 |
-
|
4 |
-
|
|
|
5 |
|
6 |
-
|
7 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
import gradio as gr
|
2 |
+
import os
|
3 |
+
from tokenizer.basic_bpe import BasicTokenizer
|
4 |
|
5 |
+
print("Loading the model...")
|
6 |
+
model_path = os.path.join(os.getcwd(), "tokenizer_model")
|
7 |
+
model_path = os.path.join(model_path, "hindi_sentiments_basic.model")
|
8 |
|
9 |
+
basic_tokenizer = BasicTokenizer()
|
10 |
+
basic_tokenizer.load(model_path)
|
11 |
+
|
12 |
+
|
13 |
+
def test_tokenizer(text):
|
14 |
+
ids = basic_tokenizer.encode(text)
|
15 |
+
decoded = basic_tokenizer.decode(ids)
|
16 |
+
mapping = [(str(i), basic_tokenizer.decode([i])) for i in ids]
|
17 |
+
|
18 |
+
return ids, decoded, mapping
|
19 |
+
|
20 |
+
|
21 |
+
with gr.Blocks() as demo:
|
22 |
+
gr.HTML("<h1 align = 'center'> Token Generation for Hindi Dataset </h1>")
|
23 |
+
|
24 |
+
with gr.Row():
|
25 |
+
with gr.Column():
|
26 |
+
inputs = [
|
27 |
+
gr.TextArea(
|
28 |
+
label="Enter initial text to generate tokens in Hindi", lines=10
|
29 |
+
)
|
30 |
+
]
|
31 |
+
generate_btn = gr.Button(value="Generate Text")
|
32 |
+
with gr.Column():
|
33 |
+
enc = gr.Textbox(label="Encoded Tokens")
|
34 |
+
txt = gr.Textbox(label="Decoded Text from tokens")
|
35 |
+
map = gr.Textbox(label="Mapping of the tokens and respective texts")
|
36 |
+
outputs = [enc, txt, map]
|
37 |
+
|
38 |
+
generate_btn.click(fn=test_tokenizer, inputs=inputs, outputs=outputs)
|
39 |
+
|
40 |
+
|
41 |
+
if __name__ == "__main__":
|
42 |
+
demo.launch(share=True)
|
notebooks/train_eng.ipynb
ADDED
@@ -0,0 +1,885 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": 1,
|
6 |
+
"metadata": {},
|
7 |
+
"outputs": [
|
8 |
+
{
|
9 |
+
"data": {
|
10 |
+
"application/javascript": "IPython.notebook.set_autosave_interval(300000)"
|
11 |
+
},
|
12 |
+
"metadata": {},
|
13 |
+
"output_type": "display_data"
|
14 |
+
},
|
15 |
+
{
|
16 |
+
"name": "stdout",
|
17 |
+
"output_type": "stream",
|
18 |
+
"text": [
|
19 |
+
"Autosaving every 300 seconds\n"
|
20 |
+
]
|
21 |
+
}
|
22 |
+
],
|
23 |
+
"source": [
|
24 |
+
"%autosave 300\n",
|
25 |
+
"%reload_ext autoreload\n",
|
26 |
+
"%autoreload 2\n",
|
27 |
+
"%config Completer.use_jedi = False"
|
28 |
+
]
|
29 |
+
},
|
30 |
+
{
|
31 |
+
"cell_type": "code",
|
32 |
+
"execution_count": 2,
|
33 |
+
"metadata": {},
|
34 |
+
"outputs": [
|
35 |
+
{
|
36 |
+
"name": "stdout",
|
37 |
+
"output_type": "stream",
|
38 |
+
"text": [
|
39 |
+
"/mnt/batch/tasks/shared/LS_root/mounts/clusters/insights-model-run2/code/Users/soutrik.chowdhury/EraV2_Transformers/S20_tokenizer\n"
|
40 |
+
]
|
41 |
+
}
|
42 |
+
],
|
43 |
+
"source": [
|
44 |
+
"import os\n",
|
45 |
+
"\n",
|
46 |
+
"os.chdir(\n",
|
47 |
+
" \"/mnt/batch/tasks/shared/LS_root/mounts/clusters/insights-model-run2/code/Users/soutrik.chowdhury/EraV2_S20_tokenization\"\n",
|
48 |
+
")\n",
|
49 |
+
"print(os.getcwd())"
|
50 |
+
]
|
51 |
+
},
|
52 |
+
{
|
53 |
+
"cell_type": "code",
|
54 |
+
"execution_count": 3,
|
55 |
+
"metadata": {},
|
56 |
+
"outputs": [],
|
57 |
+
"source": [
|
58 |
+
"from tokenizer.basic_bpe import BasicTokenizer\n",
|
59 |
+
"from tokenizer.regex_bpe import RegexTokenizer"
|
60 |
+
]
|
61 |
+
},
|
62 |
+
{
|
63 |
+
"cell_type": "code",
|
64 |
+
"execution_count": 5,
|
65 |
+
"metadata": {},
|
66 |
+
"outputs": [],
|
67 |
+
"source": [
|
68 |
+
"file_name = \"tiny_shakespeare.txt\"\n",
|
69 |
+
"file_path = os.path.join(os.getcwd(), \"data\", file_name)\n",
|
70 |
+
"\n",
|
71 |
+
"with open(file_path, \"r\") as f:\n",
|
72 |
+
" text = f.read()"
|
73 |
+
]
|
74 |
+
},
|
75 |
+
{
|
76 |
+
"cell_type": "code",
|
77 |
+
"execution_count": 6,
|
78 |
+
"metadata": {},
|
79 |
+
"outputs": [
|
80 |
+
{
|
81 |
+
"name": "stdout",
|
82 |
+
"output_type": "stream",
|
83 |
+
"text": [
|
84 |
+
"The length of the text is 1115394\n"
|
85 |
+
]
|
86 |
+
}
|
87 |
+
],
|
88 |
+
"source": [
|
89 |
+
"print(f\"The length of the text is {len(text)}\")"
|
90 |
+
]
|
91 |
+
},
|
92 |
+
{
|
93 |
+
"cell_type": "markdown",
|
94 |
+
"metadata": {},
|
95 |
+
"source": [
|
96 |
+
"creating the model file for basic tokenizer"
|
97 |
+
]
|
98 |
+
},
|
99 |
+
{
|
100 |
+
"cell_type": "code",
|
101 |
+
"execution_count": 10,
|
102 |
+
"metadata": {},
|
103 |
+
"outputs": [],
|
104 |
+
"source": [
|
105 |
+
"model_path = os.path.join(os.getcwd(), \"tokenizer_model\")\n",
|
106 |
+
"os.makedirs(model_path, exist_ok=True)"
|
107 |
+
]
|
108 |
+
},
|
109 |
+
{
|
110 |
+
"cell_type": "code",
|
111 |
+
"execution_count": 9,
|
112 |
+
"metadata": {},
|
113 |
+
"outputs": [
|
114 |
+
{
|
115 |
+
"name": "stdout",
|
116 |
+
"output_type": "stream",
|
117 |
+
"text": [
|
118 |
+
"merge 1/256: (101, 32) -> 256 (b'e ') had 27643 occurrences\n",
|
119 |
+
"merge 2/256: (116, 104) -> 257 (b'th') had 22739 occurrences\n",
|
120 |
+
"merge 3/256: (116, 32) -> 258 (b't ') had 16508 occurrences\n",
|
121 |
+
"merge 4/256: (115, 32) -> 259 (b's ') had 15364 occurrences\n",
|
122 |
+
"merge 5/256: (100, 32) -> 260 (b'd ') had 14165 occurrences\n",
|
123 |
+
"merge 6/256: (44, 32) -> 261 (b', ') had 14098 occurrences\n",
|
124 |
+
"merge 7/256: (111, 117) -> 262 (b'ou') had 12730 occurrences\n",
|
125 |
+
"merge 8/256: (101, 114) -> 263 (b'er') had 11771 occurrences\n",
|
126 |
+
"merge 9/256: (105, 110) -> 264 (b'in') had 10606 occurrences\n",
|
127 |
+
"merge 10/256: (121, 32) -> 265 (b'y ') had 10283 occurrences\n",
|
128 |
+
"merge 11/256: (97, 110) -> 266 (b'an') had 10197 occurrences\n",
|
129 |
+
"merge 12/256: (58, 10) -> 267 (b':\\n') had 8762 occurrences\n",
|
130 |
+
"merge 13/256: (111, 114) -> 268 (b'or') had 8458 occurrences\n",
|
131 |
+
"merge 14/256: (111, 32) -> 269 (b'o ') had 8134 occurrences\n",
|
132 |
+
"merge 15/256: (101, 110) -> 270 (b'en') had 7568 occurrences\n",
|
133 |
+
"merge 16/256: (10, 10) -> 271 (b'\\n\\n') had 7098 occurrences\n",
|
134 |
+
"merge 17/256: (97, 114) -> 272 (b'ar') had 7081 occurrences\n",
|
135 |
+
"merge 18/256: (32, 257) -> 273 (b' th') had 6662 occurrences\n",
|
136 |
+
"merge 19/256: (111, 110) -> 274 (b'on') had 6435 occurrences\n",
|
137 |
+
"merge 20/256: (108, 108) -> 275 (b'll') had 6357 occurrences\n",
|
138 |
+
"merge 21/256: (104, 97) -> 276 (b'ha') had 6055 occurrences\n",
|
139 |
+
"merge 22/256: (44, 10) -> 277 (b',\\n') had 5501 occurrences\n",
|
140 |
+
"merge 23/256: (46, 271) -> 278 (b'.\\n\\n') had 5018 occurrences\n",
|
141 |
+
"merge 24/256: (105, 259) -> 279 (b'is ') had 4913 occurrences\n",
|
142 |
+
"merge 25/256: (101, 115) -> 280 (b'es') had 4878 occurrences\n",
|
143 |
+
"merge 26/256: (121, 262) -> 281 (b'you') had 4649 occurrences\n",
|
144 |
+
"merge 27/256: (32, 115) -> 282 (b' s') had 4207 occurrences\n",
|
145 |
+
"merge 28/256: (116, 269) -> 283 (b'to ') had 4099 occurrences\n",
|
146 |
+
"merge 29/256: (266, 260) -> 284 (b'and ') had 3968 occurrences\n",
|
147 |
+
"merge 30/256: (111, 119) -> 285 (b'ow') had 3964 occurrences\n",
|
148 |
+
"merge 31/256: (101, 97) -> 286 (b'ea') had 3943 occurrences\n",
|
149 |
+
"merge 32/256: (32, 109) -> 287 (b' m') had 3906 occurrences\n",
|
150 |
+
"merge 33/256: (32, 119) -> 288 (b' w') had 3854 occurrences\n",
|
151 |
+
"merge 34/256: (111, 102) -> 289 (b'of') had 3836 occurrences\n",
|
152 |
+
"merge 35/256: (32, 104) -> 290 (b' h') had 3668 occurrences\n",
|
153 |
+
"merge 36/256: (264, 103) -> 291 (b'ing') had 3660 occurrences\n",
|
154 |
+
"merge 37/256: (111, 109) -> 292 (b'om') had 3614 occurrences\n",
|
155 |
+
"merge 38/256: (32, 97) -> 293 (b' a') had 3124 occurrences\n",
|
156 |
+
"merge 39/256: (99, 104) -> 294 (b'ch') had 2974 occurrences\n",
|
157 |
+
"merge 40/256: (257, 256) -> 295 (b'the ') had 2967 occurrences\n",
|
158 |
+
"merge 41/256: (115, 116) -> 296 (b'st') had 2961 occurrences\n",
|
159 |
+
"merge 42/256: (32, 98) -> 297 (b' b') had 2855 occurrences\n",
|
160 |
+
"merge 43/256: (110, 111) -> 298 (b'no') had 2756 occurrences\n",
|
161 |
+
"merge 44/256: (105, 114) -> 299 (b'ir') had 2700 occurrences\n",
|
162 |
+
"merge 45/256: (102, 268) -> 300 (b'for') had 2698 occurrences\n",
|
163 |
+
"merge 46/256: (118, 256) -> 301 (b've ') had 2650 occurrences\n",
|
164 |
+
"merge 47/256: (101, 261) -> 302 (b'e, ') had 2591 occurrences\n",
|
165 |
+
"merge 48/256: (105, 257) -> 303 (b'ith') had 2421 occurrences\n",
|
166 |
+
"merge 49/256: (273, 256) -> 304 (b' the ') had 2397 occurrences\n",
|
167 |
+
"merge 50/256: (115, 101) -> 305 (b'se') had 2373 occurrences\n",
|
168 |
+
"merge 51/256: (108, 105) -> 306 (b'li') had 2358 occurrences\n",
|
169 |
+
"merge 52/256: (84, 104) -> 307 (b'Th') had 2356 occurrences\n",
|
170 |
+
"merge 53/256: (275, 32) -> 308 (b'll ') had 2246 occurrences\n",
|
171 |
+
"merge 54/256: (114, 101) -> 309 (b're') had 2164 occurrences\n",
|
172 |
+
"merge 55/256: (115, 258) -> 310 (b'st ') had 2125 occurrences\n",
|
173 |
+
"merge 56/256: (97, 258) -> 311 (b'at ') had 2124 occurrences\n",
|
174 |
+
"merge 57/256: (65, 110) -> 312 (b'An') had 2105 occurrences\n",
|
175 |
+
"merge 58/256: (73, 32) -> 313 (b'I ') had 2092 occurrences\n",
|
176 |
+
"merge 59/256: (101, 272) -> 314 (b'ear') had 2081 occurrences\n",
|
177 |
+
"merge 60/256: (105, 109) -> 315 (b'im') had 2077 occurrences\n",
|
178 |
+
"merge 61/256: (105, 116) -> 316 (b'it') had 2070 occurrences\n",
|
179 |
+
"merge 62/256: (111, 111) -> 317 (b'oo') had 2025 occurrences\n",
|
180 |
+
"merge 63/256: (103, 104) -> 318 (b'gh') had 1981 occurrences\n",
|
181 |
+
"merge 64/256: (97, 116) -> 319 (b'at') had 1977 occurrences\n",
|
182 |
+
"merge 65/256: (105, 115) -> 320 (b'is') had 1941 occurrences\n",
|
183 |
+
"merge 66/256: (108, 101) -> 321 (b'le') had 1896 occurrences\n",
|
184 |
+
"merge 67/256: (263, 32) -> 322 (b'er ') had 1847 occurrences\n",
|
185 |
+
"merge 68/256: (262, 114) -> 323 (b'our') had 1816 occurrences\n",
|
186 |
+
"merge 69/256: (312, 260) -> 324 (b'And ') had 1801 occurrences\n",
|
187 |
+
"merge 70/256: (39, 259) -> 325 (b\"'s \") had 1767 occurrences\n",
|
188 |
+
"merge 71/256: (101, 101) -> 326 (b'ee') had 1763 occurrences\n",
|
189 |
+
"merge 72/256: (298, 258) -> 327 (b'not ') had 1749 occurrences\n",
|
190 |
+
"merge 73/256: (109, 265) -> 328 (b'my ') had 1725 occurrences\n",
|
191 |
+
"merge 74/256: (59, 10) -> 329 (b';\\n') had 1688 occurrences\n",
|
192 |
+
"merge 75/256: (114, 97) -> 330 (b'ra') had 1667 occurrences\n",
|
193 |
+
"merge 76/256: (46, 10) -> 331 (b'.\\n') had 1658 occurrences\n",
|
194 |
+
"merge 77/256: (281, 114) -> 332 (b'your') had 1634 occurrences\n",
|
195 |
+
"merge 78/256: (117, 114) -> 333 (b'ur') had 1632 occurrences\n",
|
196 |
+
"merge 79/256: (276, 258) -> 334 (b'hat ') had 1562 occurrences\n",
|
197 |
+
"merge 80/256: (114, 105) -> 335 (b'ri') had 1560 occurrences\n",
|
198 |
+
"merge 81/256: (117, 258) -> 336 (b'ut ') had 1555 occurrences\n",
|
199 |
+
"merge 82/256: (108, 260) -> 337 (b'ld ') had 1545 occurrences\n",
|
200 |
+
"merge 83/256: (289, 32) -> 338 (b'of ') had 1494 occurrences\n",
|
201 |
+
"merge 84/256: (79, 267) -> 339 (b'O:\\n') had 1494 occurrences\n",
|
202 |
+
"merge 85/256: (101, 260) -> 340 (b'ed ') had 1479 occurrences\n",
|
203 |
+
"merge 86/256: (108, 97) -> 341 (b'la') had 1460 occurrences\n",
|
204 |
+
"merge 87/256: (105, 258) -> 342 (b'it ') had 1444 occurrences\n",
|
205 |
+
"merge 88/256: (114, 111) -> 343 (b'ro') had 1434 occurrences\n",
|
206 |
+
"merge 89/256: (263, 256) -> 344 (b'ere ') had 1397 occurrences\n",
|
207 |
+
"merge 90/256: (101, 259) -> 345 (b'es ') had 1385 occurrences\n",
|
208 |
+
"merge 91/256: (100, 261) -> 346 (b'd, ') had 1381 occurrences\n",
|
209 |
+
"merge 92/256: (117, 110) -> 347 (b'un') had 1374 occurrences\n",
|
210 |
+
"merge 93/256: (69, 78) -> 348 (b'EN') had 1373 occurrences\n",
|
211 |
+
"merge 94/256: (107, 256) -> 349 (b'ke ') had 1367 occurrences\n",
|
212 |
+
"merge 95/256: (121, 261) -> 350 (b'y, ') had 1339 occurrences\n",
|
213 |
+
"merge 96/256: (73, 78) -> 351 (b'IN') had 1313 occurrences\n",
|
214 |
+
"merge 97/256: (32, 100) -> 352 (b' d') had 1295 occurrences\n",
|
215 |
+
"merge 98/256: (63, 271) -> 353 (b'?\\n\\n') had 1294 occurrences\n",
|
216 |
+
"merge 99/256: (97, 259) -> 354 (b'as ') had 1294 occurrences\n",
|
217 |
+
"merge 100/256: (102, 97) -> 355 (b'fa') had 1267 occurrences\n",
|
218 |
+
"merge 101/256: (119, 303) -> 356 (b'with') had 1258 occurrences\n",
|
219 |
+
"merge 102/256: (276, 301) -> 357 (b'have ') had 1240 occurrences\n",
|
220 |
+
"merge 103/256: (83, 267) -> 358 (b'S:\\n') had 1230 occurrences\n",
|
221 |
+
"merge 104/256: (32, 99) -> 359 (b' c') had 1228 occurrences\n",
|
222 |
+
"merge 105/256: (87, 104) -> 360 (b'Wh') had 1226 occurrences\n",
|
223 |
+
"merge 106/256: (257, 311) -> 361 (b'that ') had 1222 occurrences\n",
|
224 |
+
"merge 107/256: (270, 116) -> 362 (b'ent') had 1221 occurrences\n",
|
225 |
+
"merge 108/256: (257, 101) -> 363 (b'the') had 1213 occurrences\n",
|
226 |
+
"merge 109/256: (99, 101) -> 364 (b'ce') had 1206 occurrences\n",
|
227 |
+
"merge 110/256: (115, 104) -> 365 (b'sh') had 1195 occurrences\n",
|
228 |
+
"merge 111/256: (109, 97) -> 366 (b'ma') had 1173 occurrences\n",
|
229 |
+
"merge 112/256: (32, 112) -> 367 (b' p') had 1167 occurrences\n",
|
230 |
+
"merge 113/256: (257, 263) -> 368 (b'ther') had 1133 occurrences\n",
|
231 |
+
"merge 114/256: (98, 101) -> 369 (b'be') had 1131 occurrences\n",
|
232 |
+
"merge 115/256: (46, 32) -> 370 (b'. ') had 1127 occurrences\n",
|
233 |
+
"merge 116/256: (65, 82) -> 371 (b'AR') had 1124 occurrences\n",
|
234 |
+
"merge 117/256: (99, 256) -> 372 (b'ce ') had 1116 occurrences\n",
|
235 |
+
"merge 118/256: (291, 32) -> 373 (b'ing ') had 1113 occurrences\n",
|
236 |
+
"merge 119/256: (97, 108) -> 374 (b'al') had 1098 occurrences\n",
|
237 |
+
"merge 120/256: (59, 32) -> 375 (b'; ') had 1091 occurrences\n",
|
238 |
+
"merge 121/256: (257, 262) -> 376 (b'thou') had 1088 occurrences\n",
|
239 |
+
"merge 122/256: (115, 261) -> 377 (b's, ') had 1086 occurrences\n",
|
240 |
+
"merge 123/256: (109, 256) -> 378 (b'me ') had 1081 occurrences\n",
|
241 |
+
"merge 124/256: (115, 256) -> 379 (b'se ') had 1078 occurrences\n",
|
242 |
+
"merge 125/256: (108, 111) -> 380 (b'lo') had 1077 occurrences\n",
|
243 |
+
"merge 126/256: (99, 107) -> 381 (b'ck') had 1061 occurrences\n",
|
244 |
+
"merge 127/256: (119, 104) -> 382 (b'wh') had 1057 occurrences\n",
|
245 |
+
"merge 128/256: (105, 108) -> 383 (b'il') had 1046 occurrences\n",
|
246 |
+
"merge 129/256: (39, 260) -> 384 (b\"'d \") had 1026 occurrences\n",
|
247 |
+
"merge 130/256: (73, 339) -> 385 (b'IO:\\n') had 1025 occurrences\n",
|
248 |
+
"merge 131/256: (110, 285) -> 386 (b'now') had 1022 occurrences\n",
|
249 |
+
"merge 132/256: (105, 275) -> 387 (b'ill') had 1016 occurrences\n",
|
250 |
+
"merge 133/256: (98, 256) -> 388 (b'be ') had 982 occurrences\n",
|
251 |
+
"merge 134/256: (101, 275) -> 389 (b'ell') had 982 occurrences\n",
|
252 |
+
"merge 135/256: (114, 286) -> 390 (b'rea') had 978 occurrences\n",
|
253 |
+
"merge 136/256: (32, 116) -> 391 (b' t') had 972 occurrences\n",
|
254 |
+
"merge 137/256: (116, 261) -> 392 (b't, ') had 971 occurrences\n",
|
255 |
+
"merge 138/256: (262, 337) -> 393 (b'ould ') had 970 occurrences\n",
|
256 |
+
"merge 139/256: (101, 10) -> 394 (b'e\\n') had 962 occurrences\n",
|
257 |
+
"merge 140/256: (287, 265) -> 395 (b' my ') had 959 occurrences\n",
|
258 |
+
"merge 141/256: (118, 263) -> 396 (b'ver') had 955 occurrences\n",
|
259 |
+
"merge 142/256: (99, 292) -> 397 (b'com') had 952 occurrences\n",
|
260 |
+
"merge 143/256: (104, 256) -> 398 (b'he ') had 929 occurrences\n",
|
261 |
+
"merge 144/256: (32, 283) -> 399 (b' to ') had 926 occurrences\n",
|
262 |
+
"merge 145/256: (32, 73) -> 400 (b' I') had 906 occurrences\n",
|
263 |
+
"merge 146/256: (101, 108) -> 401 (b'el') had 902 occurrences\n",
|
264 |
+
"merge 147/256: (85, 358) -> 402 (b'US:\\n') had 879 occurrences\n",
|
265 |
+
"merge 148/256: (111, 108) -> 403 (b'ol') had 871 occurrences\n",
|
266 |
+
"merge 149/256: (100, 105) -> 404 (b'di') had 869 occurrences\n",
|
267 |
+
"merge 150/256: (32, 103) -> 405 (b' g') had 864 occurrences\n",
|
268 |
+
"merge 151/256: (97, 265) -> 406 (b'ay ') had 849 occurrences\n",
|
269 |
+
"merge 152/256: (116, 263) -> 407 (b'ter') had 849 occurrences\n",
|
270 |
+
"merge 153/256: (97, 264) -> 408 (b'ain') had 844 occurrences\n",
|
271 |
+
"merge 154/256: (32, 281) -> 409 (b' you') had 844 occurrences\n",
|
272 |
+
"merge 155/256: (307, 256) -> 410 (b'The ') had 843 occurrences\n",
|
273 |
+
"merge 156/256: (108, 256) -> 411 (b'le ') had 839 occurrences\n",
|
274 |
+
"merge 157/256: (105, 274) -> 412 (b'ion') had 838 occurrences\n",
|
275 |
+
"merge 158/256: (32, 102) -> 413 (b' f') had 826 occurrences\n",
|
276 |
+
"merge 159/256: (114, 117) -> 414 (b'ru') had 819 occurrences\n",
|
277 |
+
"merge 160/256: (105, 102) -> 415 (b'if') had 817 occurrences\n",
|
278 |
+
"merge 161/256: (101, 109) -> 416 (b'em') had 810 occurrences\n",
|
279 |
+
"merge 162/256: (266, 100) -> 417 (b'and') had 801 occurrences\n",
|
280 |
+
"merge 163/256: (84, 269) -> 418 (b'To ') had 800 occurrences\n",
|
281 |
+
"merge 164/256: (105, 318) -> 419 (b'igh') had 798 occurrences\n",
|
282 |
+
"merge 165/256: (272, 256) -> 420 (b'are ') had 796 occurrences\n",
|
283 |
+
"merge 166/256: (117, 112) -> 421 (b'up') had 779 occurrences\n",
|
284 |
+
"merge 167/256: (277, 324) -> 422 (b',\\nAnd ') had 774 occurrences\n",
|
285 |
+
"merge 168/256: (104, 315) -> 423 (b'him') had 761 occurrences\n",
|
286 |
+
"merge 169/256: (101, 100) -> 424 (b'ed') had 751 occurrences\n",
|
287 |
+
"merge 170/256: (105, 308) -> 425 (b'ill ') had 743 occurrences\n",
|
288 |
+
"merge 171/256: (268, 100) -> 426 (b'ord') had 736 occurrences\n",
|
289 |
+
"merge 172/256: (105, 294) -> 427 (b'ich') had 733 occurrences\n",
|
290 |
+
"merge 173/256: (108, 265) -> 428 (b'ly ') had 732 occurrences\n",
|
291 |
+
"merge 174/256: (317, 260) -> 429 (b'ood ') had 726 occurrences\n",
|
292 |
+
"merge 175/256: (85, 67) -> 430 (b'UC') had 725 occurrences\n",
|
293 |
+
"merge 176/256: (285, 110) -> 431 (b'own') had 717 occurrences\n",
|
294 |
+
"merge 177/256: (104, 279) -> 432 (b'his ') had 706 occurrences\n",
|
295 |
+
"merge 178/256: (351, 71) -> 433 (b'ING') had 703 occurrences\n",
|
296 |
+
"merge 179/256: (32, 284) -> 434 (b' and ') had 701 occurrences\n",
|
297 |
+
"merge 180/256: (99, 274) -> 435 (b'con') had 700 occurrences\n",
|
298 |
+
"merge 181/256: (110, 101) -> 436 (b'ne') had 699 occurrences\n",
|
299 |
+
"merge 182/256: (97, 121) -> 437 (b'ay') had 697 occurrences\n",
|
300 |
+
"merge 183/256: (101, 278) -> 438 (b'e.\\n\\n') had 693 occurrences\n",
|
301 |
+
"merge 184/256: (114, 292) -> 439 (b'rom') had 690 occurrences\n",
|
302 |
+
"merge 185/256: (105, 100) -> 440 (b'id') had 681 occurrences\n",
|
303 |
+
"merge 186/256: (117, 115) -> 441 (b'us') had 679 occurrences\n",
|
304 |
+
"merge 187/256: (262, 110) -> 442 (b'oun') had 677 occurrences\n",
|
305 |
+
"merge 188/256: (65, 78) -> 443 (b'AN') had 677 occurrences\n",
|
306 |
+
"merge 189/256: (109, 266) -> 444 (b'man') had 675 occurrences\n",
|
307 |
+
"merge 190/256: (97, 103) -> 445 (b'ag') had 669 occurrences\n",
|
308 |
+
"merge 191/256: (69, 82) -> 446 (b'ER') had 665 occurrences\n",
|
309 |
+
"merge 192/256: (79, 82) -> 447 (b'OR') had 663 occurrences\n",
|
310 |
+
"merge 193/256: (101, 258) -> 448 (b'et ') had 657 occurrences\n",
|
311 |
+
"merge 194/256: (114, 280) -> 449 (b'res') had 655 occurrences\n",
|
312 |
+
"merge 195/256: (305, 108) -> 450 (b'sel') had 649 occurrences\n",
|
313 |
+
"merge 196/256: (290, 279) -> 451 (b' his ') had 647 occurrences\n",
|
314 |
+
"merge 197/256: (101, 277) -> 452 (b'e,\\n') had 646 occurrences\n",
|
315 |
+
"merge 198/256: (101, 116) -> 453 (b'et') had 643 occurrences\n",
|
316 |
+
"merge 199/256: (99, 97) -> 454 (b'ca') had 642 occurrences\n",
|
317 |
+
"merge 200/256: (32, 264) -> 455 (b' in') had 641 occurrences\n",
|
318 |
+
"merge 201/256: (115, 276) -> 456 (b'sha') had 636 occurrences\n",
|
319 |
+
"merge 202/256: (33, 10) -> 457 (b'!\\n') had 635 occurrences\n",
|
320 |
+
"merge 203/256: (69, 84) -> 458 (b'ET') had 628 occurrences\n",
|
321 |
+
"merge 204/256: (84, 334) -> 459 (b'That ') had 615 occurrences\n",
|
322 |
+
"merge 205/256: (112, 111) -> 460 (b'po') had 611 occurrences\n",
|
323 |
+
"merge 206/256: (113, 117) -> 461 (b'qu') had 609 occurrences\n",
|
324 |
+
"merge 207/256: (257, 265) -> 462 (b'thy ') had 596 occurrences\n",
|
325 |
+
"merge 208/256: (33, 271) -> 463 (b'!\\n\\n') had 594 occurrences\n",
|
326 |
+
"merge 209/256: (109, 268) -> 464 (b'mor') had 584 occurrences\n",
|
327 |
+
"merge 210/256: (117, 108) -> 465 (b'ul') had 581 occurrences\n",
|
328 |
+
"merge 211/256: (110, 269) -> 466 (b'no ') had 579 occurrences\n",
|
329 |
+
"merge 212/256: (97, 109) -> 467 (b'am') had 577 occurrences\n",
|
330 |
+
"merge 213/256: (273, 101) -> 468 (b' the') had 572 occurrences\n",
|
331 |
+
"merge 214/256: (65, 267) -> 469 (b'A:\\n') had 570 occurrences\n",
|
332 |
+
"merge 215/256: (118, 270) -> 470 (b'ven') had 569 occurrences\n",
|
333 |
+
"merge 216/256: (98, 265) -> 471 (b'by ') had 566 occurrences\n",
|
334 |
+
"merge 217/256: (115, 10) -> 472 (b's\\n') had 560 occurrences\n",
|
335 |
+
"merge 218/256: (115, 112) -> 473 (b'sp') had 556 occurrences\n",
|
336 |
+
"merge 219/256: (75, 433) -> 474 (b'KING') had 556 occurrences\n",
|
337 |
+
"merge 220/256: (290, 315) -> 475 (b' him') had 553 occurrences\n",
|
338 |
+
"merge 221/256: (257, 279) -> 476 (b'this ') had 552 occurrences\n",
|
339 |
+
"merge 222/256: (273, 279) -> 477 (b' this ') had 552 occurrences\n",
|
340 |
+
"merge 223/256: (104, 263) -> 478 (b'her') had 552 occurrences\n",
|
341 |
+
"merge 224/256: (273, 311) -> 479 (b' that ') had 542 occurrences\n",
|
342 |
+
"merge 225/256: (111, 257) -> 480 (b'oth') had 539 occurrences\n",
|
343 |
+
"merge 226/256: (63, 10) -> 481 (b'?\\n') had 539 occurrences\n",
|
344 |
+
"merge 227/256: (274, 103) -> 482 (b'ong') had 537 occurrences\n",
|
345 |
+
"merge 228/256: (66, 336) -> 483 (b'But ') had 536 occurrences\n",
|
346 |
+
"merge 229/256: (280, 258) -> 484 (b'est ') had 532 occurrences\n",
|
347 |
+
"merge 230/256: (111, 261) -> 485 (b'o, ') had 528 occurrences\n",
|
348 |
+
"merge 231/256: (98, 336) -> 486 (b'but ') had 526 occurrences\n",
|
349 |
+
"merge 232/256: (32, 289) -> 487 (b' of') had 525 occurrences\n",
|
350 |
+
"merge 233/256: (70, 268) -> 488 (b'For') had 522 occurrences\n",
|
351 |
+
"merge 234/256: (115, 117) -> 489 (b'su') had 521 occurrences\n",
|
352 |
+
"merge 235/256: (288, 303) -> 490 (b' with') had 517 occurrences\n",
|
353 |
+
"merge 236/256: (117, 116) -> 491 (b'ut') had 517 occurrences\n",
|
354 |
+
"merge 237/256: (274, 256) -> 492 (b'one ') had 514 occurrences\n",
|
355 |
+
"merge 238/256: (97, 275) -> 493 (b'all') had 512 occurrences\n",
|
356 |
+
"merge 239/256: (73, 67) -> 494 (b'IC') had 509 occurrences\n",
|
357 |
+
"merge 240/256: (270, 100) -> 495 (b'end') had 500 occurrences\n",
|
358 |
+
"merge 241/256: (79, 76) -> 496 (b'OL') had 497 occurrences\n",
|
359 |
+
"merge 242/256: (100, 269) -> 497 (b'do ') had 495 occurrences\n",
|
360 |
+
"merge 243/256: (73, 288) -> 498 (b'I w') had 495 occurrences\n",
|
361 |
+
"merge 244/256: (292, 256) -> 499 (b'ome ') had 494 occurrences\n",
|
362 |
+
"merge 245/256: (107, 386) -> 500 (b'know') had 493 occurrences\n",
|
363 |
+
"merge 246/256: (115, 277) -> 501 (b's,\\n') had 493 occurrences\n",
|
364 |
+
"merge 247/256: (115, 299) -> 502 (b'sir') had 493 occurrences\n",
|
365 |
+
"merge 248/256: (261, 284) -> 503 (b', and ') had 490 occurrences\n",
|
366 |
+
"merge 249/256: (99, 116) -> 504 (b'ct') had 490 occurrences\n",
|
367 |
+
"merge 250/256: (117, 259) -> 505 (b'us ') had 489 occurrences\n",
|
368 |
+
"merge 251/256: (280, 259) -> 506 (b'ess ') had 486 occurrences\n",
|
369 |
+
"merge 252/256: (450, 102) -> 507 (b'self') had 486 occurrences\n",
|
370 |
+
"merge 253/256: (282, 116) -> 508 (b' st') had 486 occurrences\n",
|
371 |
+
"merge 254/256: (97, 349) -> 509 (b'ake ') had 481 occurrences\n",
|
372 |
+
"merge 255/256: (69, 76) -> 510 (b'EL') had 481 occurrences\n",
|
373 |
+
"merge 256/256: (107, 291) -> 511 (b'king') had 479 occurrences\n"
|
374 |
+
]
|
375 |
+
}
|
376 |
+
],
|
377 |
+
"source": [
|
378 |
+
"basic_tokenizer = BasicTokenizer()\n",
|
379 |
+
"basic_tokenizer.train(text, vocab_size=512, verbose=True)"
|
380 |
+
]
|
381 |
+
},
|
382 |
+
{
|
383 |
+
"cell_type": "code",
|
384 |
+
"execution_count": 11,
|
385 |
+
"metadata": {},
|
386 |
+
"outputs": [],
|
387 |
+
"source": [
|
388 |
+
"prefix = os.path.join(model_path, \"shakespeare_basic\")\n",
|
389 |
+
"basic_tokenizer.save(prefix)"
|
390 |
+
]
|
391 |
+
},
|
392 |
+
{
|
393 |
+
"cell_type": "markdown",
|
394 |
+
"metadata": {},
|
395 |
+
"source": [
|
396 |
+
"Regex tokenizer"
|
397 |
+
]
|
398 |
+
},
|
399 |
+
{
|
400 |
+
"cell_type": "code",
|
401 |
+
"execution_count": 12,
|
402 |
+
"metadata": {},
|
403 |
+
"outputs": [
|
404 |
+
{
|
405 |
+
"name": "stdout",
|
406 |
+
"output_type": "stream",
|
407 |
+
"text": [
|
408 |
+
"merge 1/256: (32, 116) -> 256 (b' t') had 23837 occurrences\n",
|
409 |
+
"merge 2/256: (104, 101) -> 257 (b'he') had 18203 occurrences\n",
|
410 |
+
"merge 3/256: (32, 97) -> 258 (b' a') had 13541 occurrences\n",
|
411 |
+
"merge 4/256: (111, 117) -> 259 (b'ou') had 12730 occurrences\n",
|
412 |
+
"merge 5/256: (32, 115) -> 260 (b' s') had 12287 occurrences\n",
|
413 |
+
"merge 6/256: (32, 109) -> 261 (b' m') had 10786 occurrences\n",
|
414 |
+
"merge 7/256: (105, 110) -> 262 (b'in') had 10606 occurrences\n",
|
415 |
+
"merge 8/256: (32, 119) -> 263 (b' w') had 10546 occurrences\n",
|
416 |
+
"merge 9/256: (114, 101) -> 264 (b're') had 9843 occurrences\n",
|
417 |
+
"merge 10/256: (104, 97) -> 265 (b'ha') had 9673 occurrences\n",
|
418 |
+
"merge 11/256: (58, 10) -> 266 (b':\\n') had 8762 occurrences\n",
|
419 |
+
"merge 12/256: (110, 100) -> 267 (b'nd') had 8730 occurrences\n",
|
420 |
+
"merge 13/256: (256, 257) -> 268 (b' the') had 8684 occurrences\n",
|
421 |
+
"merge 14/256: (32, 98) -> 269 (b' b') had 8463 occurrences\n",
|
422 |
+
"merge 15/256: (105, 115) -> 270 (b'is') had 7526 occurrences\n",
|
423 |
+
"merge 16/256: (111, 114) -> 271 (b'or') had 7297 occurrences\n",
|
424 |
+
"merge 17/256: (10, 10) -> 272 (b'\\n\\n') had 7098 occurrences\n",
|
425 |
+
"merge 18/256: (32, 102) -> 273 (b' f') had 6563 occurrences\n",
|
426 |
+
"merge 19/256: (101, 114) -> 274 (b'er') had 6515 occurrences\n",
|
427 |
+
"merge 20/256: (108, 108) -> 275 (b'll') had 6357 occurrences\n",
|
428 |
+
"merge 21/256: (105, 116) -> 276 (b'it') had 6114 occurrences\n",
|
429 |
+
"merge 22/256: (111, 110) -> 277 (b'on') had 5973 occurrences\n",
|
430 |
+
"merge 23/256: (44, 10) -> 278 (b',\\n') had 5501 occurrences\n",
|
431 |
+
"merge 24/256: (32, 100) -> 279 (b' d') had 5478 occurrences\n",
|
432 |
+
"merge 25/256: (32, 99) -> 280 (b' c') had 5404 occurrences\n",
|
433 |
+
"merge 26/256: (101, 115) -> 281 (b'es') had 5202 occurrences\n",
|
434 |
+
"merge 27/256: (101, 110) -> 282 (b'en') had 5181 occurrences\n",
|
435 |
+
"merge 28/256: (32, 110) -> 283 (b' n') had 5176 occurrences\n",
|
436 |
+
"merge 29/256: (32, 108) -> 284 (b' l') had 5173 occurrences\n",
|
437 |
+
"merge 30/256: (32, 121) -> 285 (b' y') had 5140 occurrences\n",
|
438 |
+
"merge 31/256: (46, 272) -> 286 (b'.\\n\\n') had 5018 occurrences\n",
|
439 |
+
"merge 32/256: (256, 104) -> 287 (b' th') had 4940 occurrences\n",
|
440 |
+
"merge 33/256: (97, 114) -> 288 (b'ar') had 4884 occurrences\n",
|
441 |
+
"merge 34/256: (32, 104) -> 289 (b' h') had 4702 occurrences\n",
|
442 |
+
"merge 35/256: (32, 111) -> 290 (b' o') had 4693 occurrences\n",
|
443 |
+
"merge 36/256: (256, 111) -> 291 (b' to') had 4666 occurrences\n",
|
444 |
+
"merge 37/256: (285, 259) -> 292 (b' you') had 4587 occurrences\n",
|
445 |
+
"merge 38/256: (32, 112) -> 293 (b' p') had 4490 occurrences\n",
|
446 |
+
"merge 39/256: (265, 116) -> 294 (b'hat') had 4407 occurrences\n",
|
447 |
+
"merge 40/256: (32, 73) -> 295 (b' I') had 4079 occurrences\n",
|
448 |
+
"merge 41/256: (32, 257) -> 296 (b' he') had 4022 occurrences\n",
|
449 |
+
"merge 42/256: (118, 101) -> 297 (b've') had 3900 occurrences\n",
|
450 |
+
"merge 43/256: (111, 116) -> 298 (b'ot') had 3891 occurrences\n",
|
451 |
+
"merge 44/256: (115, 116) -> 299 (b'st') had 3709 occurrences\n",
|
452 |
+
"merge 45/256: (258, 267) -> 300 (b' and') had 3703 occurrences\n",
|
453 |
+
"merge 46/256: (111, 119) -> 301 (b'ow') had 3686 occurrences\n",
|
454 |
+
"merge 47/256: (262, 103) -> 302 (b'ing') had 3660 occurrences\n",
|
455 |
+
"merge 48/256: (97, 110) -> 303 (b'an') had 3635 occurrences\n",
|
456 |
+
"merge 49/256: (290, 102) -> 304 (b' of') had 3605 occurrences\n",
|
457 |
+
"merge 50/256: (111, 109) -> 305 (b'om') had 3584 occurrences\n",
|
458 |
+
"merge 51/256: (32, 103) -> 306 (b' g') had 3512 occurrences\n",
|
459 |
+
"merge 52/256: (97, 116) -> 307 (b'at') had 3357 occurrences\n",
|
460 |
+
"merge 53/256: (269, 101) -> 308 (b' be') had 3219 occurrences\n",
|
461 |
+
"merge 54/256: (115, 101) -> 309 (b'se') had 3065 occurrences\n",
|
462 |
+
"merge 55/256: (261, 121) -> 310 (b' my') had 2829 occurrences\n",
|
463 |
+
"merge 56/256: (32, 262) -> 311 (b' in') had 2746 occurrences\n",
|
464 |
+
"merge 57/256: (99, 101) -> 312 (b'ce') had 2740 occurrences\n",
|
465 |
+
"merge 58/256: (32, 265) -> 313 (b' ha') had 2713 occurrences\n",
|
466 |
+
"merge 59/256: (108, 101) -> 314 (b'le') had 2636 occurrences\n",
|
467 |
+
"merge 60/256: (97, 121) -> 315 (b'ay') had 2568 occurrences\n",
|
468 |
+
"merge 61/256: (108, 100) -> 316 (b'ld') had 2392 occurrences\n",
|
469 |
+
"merge 62/256: (105, 114) -> 317 (b'ir') had 2385 occurrences\n",
|
470 |
+
"merge 63/256: (101, 116) -> 318 (b'et') had 2375 occurrences\n",
|
471 |
+
"merge 64/256: (101, 100) -> 319 (b'ed') had 2344 occurrences\n",
|
472 |
+
"merge 65/256: (117, 116) -> 320 (b'ut') had 2304 occurrences\n",
|
473 |
+
"merge 66/256: (261, 101) -> 321 (b' me') had 2132 occurrences\n",
|
474 |
+
"merge 67/256: (105, 109) -> 322 (b'im') had 2125 occurrences\n",
|
475 |
+
"merge 68/256: (276, 104) -> 323 (b'ith') had 2089 occurrences\n",
|
476 |
+
"merge 69/256: (39, 115) -> 324 (b\"'s\") had 2063 occurrences\n",
|
477 |
+
"merge 70/256: (283, 298) -> 325 (b' not') had 2048 occurrences\n",
|
478 |
+
"merge 71/256: (99, 104) -> 326 (b'ch') had 2016 occurrences\n",
|
479 |
+
"merge 72/256: (256, 294) -> 327 (b' that') had 1962 occurrences\n",
|
480 |
+
"merge 73/256: (32, 270) -> 328 (b' is') had 1955 occurrences\n",
|
481 |
+
"merge 74/256: (103, 104) -> 329 (b'gh') had 1947 occurrences\n",
|
482 |
+
"merge 75/256: (65, 267) -> 330 (b'And') had 1927 occurrences\n",
|
483 |
+
"merge 76/256: (273, 271) -> 331 (b' for') had 1890 occurrences\n",
|
484 |
+
"merge 77/256: (107, 101) -> 332 (b'ke') had 1864 occurrences\n",
|
485 |
+
"merge 78/256: (32, 117) -> 333 (b' u') had 1850 occurrences\n",
|
486 |
+
"merge 79/256: (259, 114) -> 334 (b'our') had 1837 occurrences\n",
|
487 |
+
"merge 80/256: (263, 101) -> 335 (b' we') had 1816 occurrences\n",
|
488 |
+
"merge 81/256: (111, 111) -> 336 (b'oo') had 1800 occurrences\n",
|
489 |
+
"merge 82/256: (105, 275) -> 337 (b'ill') had 1763 occurrences\n",
|
490 |
+
"merge 83/256: (32, 101) -> 338 (b' e') had 1733 occurrences\n",
|
491 |
+
"merge 84/256: (257, 114) -> 339 (b'her') had 1710 occurrences\n",
|
492 |
+
"merge 85/256: (59, 10) -> 340 (b';\\n') had 1688 occurrences\n",
|
493 |
+
"merge 86/256: (263, 323) -> 341 (b' with') had 1676 occurrences\n",
|
494 |
+
"merge 87/256: (46, 10) -> 342 (b'.\\n') had 1658 occurrences\n",
|
495 |
+
"merge 88/256: (282, 116) -> 343 (b'ent') had 1638 occurrences\n",
|
496 |
+
"merge 89/256: (32, 276) -> 344 (b' it') had 1627 occurrences\n",
|
497 |
+
"merge 90/256: (292, 114) -> 345 (b' your') had 1610 occurrences\n",
|
498 |
+
"merge 91/256: (97, 100) -> 346 (b'ad') had 1598 occurrences\n",
|
499 |
+
"merge 92/256: (114, 105) -> 347 (b'ri') had 1545 occurrences\n",
|
500 |
+
"merge 93/256: (287, 259) -> 348 (b' thou') had 1496 occurrences\n",
|
501 |
+
"merge 94/256: (260, 116) -> 349 (b' st') had 1478 occurrences\n",
|
502 |
+
"merge 95/256: (39, 100) -> 350 (b\"'d\") had 1451 occurrences\n",
|
503 |
+
"merge 96/256: (32, 107) -> 351 (b' k') had 1438 occurrences\n",
|
504 |
+
"merge 97/256: (305, 101) -> 352 (b'ome') had 1436 occurrences\n",
|
505 |
+
"merge 98/256: (289, 270) -> 353 (b' his') had 1415 occurrences\n",
|
506 |
+
"merge 99/256: (329, 116) -> 354 (b'ght') had 1379 occurrences\n",
|
507 |
+
"merge 100/256: (69, 78) -> 355 (b'EN') had 1373 occurrences\n",
|
508 |
+
"merge 101/256: (271, 100) -> 356 (b'ord') had 1353 occurrences\n",
|
509 |
+
"merge 102/256: (105, 100) -> 357 (b'id') had 1350 occurrences\n",
|
510 |
+
"merge 103/256: (97, 115) -> 358 (b'as') had 1347 occurrences\n",
|
511 |
+
"merge 104/256: (84, 257) -> 359 (b'The') had 1345 occurrences\n",
|
512 |
+
"merge 105/256: (32, 264) -> 360 (b' re') had 1330 occurrences\n",
|
513 |
+
"merge 106/256: (313, 297) -> 361 (b' have') had 1325 occurrences\n",
|
514 |
+
"merge 107/256: (73, 78) -> 362 (b'IN') had 1313 occurrences\n",
|
515 |
+
"merge 108/256: (108, 121) -> 363 (b'ly') had 1312 occurrences\n",
|
516 |
+
"merge 109/256: (114, 97) -> 364 (b'ra') had 1303 occurrences\n",
|
517 |
+
"merge 110/256: (284, 105) -> 365 (b' li') had 1299 occurrences\n",
|
518 |
+
"merge 111/256: (63, 272) -> 366 (b'?\\n\\n') had 1294 occurrences\n",
|
519 |
+
"merge 112/256: (289, 322) -> 367 (b' him') had 1293 occurrences\n",
|
520 |
+
"merge 113/256: (117, 114) -> 368 (b'ur') had 1263 occurrences\n",
|
521 |
+
"merge 114/256: (287, 270) -> 369 (b' this') had 1261 occurrences\n",
|
522 |
+
"merge 115/256: (97, 108) -> 370 (b'al') had 1256 occurrences\n",
|
523 |
+
"merge 116/256: (73, 79) -> 371 (b'IO') had 1254 occurrences\n",
|
524 |
+
"merge 117/256: (260, 111) -> 372 (b' so') had 1238 occurrences\n",
|
525 |
+
"merge 118/256: (258, 115) -> 373 (b' as') had 1209 occurrences\n",
|
526 |
+
"merge 119/256: (279, 101) -> 374 (b' de') had 1202 occurrences\n",
|
527 |
+
"merge 120/256: (32, 277) -> 375 (b' on') had 1178 occurrences\n",
|
528 |
+
"merge 121/256: (111, 264) -> 376 (b'ore') had 1147 occurrences\n",
|
529 |
+
"merge 122/256: (114, 111) -> 377 (b'ro') had 1127 occurrences\n",
|
530 |
+
"merge 123/256: (65, 82) -> 378 (b'AR') had 1124 occurrences\n",
|
531 |
+
"merge 124/256: (104, 105) -> 379 (b'hi') had 1120 occurrences\n",
|
532 |
+
"merge 125/256: (259, 316) -> 380 (b'ould') had 1098 occurrences\n",
|
533 |
+
"merge 126/256: (336, 100) -> 381 (b'ood') had 1092 occurrences\n",
|
534 |
+
"merge 127/256: (99, 107) -> 382 (b'ck') had 1056 occurrences\n",
|
535 |
+
"merge 128/256: (97, 262) -> 383 (b'ain') had 1051 occurrences\n",
|
536 |
+
"merge 129/256: (118, 274) -> 384 (b'ver') had 1042 occurrences\n",
|
537 |
+
"merge 130/256: (281, 116) -> 385 (b'est') had 1008 occurrences\n",
|
538 |
+
"merge 131/256: (287, 121) -> 386 (b' thy') had 994 occurrences\n",
|
539 |
+
"merge 132/256: (260, 265) -> 387 (b' sha') had 993 occurrences\n",
|
540 |
+
"merge 133/256: (281, 115) -> 388 (b'ess') had 990 occurrences\n",
|
541 |
+
"merge 134/256: (101, 97) -> 389 (b'ea') had 972 occurrences\n",
|
542 |
+
"merge 135/256: (279, 111) -> 390 (b' do') had 968 occurrences\n",
|
543 |
+
"merge 136/256: (263, 337) -> 391 (b' will') had 966 occurrences\n",
|
544 |
+
"merge 137/256: (97, 109) -> 392 (b'am') had 954 occurrences\n",
|
545 |
+
"merge 138/256: (283, 111) -> 393 (b' no') had 943 occurrences\n",
|
546 |
+
"merge 139/256: (269, 320) -> 394 (b' but') had 912 occurrences\n",
|
547 |
+
"merge 140/256: (117, 115) -> 395 (b'us') had 907 occurrences\n",
|
548 |
+
"merge 141/256: (97, 267) -> 396 (b'and') had 897 occurrences\n",
|
549 |
+
"merge 142/256: (85, 83) -> 397 (b'US') had 895 occurrences\n",
|
550 |
+
"merge 143/256: (105, 102) -> 398 (b'if') had 894 occurrences\n",
|
551 |
+
"merge 144/256: (260, 101) -> 399 (b' se') had 881 occurrences\n",
|
552 |
+
"merge 145/256: (103, 101) -> 400 (b'ge') had 877 occurrences\n",
|
553 |
+
"merge 146/256: (258, 275) -> 401 (b' all') had 849 occurrences\n",
|
554 |
+
"merge 147/256: (84, 104) -> 402 (b'Th') had 845 occurrences\n",
|
555 |
+
"merge 148/256: (260, 117) -> 403 (b' su') had 830 occurrences\n",
|
556 |
+
"merge 149/256: (97, 332) -> 404 (b'ake') had 830 occurrences\n",
|
557 |
+
"merge 150/256: (84, 111) -> 405 (b'To') had 828 occurrences\n",
|
558 |
+
"merge 151/256: (296, 114) -> 406 (b' her') had 811 occurrences\n",
|
559 |
+
"merge 152/256: (114, 117) -> 407 (b'ru') had 810 occurrences\n",
|
560 |
+
"merge 153/256: (105, 277) -> 408 (b'ion') had 808 occurrences\n",
|
561 |
+
"merge 154/256: (116, 104) -> 409 (b'th') had 800 occurrences\n",
|
562 |
+
"merge 155/256: (258, 110) -> 410 (b' an') had 789 occurrences\n",
|
563 |
+
"merge 156/256: (116, 274) -> 411 (b'ter') had 786 occurrences\n",
|
564 |
+
"merge 157/256: (288, 100) -> 412 (b'ard') had 786 occurrences\n",
|
565 |
+
"merge 158/256: (284, 111) -> 413 (b' lo') had 782 occurrences\n",
|
566 |
+
"merge 159/256: (265, 110) -> 414 (b'han') had 779 occurrences\n",
|
567 |
+
"merge 160/256: (101, 275) -> 415 (b'ell') had 771 occurrences\n",
|
568 |
+
"merge 161/256: (101, 288) -> 416 (b'ear') had 769 occurrences\n",
|
569 |
+
"merge 162/256: (260, 112) -> 417 (b' sp') had 763 occurrences\n",
|
570 |
+
"merge 163/256: (268, 101) -> 418 (b' thee') had 751 occurrences\n",
|
571 |
+
"merge 164/256: (32, 334) -> 419 (b' our') had 742 occurrences\n",
|
572 |
+
"merge 165/256: (273, 97) -> 420 (b' fa') had 740 occurrences\n",
|
573 |
+
"merge 166/256: (387, 275) -> 421 (b' shall') had 740 occurrences\n",
|
574 |
+
"merge 167/256: (269, 121) -> 422 (b' by') had 739 occurrences\n",
|
575 |
+
"merge 168/256: (85, 67) -> 423 (b'UC') had 725 occurrences\n",
|
576 |
+
"merge 169/256: (105, 108) -> 424 (b'il') had 709 occurrences\n",
|
577 |
+
"merge 170/256: (258, 264) -> 425 (b' are') had 703 occurrences\n",
|
578 |
+
"merge 171/256: (362, 71) -> 426 (b'ING') had 703 occurrences\n",
|
579 |
+
"merge 172/256: (32, 67) -> 427 (b' C') had 693 occurrences\n",
|
580 |
+
"merge 173/256: (283, 101) -> 428 (b' ne') had 690 occurrences\n",
|
581 |
+
"merge 174/256: (114, 305) -> 429 (b'rom') had 690 occurrences\n",
|
582 |
+
"merge 175/256: (104, 111) -> 430 (b'ho') had 686 occurrences\n",
|
583 |
+
"merge 176/256: (351, 110) -> 431 (b' kn') had 683 occurrences\n",
|
584 |
+
"merge 177/256: (65, 78) -> 432 (b'AN') had 677 occurrences\n",
|
585 |
+
"merge 178/256: (32, 82) -> 433 (b' R') had 675 occurrences\n",
|
586 |
+
"merge 179/256: (84, 294) -> 434 (b'That') had 671 occurrences\n",
|
587 |
+
"merge 180/256: (32, 118) -> 435 (b' v') had 670 occurrences\n",
|
588 |
+
"merge 181/256: (69, 82) -> 436 (b'ER') had 665 occurrences\n",
|
589 |
+
"merge 182/256: (97, 299) -> 437 (b'ast') had 663 occurrences\n",
|
590 |
+
"merge 183/256: (79, 82) -> 438 (b'OR') had 663 occurrences\n",
|
591 |
+
"merge 184/256: (99, 116) -> 439 (b'ct') had 661 occurrences\n",
|
592 |
+
"merge 185/256: (259, 115) -> 440 (b'ous') had 661 occurrences\n",
|
593 |
+
"merge 186/256: (263, 294) -> 441 (b' what') had 655 occurrences\n",
|
594 |
+
"merge 187/256: (105, 354) -> 442 (b'ight') had 642 occurrences\n",
|
595 |
+
"merge 188/256: (260, 104) -> 443 (b' sh') had 639 occurrences\n",
|
596 |
+
"merge 189/256: (33, 10) -> 444 (b'!\\n') had 635 occurrences\n",
|
597 |
+
"merge 190/256: (117, 108) -> 445 (b'ul') had 633 occurrences\n",
|
598 |
+
"merge 191/256: (32, 39) -> 446 (b\" '\") had 628 occurrences\n",
|
599 |
+
"merge 192/256: (69, 84) -> 447 (b'ET') had 628 occurrences\n",
|
600 |
+
"merge 193/256: (303, 116) -> 448 (b'ant') had 627 occurrences\n",
|
601 |
+
"merge 194/256: (69, 83) -> 449 (b'ES') had 624 occurrences\n",
|
602 |
+
"merge 195/256: (333, 112) -> 450 (b' up') had 616 occurrences\n",
|
603 |
+
"merge 196/256: (309, 108) -> 451 (b'sel') had 614 occurrences\n",
|
604 |
+
"merge 197/256: (113, 117) -> 452 (b'qu') had 609 occurrences\n",
|
605 |
+
"merge 198/256: (66, 320) -> 453 (b'But') had 608 occurrences\n",
|
606 |
+
"merge 199/256: (288, 116) -> 454 (b'art') had 607 occurrences\n",
|
607 |
+
"merge 200/256: (306, 381) -> 455 (b' good') had 599 occurrences\n",
|
608 |
+
"merge 201/256: (33, 272) -> 456 (b'!\\n\\n') had 594 occurrences\n",
|
609 |
+
"merge 202/256: (114, 301) -> 457 (b'row') had 592 occurrences\n",
|
610 |
+
"merge 203/256: (307, 104) -> 458 (b'ath') had 591 occurrences\n",
|
611 |
+
"merge 204/256: (262, 101) -> 459 (b'ine') had 591 occurrences\n",
|
612 |
+
"merge 205/256: (284, 356) -> 460 (b' lord') had 589 occurrences\n",
|
613 |
+
"merge 206/256: (379, 326) -> 461 (b'hich') had 587 occurrences\n",
|
614 |
+
"merge 207/256: (110, 116) -> 462 (b'nt') had 586 occurrences\n",
|
615 |
+
"merge 208/256: (117, 299) -> 463 (b'ust') had 585 occurrences\n",
|
616 |
+
"merge 209/256: (39, 275) -> 464 (b\"'ll\") had 580 occurrences\n",
|
617 |
+
"merge 210/256: (277, 101) -> 465 (b'one') had 578 occurrences\n",
|
618 |
+
"merge 211/256: (293, 114) -> 466 (b' pr') had 577 occurrences\n",
|
619 |
+
"merge 212/256: (280, 305) -> 467 (b' com') had 575 occurrences\n",
|
620 |
+
"merge 213/256: (258, 116) -> 468 (b' at') had 574 occurrences\n",
|
621 |
+
"merge 214/256: (261, 303) -> 469 (b' man') had 569 occurrences\n",
|
622 |
+
"merge 215/256: (32, 77) -> 470 (b' M') had 567 occurrences\n",
|
623 |
+
"merge 216/256: (87, 294) -> 471 (b'What') had 567 occurrences\n",
|
624 |
+
"merge 217/256: (263, 257) -> 472 (b' whe') had 563 occurrences\n",
|
625 |
+
"merge 218/256: (32, 69) -> 473 (b' E') had 559 occurrences\n",
|
626 |
+
"merge 219/256: (75, 426) -> 474 (b'KING') had 556 occurrences\n",
|
627 |
+
"merge 220/256: (258, 109) -> 475 (b' am') had 554 occurrences\n",
|
628 |
+
"merge 221/256: (101, 267) -> 476 (b'end') had 553 occurrences\n",
|
629 |
+
"merge 222/256: (105, 99) -> 477 (b'ic') had 548 occurrences\n",
|
630 |
+
"merge 223/256: (280, 277) -> 478 (b' con') had 548 occurrences\n",
|
631 |
+
"merge 224/256: (98, 314) -> 479 (b'ble') had 545 occurrences\n",
|
632 |
+
"merge 225/256: (114, 121) -> 480 (b'ry') had 542 occurrences\n",
|
633 |
+
"merge 226/256: (63, 10) -> 481 (b'?\\n') had 539 occurrences\n",
|
634 |
+
"merge 227/256: (277, 103) -> 482 (b'ong') had 534 occurrences\n",
|
635 |
+
"merge 228/256: (105, 101) -> 483 (b'ie') had 533 occurrences\n",
|
636 |
+
"merge 229/256: (105, 297) -> 484 (b'ive') had 527 occurrences\n",
|
637 |
+
"merge 230/256: (273, 429) -> 485 (b' from') had 527 occurrences\n",
|
638 |
+
"merge 231/256: (269, 108) -> 486 (b' bl') had 527 occurrences\n",
|
639 |
+
"merge 232/256: (118, 282) -> 487 (b'ven') had 521 occurrences\n",
|
640 |
+
"merge 233/256: (32, 71) -> 488 (b' G') had 518 occurrences\n",
|
641 |
+
"merge 234/256: (70, 271) -> 489 (b'For') had 517 occurrences\n",
|
642 |
+
"merge 235/256: (260, 257) -> 490 (b' she') had 517 occurrences\n",
|
643 |
+
"merge 236/256: (101, 109) -> 491 (b'em') had 515 occurrences\n",
|
644 |
+
"merge 237/256: (306, 111) -> 492 (b' go') had 515 occurrences\n",
|
645 |
+
"merge 238/256: (97, 264) -> 493 (b'are') had 514 occurrences\n",
|
646 |
+
"merge 239/256: (261, 376) -> 494 (b' more') had 510 occurrences\n",
|
647 |
+
"merge 240/256: (268, 109) -> 495 (b' them') had 509 occurrences\n",
|
648 |
+
"merge 241/256: (259, 116) -> 496 (b'out') had 509 occurrences\n",
|
649 |
+
"merge 242/256: (73, 67) -> 497 (b'IC') had 509 occurrences\n",
|
650 |
+
"merge 243/256: (263, 358) -> 498 (b' was') had 504 occurrences\n",
|
651 |
+
"merge 244/256: (97, 117) -> 499 (b'au') had 504 occurrences\n",
|
652 |
+
"merge 245/256: (298, 339) -> 500 (b'other') had 503 occurrences\n",
|
653 |
+
"merge 246/256: (298, 104) -> 501 (b'oth') had 503 occurrences\n",
|
654 |
+
"merge 247/256: (72, 101) -> 502 (b'He') had 500 occurrences\n",
|
655 |
+
"merge 248/256: (260, 317) -> 503 (b' sir') had 500 occurrences\n",
|
656 |
+
"merge 249/256: (111, 108) -> 504 (b'ol') had 498 occurrences\n",
|
657 |
+
"merge 250/256: (283, 301) -> 505 (b' now') had 490 occurrences\n",
|
658 |
+
"merge 251/256: (32, 76) -> 506 (b' L') had 489 occurrences\n",
|
659 |
+
"merge 252/256: (32, 294) -> 507 (b' hat') had 488 occurrences\n",
|
660 |
+
"merge 253/256: (32, 398) -> 508 (b' if') had 484 occurrences\n",
|
661 |
+
"merge 254/256: (111, 299) -> 509 (b'ost') had 484 occurrences\n",
|
662 |
+
"merge 255/256: (76, 79) -> 510 (b'LO') had 481 occurrences\n",
|
663 |
+
"merge 256/256: (262, 100) -> 511 (b'ind') had 480 occurrences\n"
|
664 |
+
]
|
665 |
+
}
|
666 |
+
],
|
667 |
+
"source": [
|
668 |
+
"regex_tokenizer = RegexTokenizer()\n",
|
669 |
+
"regex_tokenizer.train(text, vocab_size=512, verbose=True)"
|
670 |
+
]
|
671 |
+
},
|
672 |
+
{
|
673 |
+
"cell_type": "code",
|
674 |
+
"execution_count": 13,
|
675 |
+
"metadata": {},
|
676 |
+
"outputs": [],
|
677 |
+
"source": [
|
678 |
+
"prefix = os.path.join(model_path, \"shakespeare_regex\")\n",
|
679 |
+
"regex_tokenizer.save(prefix)"
|
680 |
+
]
|
681 |
+
},
|
682 |
+
{
|
683 |
+
"cell_type": "markdown",
|
684 |
+
"metadata": {},
|
685 |
+
"source": [
|
686 |
+
"loading the tokenizer files and using it"
|
687 |
+
]
|
688 |
+
},
|
689 |
+
{
|
690 |
+
"cell_type": "code",
|
691 |
+
"execution_count": 6,
|
692 |
+
"metadata": {},
|
693 |
+
"outputs": [],
|
694 |
+
"source": [
|
695 |
+
"model_path = os.path.join(os.getcwd(), \"tokenizer_model\")\n",
|
696 |
+
"model_path = os.path.join(model_path, \"shakespeare_basic.model\")"
|
697 |
+
]
|
698 |
+
},
|
699 |
+
{
|
700 |
+
"cell_type": "code",
|
701 |
+
"execution_count": 7,
|
702 |
+
"metadata": {},
|
703 |
+
"outputs": [],
|
704 |
+
"source": [
|
705 |
+
"basic_tokenizer = BasicTokenizer()\n",
|
706 |
+
"basic_tokenizer.load(model_path)"
|
707 |
+
]
|
708 |
+
},
|
709 |
+
{
|
710 |
+
"cell_type": "code",
|
711 |
+
"execution_count": 15,
|
712 |
+
"metadata": {},
|
713 |
+
"outputs": [],
|
714 |
+
"source": [
|
715 |
+
"ids = basic_tokenizer.encode(\"Hello World\")"
|
716 |
+
]
|
717 |
+
},
|
718 |
+
{
|
719 |
+
"cell_type": "code",
|
720 |
+
"execution_count": 19,
|
721 |
+
"metadata": {},
|
722 |
+
"outputs": [],
|
723 |
+
"source": [
|
724 |
+
"reverse = basic_tokenizer.decode(ids)"
|
725 |
+
]
|
726 |
+
},
|
727 |
+
{
|
728 |
+
"cell_type": "code",
|
729 |
+
"execution_count": 20,
|
730 |
+
"metadata": {},
|
731 |
+
"outputs": [],
|
732 |
+
"source": [
|
733 |
+
"mapping = [(str(i),basic_tokenizer.decode([i])) for i in ids]"
|
734 |
+
]
|
735 |
+
},
|
736 |
+
{
|
737 |
+
"cell_type": "code",
|
738 |
+
"execution_count": 22,
|
739 |
+
"metadata": {},
|
740 |
+
"outputs": [],
|
741 |
+
"source": [
|
742 |
+
"def test_tokenizer(text):\n",
|
743 |
+
" ids = basic_tokenizer.encode(text)\n",
|
744 |
+
" decoded = basic_tokenizer.decode(ids)\n",
|
745 |
+
" mapping = [(str(i), basic_tokenizer.decode([i])) for i in ids]\n",
|
746 |
+
"\n",
|
747 |
+
" return ids, decoded, mapping"
|
748 |
+
]
|
749 |
+
},
|
750 |
+
{
|
751 |
+
"cell_type": "code",
|
752 |
+
"execution_count": 23,
|
753 |
+
"metadata": {},
|
754 |
+
"outputs": [
|
755 |
+
{
|
756 |
+
"data": {
|
757 |
+
"text/plain": [
|
758 |
+
"([72, 389, 269, 87, 268, 108, 100],\n",
|
759 |
+
" 'Hello World',\n",
|
760 |
+
" [('72', 'H'),\n",
|
761 |
+
" ('389', 'ell'),\n",
|
762 |
+
" ('269', 'o '),\n",
|
763 |
+
" ('87', 'W'),\n",
|
764 |
+
" ('268', 'or'),\n",
|
765 |
+
" ('108', 'l'),\n",
|
766 |
+
" ('100', 'd')])"
|
767 |
+
]
|
768 |
+
},
|
769 |
+
"execution_count": 23,
|
770 |
+
"metadata": {},
|
771 |
+
"output_type": "execute_result"
|
772 |
+
}
|
773 |
+
],
|
774 |
+
"source": [
|
775 |
+
"test_tokenizer(\"Hello World\")"
|
776 |
+
]
|
777 |
+
},
|
778 |
+
{
|
779 |
+
"cell_type": "code",
|
780 |
+
"execution_count": 12,
|
781 |
+
"metadata": {},
|
782 |
+
"outputs": [],
|
783 |
+
"source": [
|
784 |
+
"import gradio as gr"
|
785 |
+
]
|
786 |
+
},
|
787 |
+
{
|
788 |
+
"cell_type": "code",
|
789 |
+
"execution_count": 24,
|
790 |
+
"metadata": {},
|
791 |
+
"outputs": [],
|
792 |
+
"source": [
|
793 |
+
"with gr.Blocks() as demo:\n",
|
794 |
+
" gr.HTML(\"<h1 align = 'center'> Token Generation for Hindi Dataset </h1>\")\n",
|
795 |
+
"\n",
|
796 |
+
" with gr.Row():\n",
|
797 |
+
" with gr.Column():\n",
|
798 |
+
" inputs = [gr.TextArea(label = \"Enter initial text to generate tokens in Hindi\", lines = 10)]\n",
|
799 |
+
" generate_btn = gr.Button(value = 'Generate Text')\n",
|
800 |
+
" with gr.Column():\n",
|
801 |
+
" enc = gr.Textbox(label = \"Encoded Tokens\")\n",
|
802 |
+
" txt = gr.Textbox(label = \"Decoded Text from tokens\")\n",
|
803 |
+
" map = gr.Textbox(label = \"Mapping of the tokens and respective texts\")\n",
|
804 |
+
" outputs = [\n",
|
805 |
+
" enc,\n",
|
806 |
+
" txt,\n",
|
807 |
+
" map\n",
|
808 |
+
" ]\n",
|
809 |
+
" \n",
|
810 |
+
" generate_btn.click(fn = test_tokenizer, inputs= inputs, outputs = outputs)\n"
|
811 |
+
]
|
812 |
+
},
|
813 |
+
{
|
814 |
+
"cell_type": "code",
|
815 |
+
"execution_count": 27,
|
816 |
+
"metadata": {},
|
817 |
+
"outputs": [
|
818 |
+
{
|
819 |
+
"name": "stdout",
|
820 |
+
"output_type": "stream",
|
821 |
+
"text": [
|
822 |
+
"Rerunning server... use `close()` to stop if you need to change `launch()` parameters.\n",
|
823 |
+
"----\n",
|
824 |
+
"Running on public URL: https://9ce8a9238acdc2d242.gradio.live\n",
|
825 |
+
"\n",
|
826 |
+
"This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)\n"
|
827 |
+
]
|
828 |
+
},
|
829 |
+
{
|
830 |
+
"data": {
|
831 |
+
"text/html": [
|
832 |
+
"<div><iframe src=\"https://9ce8a9238acdc2d242.gradio.live\" width=\"100%\" height=\"500\" allow=\"autoplay; camera; microphone; clipboard-read; clipboard-write;\" frameborder=\"0\" allowfullscreen></iframe></div>"
|
833 |
+
],
|
834 |
+
"text/plain": [
|
835 |
+
"<IPython.core.display.HTML object>"
|
836 |
+
]
|
837 |
+
},
|
838 |
+
"metadata": {},
|
839 |
+
"output_type": "display_data"
|
840 |
+
},
|
841 |
+
{
|
842 |
+
"data": {
|
843 |
+
"text/plain": []
|
844 |
+
},
|
845 |
+
"execution_count": 27,
|
846 |
+
"metadata": {},
|
847 |
+
"output_type": "execute_result"
|
848 |
+
}
|
849 |
+
],
|
850 |
+
"source": [
|
851 |
+
"demo.launch(share=True)"
|
852 |
+
]
|
853 |
+
},
|
854 |
+
{
|
855 |
+
"cell_type": "code",
|
856 |
+
"execution_count": null,
|
857 |
+
"metadata": {},
|
858 |
+
"outputs": [],
|
859 |
+
"source": [
|
860 |
+
"demo.close()"
|
861 |
+
]
|
862 |
+
}
|
863 |
+
],
|
864 |
+
"metadata": {
|
865 |
+
"kernelspec": {
|
866 |
+
"display_name": "torch_env",
|
867 |
+
"language": "python",
|
868 |
+
"name": "python3"
|
869 |
+
},
|
870 |
+
"language_info": {
|
871 |
+
"codemirror_mode": {
|
872 |
+
"name": "ipython",
|
873 |
+
"version": 3
|
874 |
+
},
|
875 |
+
"file_extension": ".py",
|
876 |
+
"mimetype": "text/x-python",
|
877 |
+
"name": "python",
|
878 |
+
"nbconvert_exporter": "python",
|
879 |
+
"pygments_lexer": "ipython3",
|
880 |
+
"version": "3.10.14"
|
881 |
+
}
|
882 |
+
},
|
883 |
+
"nbformat": 4,
|
884 |
+
"nbformat_minor": 2
|
885 |
+
}
|
notebooks/train_hindi.ipynb
ADDED
The diff for this file is too large to render.
See raw diff
|
|
requirements.txt
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
-
|
2 |
-
|
|
|
1 |
+
regex==2024.5.15
|
2 |
+
numpy==1.19.3
|
tokenizer/__init__.py
ADDED
File without changes
|
tokenizer/base.py
ADDED
@@ -0,0 +1,108 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Base class for Tokenizers that can train a vocabulary from text, encode and decode strings into lists of integers and back.
|
3 |
+
The Tokenizer can also save and load its model to/from disk.
|
4 |
+
"""
|
5 |
+
|
6 |
+
from tokenizer.utils import render_token
|
7 |
+
|
8 |
+
|
9 |
+
class Tokenizer:
|
10 |
+
"""Base class for Tokenizers"""
|
11 |
+
|
12 |
+
def __init__(self):
|
13 |
+
# default: vocab size of 256 (all bytes), no merges, no patterns
|
14 |
+
self.merges = {} # (int, int) -> int
|
15 |
+
self.pattern = "" # str
|
16 |
+
self.special_tokens = {} # str -> int, e.g. {'<|endoftext|>': 100257}
|
17 |
+
self.vocab = self._build_vocab() # int -> bytes
|
18 |
+
|
19 |
+
def train(self, text, vocab_size, verbose=False):
|
20 |
+
# Tokenizer can train a vocabulary of size vocab_size from text
|
21 |
+
raise NotImplementedError
|
22 |
+
|
23 |
+
def encode(self, text):
|
24 |
+
# Tokenizer can encode a string into a list of integers
|
25 |
+
raise NotImplementedError
|
26 |
+
|
27 |
+
def decode(self, ids):
|
28 |
+
# Tokenizer can decode a list of integers into a string
|
29 |
+
raise NotImplementedError
|
30 |
+
|
31 |
+
def _build_vocab(self):
|
32 |
+
# vocab is simply and deterministically derived from merges
|
33 |
+
vocab = {idx: bytes([idx]) for idx in range(256)}
|
34 |
+
for (p0, p1), idx in self.merges.items():
|
35 |
+
vocab[idx] = vocab[p0] + vocab[p1]
|
36 |
+
for special, idx in self.special_tokens.items():
|
37 |
+
vocab[idx] = special.encode("utf-8")
|
38 |
+
return vocab
|
39 |
+
|
40 |
+
def save(self, file_prefix):
|
41 |
+
"""
|
42 |
+
Saves two files: file_prefix.vocab and file_prefix.model
|
43 |
+
This is inspired (but not equivalent to!) sentencepiece's model saving:
|
44 |
+
- model file is the critical one, intended for load()
|
45 |
+
- vocab file is just a pretty printed version for human inspection only
|
46 |
+
"""
|
47 |
+
# write the model: to be used in load() later
|
48 |
+
model_file = file_prefix + ".model"
|
49 |
+
with open(model_file, "w") as f:
|
50 |
+
# write the version, pattern and merges, that's all that's needed
|
51 |
+
f.write("minbpe v1\n")
|
52 |
+
f.write(f"{self.pattern}\n")
|
53 |
+
# write the special tokens, first the number of them, then each one
|
54 |
+
f.write(f"{len(self.special_tokens)}\n")
|
55 |
+
for special, idx in self.special_tokens.items():
|
56 |
+
f.write(f"{special} {idx}\n")
|
57 |
+
# the merges dict
|
58 |
+
for idx1, idx2 in self.merges:
|
59 |
+
f.write(f"{idx1} {idx2}\n")
|
60 |
+
# write the vocab: for the human to look at
|
61 |
+
vocab_file = file_prefix + ".vocab"
|
62 |
+
inverted_merges = {idx: pair for pair, idx in self.merges.items()}
|
63 |
+
with open(vocab_file, "w", encoding="utf-8") as f:
|
64 |
+
for idx, token in self.vocab.items():
|
65 |
+
# note: many tokens may be partial utf-8 sequences
|
66 |
+
# and cannot be decoded into valid strings. Here we're using
|
67 |
+
# errors='replace' to replace them with the replacement char �.
|
68 |
+
# this also means that we couldn't possibly use .vocab in load()
|
69 |
+
# because decoding in this way is a lossy operation!
|
70 |
+
s = render_token(token)
|
71 |
+
# find the children of this token, if any
|
72 |
+
if idx in inverted_merges:
|
73 |
+
# if this token has children, render it nicely as a merge
|
74 |
+
idx0, idx1 = inverted_merges[idx]
|
75 |
+
s0 = render_token(self.vocab[idx0])
|
76 |
+
s1 = render_token(self.vocab[idx1])
|
77 |
+
f.write(f"[{s0}][{s1}] -> [{s}] {idx}\n")
|
78 |
+
else:
|
79 |
+
# otherwise this is leaf token, just print it
|
80 |
+
# (this should just be the first 256 tokens, the bytes)
|
81 |
+
f.write(f"[{s}] {idx}\n")
|
82 |
+
|
83 |
+
def load(self, model_file):
|
84 |
+
"""Inverse of save() but only for the model file"""
|
85 |
+
assert model_file.endswith(".model")
|
86 |
+
# read the model file
|
87 |
+
merges = {}
|
88 |
+
special_tokens = {}
|
89 |
+
idx = 256
|
90 |
+
with open(model_file, "r", encoding="utf-8") as f:
|
91 |
+
# read the version
|
92 |
+
version = f.readline().strip()
|
93 |
+
assert version == "minbpe v1"
|
94 |
+
# read the pattern
|
95 |
+
self.pattern = f.readline().strip()
|
96 |
+
# read the special tokens
|
97 |
+
num_special = int(f.readline().strip())
|
98 |
+
for _ in range(num_special):
|
99 |
+
special, special_idx = f.readline().strip().split()
|
100 |
+
special_tokens[special] = int(special_idx)
|
101 |
+
# read the merges
|
102 |
+
for line in f:
|
103 |
+
idx1, idx2 = map(int, line.split())
|
104 |
+
merges[(idx1, idx2)] = idx
|
105 |
+
idx += 1
|
106 |
+
self.merges = merges
|
107 |
+
self.special_tokens = special_tokens
|
108 |
+
self.vocab = self._build_vocab()
|
tokenizer/basic_bpe.py
ADDED
@@ -0,0 +1,73 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Basic Byte Pair Encoding (BPE) tokenizer. This is a simple tokenizer that can be trained on a text and then used to encode and decode strings.
|
3 |
+
The training process is based on the BPE algorithm, which merges the most common pairs of tokens iteratively to create new tokens.
|
4 |
+
The tokenizer can be saved to disk and loaded back later. The vocabulary and merges can be inspected in human-readable form.
|
5 |
+
No handling of special tokens or regex patterns.
|
6 |
+
"""
|
7 |
+
|
8 |
+
from tokenizer.utils import get_stats, merge
|
9 |
+
from tokenizer.base import Tokenizer
|
10 |
+
|
11 |
+
|
12 |
+
class BasicTokenizer(Tokenizer):
|
13 |
+
|
14 |
+
def __init__(self):
|
15 |
+
super().__init__()
|
16 |
+
|
17 |
+
def train(self, text, vocab_size, verbose=False):
|
18 |
+
assert vocab_size >= 256
|
19 |
+
num_merges = vocab_size - 256
|
20 |
+
|
21 |
+
# input text preprocessing
|
22 |
+
text_bytes = text.encode("utf-8") # raw bytes
|
23 |
+
ids = list(text_bytes) # list of integers in range 0..255
|
24 |
+
|
25 |
+
# iteratively merge the most common pairs to create new tokens
|
26 |
+
merges = {} # (int, int) -> int
|
27 |
+
vocab = {idx: bytes([idx]) for idx in range(256)} # int -> bytes
|
28 |
+
for i in range(num_merges):
|
29 |
+
# count up the number of times every consecutive pair appears
|
30 |
+
stats = get_stats(ids)
|
31 |
+
# find the pair with the highest count
|
32 |
+
pair = max(stats, key=stats.get)
|
33 |
+
# mint a new token: assign it the next available id
|
34 |
+
idx = 256 + i
|
35 |
+
# replace all occurrences of pair in ids with idx
|
36 |
+
ids = merge(ids, pair, idx)
|
37 |
+
# save the merge
|
38 |
+
merges[pair] = idx
|
39 |
+
vocab[idx] = vocab[pair[0]] + vocab[pair[1]]
|
40 |
+
# prints
|
41 |
+
if verbose:
|
42 |
+
print(
|
43 |
+
f"merge {i+1}/{num_merges}: {pair} -> {idx} ({vocab[idx]}) had {stats[pair]} occurrences"
|
44 |
+
)
|
45 |
+
|
46 |
+
# save class variables
|
47 |
+
self.merges = merges # used in encode()
|
48 |
+
self.vocab = vocab # used in decode()
|
49 |
+
|
50 |
+
def decode(self, ids):
|
51 |
+
# given ids (list of integers), return Python string
|
52 |
+
text_bytes = b"".join(self.vocab[idx] for idx in ids)
|
53 |
+
text = text_bytes.decode("utf-8", errors="replace")
|
54 |
+
return text
|
55 |
+
|
56 |
+
def encode(self, text):
|
57 |
+
# given a string text, return the token ids
|
58 |
+
text_bytes = text.encode("utf-8") # raw bytes
|
59 |
+
ids = list(text_bytes) # list of integers in range 0..255
|
60 |
+
while len(ids) >= 2:
|
61 |
+
# find the pair with the lowest merge index
|
62 |
+
stats = get_stats(ids)
|
63 |
+
pair = min(stats, key=lambda p: self.merges.get(p, float("inf")))
|
64 |
+
# subtle: if there are no more merges available, the key will
|
65 |
+
# result in an inf for every single pair, and the min will be
|
66 |
+
# just the first pair in the list, arbitrarily
|
67 |
+
# we can detect this terminating case by a membership check
|
68 |
+
if pair not in self.merges:
|
69 |
+
break # nothing else can be merged anymore
|
70 |
+
# otherwise let's merge the best pair (lowest merge index)
|
71 |
+
idx = self.merges[pair]
|
72 |
+
ids = merge(ids, pair, idx)
|
73 |
+
return ids
|
tokenizer/regex_bpe.py
ADDED
@@ -0,0 +1,169 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Minimal (byte-level) Byte Pair Encoding tokenizer.
|
3 |
+
|
4 |
+
Algorithmically follows along the GPT tokenizer:
|
5 |
+
https://github.com/openai/gpt-2/blob/master/src/encoder.py
|
6 |
+
|
7 |
+
Unlike BasicTokenizer:
|
8 |
+
- RegexTokenizer handles an optional regex splitting pattern.
|
9 |
+
- RegexTokenizer handles optional special tokens.
|
10 |
+
"""
|
11 |
+
|
12 |
+
import regex as re
|
13 |
+
from tokenizer.utils import get_stats, merge
|
14 |
+
from tokenizer.base import Tokenizer
|
15 |
+
|
16 |
+
# Regex split
|
17 |
+
GPT2_SPLIT_PATTERN = (
|
18 |
+
r"""'(?:[sdmt]|ll|ve|re)| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+"""
|
19 |
+
)
|
20 |
+
GPT4_SPLIT_PATTERN = r"""'(?i:[sdmt]|ll|ve|re)|[^\r\n\p{L}\p{N}]?+\p{L}+|\p{N}{1,3}| ?[^\s\p{L}\p{N}]++[\r\n]*|\s*[\r\n]|\s+(?!\S)|\s+"""
|
21 |
+
|
22 |
+
|
23 |
+
class RegexTokenizer(Tokenizer):
|
24 |
+
|
25 |
+
def __init__(self, pattern=None):
|
26 |
+
"""
|
27 |
+
- pattern: optional string to override the default (GPT-4 split pattern)
|
28 |
+
- special_tokens: str -> int dictionary of special tokens
|
29 |
+
example: {'<|endoftext|>': 100257}
|
30 |
+
"""
|
31 |
+
super().__init__()
|
32 |
+
self.pattern = GPT4_SPLIT_PATTERN if pattern is None else pattern
|
33 |
+
self.compiled_pattern = re.compile(self.pattern)
|
34 |
+
self.special_tokens = {}
|
35 |
+
self.inverse_special_tokens = {}
|
36 |
+
|
37 |
+
def train(self, text, vocab_size, verbose=False):
|
38 |
+
assert vocab_size >= 256
|
39 |
+
num_merges = vocab_size - 256
|
40 |
+
|
41 |
+
# split the text up into text chunks
|
42 |
+
text_chunks = re.findall(self.compiled_pattern, text)
|
43 |
+
|
44 |
+
# input text preprocessing
|
45 |
+
ids = [list(ch.encode("utf-8")) for ch in text_chunks]
|
46 |
+
|
47 |
+
# iteratively merge the most common pairs to create new tokens
|
48 |
+
merges = {} # (int, int) -> int
|
49 |
+
vocab = {idx: bytes([idx]) for idx in range(256)} # idx -> bytes
|
50 |
+
for i in range(num_merges):
|
51 |
+
# count the number of times every consecutive pair appears
|
52 |
+
stats = {}
|
53 |
+
for chunk_ids in ids:
|
54 |
+
# passing in stats will update it in place, adding up counts
|
55 |
+
get_stats(chunk_ids, stats)
|
56 |
+
# find the pair with the highest count
|
57 |
+
pair = max(stats, key=stats.get)
|
58 |
+
# mint a new token: assign it the next available id
|
59 |
+
idx = 256 + i
|
60 |
+
# replace all occurrences of pair in ids with idx
|
61 |
+
ids = [merge(chunk_ids, pair, idx) for chunk_ids in ids]
|
62 |
+
# save the merge
|
63 |
+
merges[pair] = idx
|
64 |
+
vocab[idx] = vocab[pair[0]] + vocab[pair[1]]
|
65 |
+
# prints
|
66 |
+
if verbose:
|
67 |
+
print(
|
68 |
+
f"merge {i+1}/{num_merges}: {pair} -> {idx} ({vocab[idx]}) had {stats[pair]} occurrences"
|
69 |
+
)
|
70 |
+
|
71 |
+
# save class variables
|
72 |
+
self.merges = merges # used in encode()
|
73 |
+
self.vocab = vocab # used in decode()
|
74 |
+
|
75 |
+
def register_special_tokens(self, special_tokens):
|
76 |
+
# special_tokens is a dictionary of str -> int
|
77 |
+
# example: {"<|endoftext|>": 100257}
|
78 |
+
self.special_tokens = special_tokens
|
79 |
+
self.inverse_special_tokens = {v: k for k, v in special_tokens.items()}
|
80 |
+
|
81 |
+
def decode(self, ids):
|
82 |
+
# given ids (list of integers), return Python string
|
83 |
+
part_bytes = []
|
84 |
+
for idx in ids:
|
85 |
+
if idx in self.vocab:
|
86 |
+
part_bytes.append(self.vocab[idx])
|
87 |
+
elif idx in self.inverse_special_tokens:
|
88 |
+
part_bytes.append(self.inverse_special_tokens[idx].encode("utf-8"))
|
89 |
+
else:
|
90 |
+
raise ValueError(f"invalid token id: {idx}")
|
91 |
+
text_bytes = b"".join(part_bytes)
|
92 |
+
text = text_bytes.decode("utf-8", errors="replace")
|
93 |
+
return text
|
94 |
+
|
95 |
+
def _encode_chunk(self, text_bytes):
|
96 |
+
# return the token ids
|
97 |
+
# let's begin. first, convert all bytes to integers in range 0..255
|
98 |
+
ids = list(text_bytes)
|
99 |
+
while len(ids) >= 2:
|
100 |
+
# find the pair with the lowest merge index
|
101 |
+
stats = get_stats(ids)
|
102 |
+
pair = min(stats, key=lambda p: self.merges.get(p, float("inf")))
|
103 |
+
# subtle: if there are no more merges available, the key will
|
104 |
+
# result in an inf for every single pair, and the min will be
|
105 |
+
# just the first pair in the list, arbitrarily
|
106 |
+
# we can detect this terminating case by a membership check
|
107 |
+
if pair not in self.merges:
|
108 |
+
break # nothing else can be merged anymore
|
109 |
+
# otherwise let's merge the best pair (lowest merge index)
|
110 |
+
idx = self.merges[pair]
|
111 |
+
ids = merge(ids, pair, idx)
|
112 |
+
return ids
|
113 |
+
|
114 |
+
def encode_ordinary(self, text):
|
115 |
+
"""Encoding that ignores any special tokens."""
|
116 |
+
# split text into chunks of text by categories defined in regex pattern
|
117 |
+
text_chunks = re.findall(self.compiled_pattern, text)
|
118 |
+
# all chunks of text are encoded separately, then results are joined
|
119 |
+
ids = []
|
120 |
+
for chunk in text_chunks:
|
121 |
+
chunk_bytes = chunk.encode("utf-8") # raw bytes
|
122 |
+
chunk_ids = self._encode_chunk(chunk_bytes)
|
123 |
+
ids.extend(chunk_ids)
|
124 |
+
return ids
|
125 |
+
|
126 |
+
def encode(self, text, allowed_special="none_raise"):
|
127 |
+
"""
|
128 |
+
Unlike encode_ordinary, this function handles special tokens.
|
129 |
+
allowed_special: can be "all"|"none"|"none_raise" or a custom set of special tokens
|
130 |
+
if none_raise, then an error is raised if any special token is encountered in text
|
131 |
+
this is the default tiktoken behavior right now as well
|
132 |
+
any other behavior is either annoying, or a major footgun
|
133 |
+
"""
|
134 |
+
# decode the user desire w.r.t. handling of special tokens
|
135 |
+
special = None
|
136 |
+
if allowed_special == "all":
|
137 |
+
special = self.special_tokens
|
138 |
+
elif allowed_special == "none":
|
139 |
+
special = {}
|
140 |
+
elif allowed_special == "none_raise":
|
141 |
+
special = {}
|
142 |
+
assert all(token not in text for token in self.special_tokens)
|
143 |
+
elif isinstance(allowed_special, set):
|
144 |
+
special = {
|
145 |
+
k: v for k, v in self.special_tokens.items() if k in allowed_special
|
146 |
+
}
|
147 |
+
else:
|
148 |
+
raise ValueError(f"allowed_special={allowed_special} not understood")
|
149 |
+
if not special:
|
150 |
+
# shortcut: if no special tokens, just use the ordinary encoding
|
151 |
+
return self.encode_ordinary(text)
|
152 |
+
# otherwise, we have to be careful with potential special tokens in text
|
153 |
+
# we handle special tokens by splitting the text
|
154 |
+
# based on the occurrence of any exact match with any of the special tokens
|
155 |
+
# we can use re.split for this. note that surrounding the pattern with ()
|
156 |
+
# makes it into a capturing group, so the special tokens will be included
|
157 |
+
special_pattern = "(" + "|".join(re.escape(k) for k in special) + ")"
|
158 |
+
special_chunks = re.split(special_pattern, text)
|
159 |
+
# now all the special characters are separated from the rest of the text
|
160 |
+
# all chunks of text are encoded separately, then results are joined
|
161 |
+
ids = []
|
162 |
+
for part in special_chunks:
|
163 |
+
if part in special:
|
164 |
+
# this is a special token, encode it separately as a special case
|
165 |
+
ids.append(special[part])
|
166 |
+
else:
|
167 |
+
# this is an ordinary sequence, encode it normally
|
168 |
+
ids.extend(self.encode_ordinary(part))
|
169 |
+
return ids
|
tokenizer/utils.py
ADDED
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
Some utility functions for the tokenizer (Basic and Regex)
|
3 |
+
"""
|
4 |
+
|
5 |
+
import unicodedata
|
6 |
+
|
7 |
+
|
8 |
+
def get_stats(ids, counts=None):
|
9 |
+
"""
|
10 |
+
Given a list of integers, return a dictionary of counts of consecutive pairs
|
11 |
+
Example: [1, 2, 3, 1, 2] -> {(1, 2): 2, (2, 3): 1, (3, 1): 1}
|
12 |
+
Optionally allows to update an existing dictionary of counts
|
13 |
+
"""
|
14 |
+
counts = {} if counts is None else counts
|
15 |
+
for pair in zip(ids, ids[1:]): # iterate consecutive elements
|
16 |
+
counts[pair] = counts.get(pair, 0) + 1
|
17 |
+
return counts
|
18 |
+
|
19 |
+
|
20 |
+
def merge(ids, pair, idx):
|
21 |
+
"""
|
22 |
+
In the list of integers (ids), replace all consecutive occurrences
|
23 |
+
of pair with the new integer token idx
|
24 |
+
Example: ids=[1, 2, 3, 1, 2], pair=(1, 2), idx=4 -> [4, 3, 4]
|
25 |
+
"""
|
26 |
+
newids = []
|
27 |
+
i = 0
|
28 |
+
while i < len(ids):
|
29 |
+
# if not at the very last position AND the pair matches, replace it
|
30 |
+
if ids[i] == pair[0] and i < len(ids) - 1 and ids[i + 1] == pair[1]:
|
31 |
+
newids.append(idx)
|
32 |
+
i += 2
|
33 |
+
else:
|
34 |
+
newids.append(ids[i])
|
35 |
+
i += 1
|
36 |
+
return newids
|
37 |
+
|
38 |
+
|
39 |
+
def replace_control_characters(s: str) -> str:
|
40 |
+
"""Replace control characters in a string with their unicode escape"""
|
41 |
+
chars = []
|
42 |
+
for ch in s:
|
43 |
+
if unicodedata.category(ch)[0] != "C":
|
44 |
+
chars.append(ch) # this character is ok
|
45 |
+
else:
|
46 |
+
chars.append(f"\\u{ord(ch):04x}") # escape
|
47 |
+
return "".join(chars)
|
48 |
+
|
49 |
+
|
50 |
+
def render_token(t: bytes) -> str:
|
51 |
+
"""Pretty print a token, escaping control characters"""
|
52 |
+
# pretty print a token, escaping control characters
|
53 |
+
s = t.decode("utf-8", errors="replace")
|
54 |
+
s = replace_control_characters(s)
|
55 |
+
return s
|
tokenizer_model/hindi_sentiments_basic.model
ADDED
@@ -0,0 +1,4747 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
minbpe v1
|
2 |
+
|
3 |
+
0
|
4 |
+
224 164
|
5 |
+
32 256
|
6 |
+
224 165
|
7 |
+
256 190
|
8 |
+
258 135
|
9 |
+
256 176
|
10 |
+
258 128
|
11 |
+
258 141
|
12 |
+
257 149
|
13 |
+
256 191
|
14 |
+
256 130
|
15 |
+
259 256
|
16 |
+
263 256
|
17 |
+
265 256
|
18 |
+
260 257
|
19 |
+
262 257
|
20 |
+
258 139
|
21 |
+
256 168
|
22 |
+
256 149
|
23 |
+
258 136
|
24 |
+
261 257
|
25 |
+
259 257
|
26 |
+
185 275
|
27 |
+
256 185
|
28 |
+
256 164
|
29 |
+
10 36
|
30 |
+
266 257
|
31 |
+
256 184
|
32 |
+
256 174
|
33 |
+
256 178
|
34 |
+
269 178
|
35 |
+
258 129
|
36 |
+
266 256
|
37 |
+
174 260
|
38 |
+
268 174
|
39 |
+
258 130
|
40 |
+
257 184
|
41 |
+
286 290
|
42 |
+
264 270
|
43 |
+
289 282
|
44 |
+
281 256
|
45 |
+
272 257
|
46 |
+
256 166
|
47 |
+
263 261
|
48 |
+
171 293
|
49 |
+
258 164
|
50 |
+
264 271
|
51 |
+
256 170
|
52 |
+
267 168
|
53 |
+
148 276
|
54 |
+
260 256
|
55 |
+
259 261
|
56 |
+
256 151
|
57 |
+
256 175
|
58 |
+
261 268
|
59 |
+
257 168
|
60 |
+
277 278
|
61 |
+
287 256
|
62 |
+
257 278
|
63 |
+
272 266
|
64 |
+
279 262
|
65 |
+
256 156
|
66 |
+
257 170
|
67 |
+
268 175
|
68 |
+
271 278
|
69 |
+
257 295
|
70 |
+
264 297
|
71 |
+
256 172
|
72 |
+
269 175
|
73 |
+
257 172
|
74 |
+
226 128
|
75 |
+
264 277
|
76 |
+
267 164
|
77 |
+
257 166
|
78 |
+
256 181
|
79 |
+
257 156
|
80 |
+
268 159
|
81 |
+
256 159
|
82 |
+
257 305
|
83 |
+
259 276
|
84 |
+
316 282
|
85 |
+
257 300
|
86 |
+
257 133
|
87 |
+
257 185
|
88 |
+
256 182
|
89 |
+
256 154
|
90 |
+
273 270
|
91 |
+
137 273
|
92 |
+
135 283
|
93 |
+
262 264
|
94 |
+
256 188
|
95 |
+
269 168
|
96 |
+
288 151
|
97 |
+
260 264
|
98 |
+
257 176
|
99 |
+
267 181
|
100 |
+
256 161
|
101 |
+
267 175
|
102 |
+
256 173
|
103 |
+
260 274
|
104 |
+
272 282
|
105 |
+
267 178
|
106 |
+
270 278
|
107 |
+
269 149
|
108 |
+
257 178
|
109 |
+
257 174
|
110 |
+
265 261
|
111 |
+
269 164
|
112 |
+
326 141
|
113 |
+
263 364
|
114 |
+
267 166
|
115 |
+
143 274
|
116 |
+
256 136
|
117 |
+
268 164
|
118 |
+
264 261
|
119 |
+
292 270
|
120 |
+
267 149
|
121 |
+
358 266
|
122 |
+
258 137
|
123 |
+
301 32
|
124 |
+
306 182
|
125 |
+
257 164
|
126 |
+
184 270
|
127 |
+
267 174
|
128 |
+
257 181
|
129 |
+
269 184
|
130 |
+
280 320
|
131 |
+
352 346
|
132 |
+
262 273
|
133 |
+
170 299
|
134 |
+
173 271
|
135 |
+
175 279
|
136 |
+
267 156
|
137 |
+
291 261
|
138 |
+
258 140
|
139 |
+
288 166
|
140 |
+
279 304
|
141 |
+
32 44
|
142 |
+
268 149
|
143 |
+
256 171
|
144 |
+
267 184
|
145 |
+
259 264
|
146 |
+
257 151
|
147 |
+
267 185
|
148 |
+
280 312
|
149 |
+
262 280
|
150 |
+
258 131
|
151 |
+
311 336
|
152 |
+
343 274
|
153 |
+
306 150
|
154 |
+
133 303
|
155 |
+
313 155
|
156 |
+
257 150
|
157 |
+
266 264
|
158 |
+
170 276
|
159 |
+
256 150
|
160 |
+
273 271
|
161 |
+
294 172
|
162 |
+
261 264
|
163 |
+
310 182
|
164 |
+
269 143
|
165 |
+
266 283
|
166 |
+
362 298
|
167 |
+
268 184
|
168 |
+
268 185
|
169 |
+
310 166
|
170 |
+
10 296
|
171 |
+
280 373
|
172 |
+
281 257
|
173 |
+
356 295
|
174 |
+
168 336
|
175 |
+
272 285
|
176 |
+
314 266
|
177 |
+
267 143
|
178 |
+
273 260
|
179 |
+
267 135
|
180 |
+
324 312
|
181 |
+
294 184
|
182 |
+
269 150
|
183 |
+
288 159
|
184 |
+
176 279
|
185 |
+
168 270
|
186 |
+
273 277
|
187 |
+
340 319
|
188 |
+
415 274
|
189 |
+
341 268
|
190 |
+
258 158
|
191 |
+
283 270
|
192 |
+
10 281
|
193 |
+
311 270
|
194 |
+
291 323
|
195 |
+
267 165
|
196 |
+
271 184
|
197 |
+
315 322
|
198 |
+
268 178
|
199 |
+
257 289
|
200 |
+
269 182
|
201 |
+
257 173
|
202 |
+
262 274
|
203 |
+
267 172
|
204 |
+
343 420
|
205 |
+
402 439
|
206 |
+
287 285
|
207 |
+
355 347
|
208 |
+
271 300
|
209 |
+
280 277
|
210 |
+
318 299
|
211 |
+
268 181
|
212 |
+
260 282
|
213 |
+
264 272
|
214 |
+
442 293
|
215 |
+
257 134
|
216 |
+
178 308
|
217 |
+
260 279
|
218 |
+
262 32
|
219 |
+
256 163
|
220 |
+
294 178
|
221 |
+
185 272
|
222 |
+
265 421
|
223 |
+
261 279
|
224 |
+
185 271
|
225 |
+
256 143
|
226 |
+
280 270
|
227 |
+
328 320
|
228 |
+
354 351
|
229 |
+
271 305
|
230 |
+
257 171
|
231 |
+
441 155
|
232 |
+
418 307
|
233 |
+
474 376
|
234 |
+
268 166
|
235 |
+
257 344
|
236 |
+
318 276
|
237 |
+
392 271
|
238 |
+
265 348
|
239 |
+
314 296
|
240 |
+
264 432
|
241 |
+
288 156
|
242 |
+
271 164
|
243 |
+
324 259
|
244 |
+
259 288
|
245 |
+
394 299
|
246 |
+
355 332
|
247 |
+
291 284
|
248 |
+
354 347
|
249 |
+
257 182
|
250 |
+
291 298
|
251 |
+
267 136
|
252 |
+
257 161
|
253 |
+
287 261
|
254 |
+
316 266
|
255 |
+
144 283
|
256 |
+
339 272
|
257 |
+
264 265
|
258 |
+
284 317
|
259 |
+
285 372
|
260 |
+
281 274
|
261 |
+
257 367
|
262 |
+
317 502
|
263 |
+
260 284
|
264 |
+
272 276
|
265 |
+
260 32
|
266 |
+
267 171
|
267 |
+
350 279
|
268 |
+
360 459
|
269 |
+
281 283
|
270 |
+
456 315
|
271 |
+
257 154
|
272 |
+
257 137
|
273 |
+
472 416
|
274 |
+
277 184
|
275 |
+
269 181
|
276 |
+
298 335
|
277 |
+
315 302
|
278 |
+
287 298
|
279 |
+
266 280
|
280 |
+
348 401
|
281 |
+
256 167
|
282 |
+
485 274
|
283 |
+
272 308
|
284 |
+
259 32
|
285 |
+
312 296
|
286 |
+
283 369
|
287 |
+
272 341
|
288 |
+
365 284
|
289 |
+
287 274
|
290 |
+
258 156
|
291 |
+
170 261
|
292 |
+
338 303
|
293 |
+
279 285
|
294 |
+
294 176
|
295 |
+
269 170
|
296 |
+
326 153
|
297 |
+
276 134
|
298 |
+
269 173
|
299 |
+
277 151
|
300 |
+
288 181
|
301 |
+
148 414
|
302 |
+
133 483
|
303 |
+
264 407
|
304 |
+
264 345
|
305 |
+
314 281
|
306 |
+
268 183
|
307 |
+
257 386
|
308 |
+
262 284
|
309 |
+
257 135
|
310 |
+
337 321
|
311 |
+
353 261
|
312 |
+
314 301
|
313 |
+
256 157
|
314 |
+
510 516
|
315 |
+
256 162
|
316 |
+
433 447
|
317 |
+
166 440
|
318 |
+
166 434
|
319 |
+
267 182
|
320 |
+
333 274
|
321 |
+
286 540
|
322 |
+
272 383
|
323 |
+
273 349
|
324 |
+
262 302
|
325 |
+
264 349
|
326 |
+
262 309
|
327 |
+
185 313
|
328 |
+
267 170
|
329 |
+
287 273
|
330 |
+
360 308
|
331 |
+
284 261
|
332 |
+
552 366
|
333 |
+
406 412
|
334 |
+
304 270
|
335 |
+
351 514
|
336 |
+
315 294
|
337 |
+
256 165
|
338 |
+
287 280
|
339 |
+
269 159
|
340 |
+
326 152
|
341 |
+
306 156
|
342 |
+
334 184
|
343 |
+
522 342
|
344 |
+
329 457
|
345 |
+
133 500
|
346 |
+
133 273
|
347 |
+
262 261
|
348 |
+
280 261
|
349 |
+
325 273
|
350 |
+
306 159
|
351 |
+
277 172
|
352 |
+
389 280
|
353 |
+
268 182
|
354 |
+
267 147
|
355 |
+
567 346
|
356 |
+
327 184
|
357 |
+
405 274
|
358 |
+
271 172
|
359 |
+
266 274
|
360 |
+
164 297
|
361 |
+
270 410
|
362 |
+
268 170
|
363 |
+
272 261
|
364 |
+
267 151
|
365 |
+
319 366
|
366 |
+
375 422
|
367 |
+
375 296
|
368 |
+
374 285
|
369 |
+
277 156
|
370 |
+
302 156
|
371 |
+
291 303
|
372 |
+
385 480
|
373 |
+
272 340
|
374 |
+
181 279
|
375 |
+
283 261
|
376 |
+
272 273
|
377 |
+
605 273
|
378 |
+
271 378
|
379 |
+
256 183
|
380 |
+
511 307
|
381 |
+
270 184
|
382 |
+
288 161
|
383 |
+
32 39
|
384 |
+
451 409
|
385 |
+
133 285
|
386 |
+
174 286
|
387 |
+
302 184
|
388 |
+
413 587
|
389 |
+
288 154
|
390 |
+
262 285
|
391 |
+
265 391
|
392 |
+
257 387
|
393 |
+
280 259
|
394 |
+
265 276
|
395 |
+
377 274
|
396 |
+
377 297
|
397 |
+
32 466
|
398 |
+
375 444
|
399 |
+
317 549
|
400 |
+
279 273
|
401 |
+
264 276
|
402 |
+
339 271
|
403 |
+
329 440
|
404 |
+
551 309
|
405 |
+
289 409
|
406 |
+
275 274
|
407 |
+
301 296
|
408 |
+
306 181
|
409 |
+
418 335
|
410 |
+
498 276
|
411 |
+
497 547
|
412 |
+
185 297
|
413 |
+
170 328
|
414 |
+
331 297
|
415 |
+
269 174
|
416 |
+
270 378
|
417 |
+
262 294
|
418 |
+
494 475
|
419 |
+
166 457
|
420 |
+
257 165
|
421 |
+
322 172
|
422 |
+
413 366
|
423 |
+
404 270
|
424 |
+
344 337
|
425 |
+
137 283
|
426 |
+
166 405
|
427 |
+
181 357
|
428 |
+
279 261
|
429 |
+
170 389
|
430 |
+
663 332
|
431 |
+
365 309
|
432 |
+
170 545
|
433 |
+
301 422
|
434 |
+
300 321
|
435 |
+
151 368
|
436 |
+
266 281
|
437 |
+
284 260
|
438 |
+
406 342
|
439 |
+
257 175
|
440 |
+
363 299
|
441 |
+
277 305
|
442 |
+
319 291
|
443 |
+
272 333
|
444 |
+
427 321
|
445 |
+
269 166
|
446 |
+
173 351
|
447 |
+
423 296
|
448 |
+
173 499
|
449 |
+
339 313
|
450 |
+
275 583
|
451 |
+
271 295
|
452 |
+
271 156
|
453 |
+
172 469
|
454 |
+
435 261
|
455 |
+
266 296
|
456 |
+
284 565
|
457 |
+
267 167
|
458 |
+
274 332
|
459 |
+
382 296
|
460 |
+
361 286
|
461 |
+
284 464
|
462 |
+
257 155
|
463 |
+
308 276
|
464 |
+
260 273
|
465 |
+
272 264
|
466 |
+
280 262
|
467 |
+
269 156
|
468 |
+
617 277
|
469 |
+
274 276
|
470 |
+
317 279
|
471 |
+
404 271
|
472 |
+
271 168
|
473 |
+
274 558
|
474 |
+
287 284
|
475 |
+
272 284
|
476 |
+
280 265
|
477 |
+
291 285
|
478 |
+
292 274
|
479 |
+
273 534
|
480 |
+
257 507
|
481 |
+
259 302
|
482 |
+
446 283
|
483 |
+
291 276
|
484 |
+
318 261
|
485 |
+
304 260
|
486 |
+
171 573
|
487 |
+
313 161
|
488 |
+
301 281
|
489 |
+
311 506
|
490 |
+
174 273
|
491 |
+
274 369
|
492 |
+
260 283
|
493 |
+
398 368
|
494 |
+
652 280
|
495 |
+
292 332
|
496 |
+
261 454
|
497 |
+
312 281
|
498 |
+
172 273
|
499 |
+
154 399
|
500 |
+
279 590
|
501 |
+
497 384
|
502 |
+
597 309
|
503 |
+
154 285
|
504 |
+
700 359
|
505 |
+
313 150
|
506 |
+
271 170
|
507 |
+
400 281
|
508 |
+
539 274
|
509 |
+
329 260
|
510 |
+
257 159
|
511 |
+
329 405
|
512 |
+
331 479
|
513 |
+
544 412
|
514 |
+
428 296
|
515 |
+
342 679
|
516 |
+
496 167
|
517 |
+
734 604
|
518 |
+
262 322
|
519 |
+
256 160
|
520 |
+
277 166
|
521 |
+
44 520
|
522 |
+
563 662
|
523 |
+
275 443
|
524 |
+
370 382
|
525 |
+
706 330
|
526 |
+
777 285
|
527 |
+
262 341
|
528 |
+
390 276
|
529 |
+
302 164
|
530 |
+
339 297
|
531 |
+
269 183
|
532 |
+
260 280
|
533 |
+
288 172
|
534 |
+
350 411
|
535 |
+
271 437
|
536 |
+
264 489
|
537 |
+
272 283
|
538 |
+
168 362
|
539 |
+
287 303
|
540 |
+
580 273
|
541 |
+
330 455
|
542 |
+
275 283
|
543 |
+
168 651
|
544 |
+
144 710
|
545 |
+
272 368
|
546 |
+
291 310
|
547 |
+
279 283
|
548 |
+
569 449
|
549 |
+
748 668
|
550 |
+
300 327
|
551 |
+
176 411
|
552 |
+
264 284
|
553 |
+
276 184
|
554 |
+
266 32
|
555 |
+
600 384
|
556 |
+
268 161
|
557 |
+
546 623
|
558 |
+
462 480
|
559 |
+
266 301
|
560 |
+
310 156
|
561 |
+
32 264
|
562 |
+
264 566
|
563 |
+
318 389
|
564 |
+
411 446
|
565 |
+
550 353
|
566 |
+
596 425
|
567 |
+
273 578
|
568 |
+
403 278
|
569 |
+
260 45
|
570 |
+
259 417
|
571 |
+
151 401
|
572 |
+
606 266
|
573 |
+
468 400
|
574 |
+
262 327
|
575 |
+
262 298
|
576 |
+
284 304
|
577 |
+
272 303
|
578 |
+
356 410
|
579 |
+
259 611
|
580 |
+
307 471
|
581 |
+
260 285
|
582 |
+
283 276
|
583 |
+
318 328
|
584 |
+
316 409
|
585 |
+
268 165
|
586 |
+
310 183
|
587 |
+
181 319
|
588 |
+
282 305
|
589 |
+
390 261
|
590 |
+
359 285
|
591 |
+
271 185
|
592 |
+
45 283
|
593 |
+
181 452
|
594 |
+
289 746
|
595 |
+
408 304
|
596 |
+
395 285
|
597 |
+
579 136
|
598 |
+
257 143
|
599 |
+
134 280
|
600 |
+
367 629
|
601 |
+
270 156
|
602 |
+
303 274
|
603 |
+
331 328
|
604 |
+
302 172
|
605 |
+
354 271
|
606 |
+
271 426
|
607 |
+
272 292
|
608 |
+
809 321
|
609 |
+
546 696
|
610 |
+
275 273
|
611 |
+
174 390
|
612 |
+
301 380
|
613 |
+
465 292
|
614 |
+
292 323
|
615 |
+
325 335
|
616 |
+
572 589
|
617 |
+
398 477
|
618 |
+
393 520
|
619 |
+
492 296
|
620 |
+
413 779
|
621 |
+
266 279
|
622 |
+
261 290
|
623 |
+
272 279
|
624 |
+
615 493
|
625 |
+
270 172
|
626 |
+
184 284
|
627 |
+
257 553
|
628 |
+
135 273
|
629 |
+
320 296
|
630 |
+
176 727
|
631 |
+
625 452
|
632 |
+
278 281
|
633 |
+
342 295
|
634 |
+
511 335
|
635 |
+
271 174
|
636 |
+
264 392
|
637 |
+
268 168
|
638 |
+
258 155
|
639 |
+
347 515
|
640 |
+
345 284
|
641 |
+
272 274
|
642 |
+
306 151
|
643 |
+
524 283
|
644 |
+
277 295
|
645 |
+
309 535
|
646 |
+
277 168
|
647 |
+
482 573
|
648 |
+
370 423
|
649 |
+
346 293
|
650 |
+
162 348
|
651 |
+
353 285
|
652 |
+
301 337
|
653 |
+
796 490
|
654 |
+
495 282
|
655 |
+
606 282
|
656 |
+
264 632
|
657 |
+
315 327
|
658 |
+
263 276
|
659 |
+
400 296
|
660 |
+
166 260
|
661 |
+
307 280
|
662 |
+
262 44
|
663 |
+
257 160
|
664 |
+
334 168
|
665 |
+
284 363
|
666 |
+
338 500
|
667 |
+
431 284
|
668 |
+
133 533
|
669 |
+
355 419
|
670 |
+
345 883
|
671 |
+
283 348
|
672 |
+
262 330
|
673 |
+
264 484
|
674 |
+
338 298
|
675 |
+
441 154
|
676 |
+
277 437
|
677 |
+
387 337
|
678 |
+
302 170
|
679 |
+
338 285
|
680 |
+
277 170
|
681 |
+
381 419
|
682 |
+
299 518
|
683 |
+
259 327
|
684 |
+
306 161
|
685 |
+
324 656
|
686 |
+
262 283
|
687 |
+
270 295
|
688 |
+
267 159
|
689 |
+
277 436
|
690 |
+
628 356
|
691 |
+
166 284
|
692 |
+
287 538
|
693 |
+
375 281
|
694 |
+
144 443
|
695 |
+
269 155
|
696 |
+
135 778
|
697 |
+
397 265
|
698 |
+
181 270
|
699 |
+
137 303
|
700 |
+
725 309
|
701 |
+
268 167
|
702 |
+
265 873
|
703 |
+
579 143
|
704 |
+
456 464
|
705 |
+
137 298
|
706 |
+
526 274
|
707 |
+
313 182
|
708 |
+
154 692
|
709 |
+
292 261
|
710 |
+
274 335
|
711 |
+
258 343
|
712 |
+
356 378
|
713 |
+
164 274
|
714 |
+
303 299
|
715 |
+
286 268
|
716 |
+
331 284
|
717 |
+
340 357
|
718 |
+
171 646
|
719 |
+
292 349
|
720 |
+
259 322
|
721 |
+
176 388
|
722 |
+
276 172
|
723 |
+
353 298
|
724 |
+
166 286
|
725 |
+
530 486
|
726 |
+
338 483
|
727 |
+
262 296
|
728 |
+
331 261
|
729 |
+
496 154
|
730 |
+
274 383
|
731 |
+
271 344
|
732 |
+
684 270
|
733 |
+
372 307
|
734 |
+
902 371
|
735 |
+
280 369
|
736 |
+
790 571
|
737 |
+
315 640
|
738 |
+
374 308
|
739 |
+
947 285
|
740 |
+
261 32
|
741 |
+
156 720
|
742 |
+
431 261
|
743 |
+
284 273
|
744 |
+
274 307
|
745 |
+
331 323
|
746 |
+
264 726
|
747 |
+
334 172
|
748 |
+
373 296
|
749 |
+
272 542
|
750 |
+
701 143
|
751 |
+
257 167
|
752 |
+
261 471
|
753 |
+
374 284
|
754 |
+
45 274
|
755 |
+
267 183
|
756 |
+
280 358
|
757 |
+
280 260
|
758 |
+
300 294
|
759 |
+
421 613
|
760 |
+
280 276
|
761 |
+
677 274
|
762 |
+
481 184
|
763 |
+
350 388
|
764 |
+
470 466
|
765 |
+
265 310
|
766 |
+
430 327
|
767 |
+
259 281
|
768 |
+
535 934
|
769 |
+
278 296
|
770 |
+
264 397
|
771 |
+
259 282
|
772 |
+
317 323
|
773 |
+
304 277
|
774 |
+
705 807
|
775 |
+
310 165
|
776 |
+
264 379
|
777 |
+
133 298
|
778 |
+
150 396
|
779 |
+
313 159
|
780 |
+
637 308
|
781 |
+
375 10
|
782 |
+
32 292
|
783 |
+
291 333
|
784 |
+
311 836
|
785 |
+
465 368
|
786 |
+
182 399
|
787 |
+
428 281
|
788 |
+
269 154
|
789 |
+
334 174
|
790 |
+
798 163
|
791 |
+
154 469
|
792 |
+
1043 261
|
793 |
+
134 309
|
794 |
+
260 281
|
795 |
+
283 614
|
796 |
+
782 156
|
797 |
+
844 532
|
798 |
+
311 309
|
799 |
+
154 261
|
800 |
+
178 355
|
801 |
+
402 631
|
802 |
+
318 545
|
803 |
+
322 155
|
804 |
+
271 849
|
805 |
+
377 801
|
806 |
+
277 825
|
807 |
+
330 262
|
808 |
+
304 528
|
809 |
+
304 271
|
810 |
+
751 416
|
811 |
+
259 294
|
812 |
+
359 299
|
813 |
+
460 321
|
814 |
+
313 183
|
815 |
+
473 308
|
816 |
+
45 731
|
817 |
+
168 309
|
818 |
+
307 332
|
819 |
+
178 853
|
820 |
+
429 282
|
821 |
+
333 273
|
822 |
+
374 310
|
823 |
+
306 175
|
824 |
+
298 307
|
825 |
+
288 170
|
826 |
+
332 299
|
827 |
+
393 331
|
828 |
+
376 273
|
829 |
+
270 305
|
830 |
+
166 942
|
831 |
+
278 266
|
832 |
+
173 330
|
833 |
+
259 301
|
834 |
+
694 317
|
835 |
+
709 832
|
836 |
+
333 332
|
837 |
+
342 468
|
838 |
+
261 302
|
839 |
+
133 323
|
840 |
+
504 774
|
841 |
+
345 489
|
842 |
+
428 301
|
843 |
+
903 990
|
844 |
+
312 301
|
845 |
+
32 45
|
846 |
+
381 271
|
847 |
+
451 806
|
848 |
+
185 599
|
849 |
+
673 816
|
850 |
+
185 276
|
851 |
+
292 384
|
852 |
+
324 285
|
853 |
+
173 913
|
854 |
+
294 174
|
855 |
+
284 486
|
856 |
+
487 274
|
857 |
+
150 446
|
858 |
+
374 274
|
859 |
+
287 391
|
860 |
+
271 159
|
861 |
+
554 670
|
862 |
+
337 327
|
863 |
+
823 1049
|
864 |
+
783 309
|
865 |
+
380 270
|
866 |
+
303 450
|
867 |
+
300 302
|
868 |
+
288 167
|
869 |
+
423 281
|
870 |
+
353 308
|
871 |
+
176 760
|
872 |
+
313 181
|
873 |
+
134 411
|
874 |
+
172 752
|
875 |
+
408 769
|
876 |
+
156 261
|
877 |
+
285 459
|
878 |
+
380 279
|
879 |
+
291 627
|
880 |
+
345 484
|
881 |
+
609 1068
|
882 |
+
372 276
|
883 |
+
277 181
|
884 |
+
931 308
|
885 |
+
271 151
|
886 |
+
338 308
|
887 |
+
361 273
|
888 |
+
185 417
|
889 |
+
344 274
|
890 |
+
262 281
|
891 |
+
182 1060
|
892 |
+
544 342
|
893 |
+
182 299
|
894 |
+
310 184
|
895 |
+
270 170
|
896 |
+
309 396
|
897 |
+
276 166
|
898 |
+
277 174
|
899 |
+
488 172
|
900 |
+
303 735
|
901 |
+
291 283
|
902 |
+
408 446
|
903 |
+
365 279
|
904 |
+
397 407
|
905 |
+
261 274
|
906 |
+
882 981
|
907 |
+
291 274
|
908 |
+
173 261
|
909 |
+
300 322
|
910 |
+
330 273
|
911 |
+
317 333
|
912 |
+
264 336
|
913 |
+
171 591
|
914 |
+
505 291
|
915 |
+
637 351
|
916 |
+
620 527
|
917 |
+
1168 739
|
918 |
+
450 919
|
919 |
+
755 478
|
920 |
+
181 722
|
921 |
+
135 284
|
922 |
+
185 381
|
923 |
+
261 298
|
924 |
+
133 391
|
925 |
+
560 363
|
926 |
+
385 280
|
927 |
+
261 388
|
928 |
+
273 328
|
929 |
+
274 838
|
930 |
+
374 309
|
931 |
+
303 1042
|
932 |
+
799 396
|
933 |
+
257 675
|
934 |
+
478 955
|
935 |
+
742 876
|
936 |
+
781 475
|
937 |
+
261 395
|
938 |
+
306 172
|
939 |
+
453 351
|
940 |
+
338 531
|
941 |
+
460 588
|
942 |
+
311 349
|
943 |
+
137 600
|
944 |
+
575 922
|
945 |
+
512 407
|
946 |
+
583 304
|
947 |
+
133 952
|
948 |
+
1051 692
|
949 |
+
1053 268
|
950 |
+
273 454
|
951 |
+
312 424
|
952 |
+
926 1122
|
953 |
+
257 148
|
954 |
+
268 154
|
955 |
+
273 391
|
956 |
+
311 534
|
957 |
+
307 271
|
958 |
+
269 151
|
959 |
+
292 284
|
960 |
+
172 372
|
961 |
+
356 305
|
962 |
+
184 584
|
963 |
+
382 281
|
964 |
+
689 435
|
965 |
+
753 1118
|
966 |
+
347 420
|
967 |
+
967 295
|
968 |
+
543 395
|
969 |
+
458 712
|
970 |
+
1017 171
|
971 |
+
586 295
|
972 |
+
44 666
|
973 |
+
45 323
|
974 |
+
46 46
|
975 |
+
133 317
|
976 |
+
308 273
|
977 |
+
151 304
|
978 |
+
429 308
|
979 |
+
161 774
|
980 |
+
261 294
|
981 |
+
608 532
|
982 |
+
283 357
|
983 |
+
309 455
|
984 |
+
661 295
|
985 |
+
261 324
|
986 |
+
283 319
|
987 |
+
369 335
|
988 |
+
298 304
|
989 |
+
168 817
|
990 |
+
415 273
|
991 |
+
365 333
|
992 |
+
624 363
|
993 |
+
276 295
|
994 |
+
319 304
|
995 |
+
940 274
|
996 |
+
1247 578
|
997 |
+
430 525
|
998 |
+
171 901
|
999 |
+
1029 985
|
1000 |
+
331 775
|
1001 |
+
276 305
|
1002 |
+
863 514
|
1003 |
+
625 273
|
1004 |
+
365 280
|
1005 |
+
137 285
|
1006 |
+
323 388
|
1007 |
+
152 1073
|
1008 |
+
315 556
|
1009 |
+
184 682
|
1010 |
+
272 317
|
1011 |
+
133 354
|
1012 |
+
271 166
|
1013 |
+
260 435
|
1014 |
+
292 708
|
1015 |
+
267 173
|
1016 |
+
290 328
|
1017 |
+
279 284
|
1018 |
+
278 301
|
1019 |
+
257 595
|
1020 |
+
264 368
|
1021 |
+
793 741
|
1022 |
+
813 517
|
1023 |
+
275 771
|
1024 |
+
135 280
|
1025 |
+
394 280
|
1026 |
+
436 745
|
1027 |
+
660 722
|
1028 |
+
406 575
|
1029 |
+
44 331
|
1030 |
+
396 332
|
1031 |
+
314 424
|
1032 |
+
309 273
|
1033 |
+
433 379
|
1034 |
+
276 437
|
1035 |
+
45 303
|
1036 |
+
259 531
|
1037 |
+
324 277
|
1038 |
+
780 410
|
1039 |
+
310 149
|
1040 |
+
325 328
|
1041 |
+
350 760
|
1042 |
+
260 298
|
1043 |
+
291 273
|
1044 |
+
279 317
|
1045 |
+
918 309
|
1046 |
+
404 448
|
1047 |
+
506 1006
|
1048 |
+
1299 336
|
1049 |
+
185 284
|
1050 |
+
275 309
|
1051 |
+
268 151
|
1052 |
+
920 359
|
1053 |
+
288 173
|
1054 |
+
597 784
|
1055 |
+
369 515
|
1056 |
+
1307 357
|
1057 |
+
184 848
|
1058 |
+
1055 291
|
1059 |
+
168 534
|
1060 |
+
577 484
|
1061 |
+
168 379
|
1062 |
+
175 366
|
1063 |
+
492 281
|
1064 |
+
325 469
|
1065 |
+
767 270
|
1066 |
+
538 590
|
1067 |
+
462 515
|
1068 |
+
1064 284
|
1069 |
+
508 430
|
1070 |
+
697 319
|
1071 |
+
373 281
|
1072 |
+
307 262
|
1073 |
+
522 575
|
1074 |
+
260 417
|
1075 |
+
1069 792
|
1076 |
+
273 889
|
1077 |
+
182 975
|
1078 |
+
134 854
|
1079 |
+
259 266
|
1080 |
+
150 769
|
1081 |
+
1074 289
|
1082 |
+
494 297
|
1083 |
+
302 687
|
1084 |
+
309 329
|
1085 |
+
431 333
|
1086 |
+
308 279
|
1087 |
+
398 309
|
1088 |
+
737 327
|
1089 |
+
313 172
|
1090 |
+
657 379
|
1091 |
+
1342 1235
|
1092 |
+
270 182
|
1093 |
+
262 352
|
1094 |
+
286 394
|
1095 |
+
325 927
|
1096 |
+
172 383
|
1097 |
+
155 695
|
1098 |
+
343 1155
|
1099 |
+
267 152
|
1100 |
+
32 592
|
1101 |
+
334 181
|
1102 |
+
275 298
|
1103 |
+
371 543
|
1104 |
+
356 437
|
1105 |
+
845 357
|
1106 |
+
655 449
|
1107 |
+
400 509
|
1108 |
+
548 321
|
1109 |
+
264 518
|
1110 |
+
133 627
|
1111 |
+
302 166
|
1112 |
+
264 381
|
1113 |
+
434 261
|
1114 |
+
320 266
|
1115 |
+
292 1087
|
1116 |
+
262 317
|
1117 |
+
272 330
|
1118 |
+
176 395
|
1119 |
+
799 1153
|
1120 |
+
277 185
|
1121 |
+
917 1267
|
1122 |
+
268 156
|
1123 |
+
785 270
|
1124 |
+
753 488
|
1125 |
+
285 270
|
1126 |
+
172 768
|
1127 |
+
408 530
|
1128 |
+
385 923
|
1129 |
+
337 636
|
1130 |
+
176 427
|
1131 |
+
269 165
|
1132 |
+
337 32
|
1133 |
+
292 682
|
1134 |
+
259 393
|
1135 |
+
1100 297
|
1136 |
+
359 1277
|
1137 |
+
403 665
|
1138 |
+
314 509
|
1139 |
+
283 349
|
1140 |
+
325 427
|
1141 |
+
173 572
|
1142 |
+
330 399
|
1143 |
+
331 720
|
1144 |
+
313 157
|
1145 |
+
271 181
|
1146 |
+
670 371
|
1147 |
+
294 1174
|
1148 |
+
839 743
|
1149 |
+
1175 538
|
1150 |
+
701 134
|
1151 |
+
310 159
|
1152 |
+
1178 550
|
1153 |
+
361 317
|
1154 |
+
303 389
|
1155 |
+
292 954
|
1156 |
+
151 299
|
1157 |
+
428 424
|
1158 |
+
291 330
|
1159 |
+
1044 613
|
1160 |
+
320 281
|
1161 |
+
380 319
|
1162 |
+
280 299
|
1163 |
+
470 39
|
1164 |
+
256 135
|
1165 |
+
269 171
|
1166 |
+
878 309
|
1167 |
+
45 256
|
1168 |
+
333 261
|
1169 |
+
339 417
|
1170 |
+
184 532
|
1171 |
+
325 438
|
1172 |
+
134 477
|
1173 |
+
338 323
|
1174 |
+
150 261
|
1175 |
+
135 1198
|
1176 |
+
403 473
|
1177 |
+
1052 276
|
1178 |
+
1201 160
|
1179 |
+
354 499
|
1180 |
+
1431 265
|
1181 |
+
527 376
|
1182 |
+
276 378
|
1183 |
+
584 1204
|
1184 |
+
290 274
|
1185 |
+
133 330
|
1186 |
+
307 302
|
1187 |
+
624 969
|
1188 |
+
318 429
|
1189 |
+
432 296
|
1190 |
+
340 274
|
1191 |
+
166 1131
|
1192 |
+
134 368
|
1193 |
+
307 283
|
1194 |
+
424 344
|
1195 |
+
329 628
|
1196 |
+
133 531
|
1197 |
+
1324 395
|
1198 |
+
345 265
|
1199 |
+
429 786
|
1200 |
+
329 434
|
1201 |
+
370 438
|
1202 |
+
352 591
|
1203 |
+
622 429
|
1204 |
+
479 281
|
1205 |
+
377 475
|
1206 |
+
259 348
|
1207 |
+
328 312
|
1208 |
+
39 513
|
1209 |
+
467 854
|
1210 |
+
285 394
|
1211 |
+
277 579
|
1212 |
+
1463 134
|
1213 |
+
329 286
|
1214 |
+
332 307
|
1215 |
+
170 1011
|
1216 |
+
257 136
|
1217 |
+
1333 417
|
1218 |
+
137 1107
|
1219 |
+
173 345
|
1220 |
+
385 1148
|
1221 |
+
340 273
|
1222 |
+
161 822
|
1223 |
+
330 388
|
1224 |
+
269 161
|
1225 |
+
1346 458
|
1226 |
+
308 270
|
1227 |
+
283 391
|
1228 |
+
976 341
|
1229 |
+
374 333
|
1230 |
+
365 303
|
1231 |
+
338 273
|
1232 |
+
264 661
|
1233 |
+
167 1246
|
1234 |
+
325 607
|
1235 |
+
365 283
|
1236 |
+
824 322
|
1237 |
+
267 154
|
1238 |
+
831 273
|
1239 |
+
321 156
|
1240 |
+
821 323
|
1241 |
+
313 163
|
1242 |
+
285 324
|
1243 |
+
133 261
|
1244 |
+
294 166
|
1245 |
+
959 394
|
1246 |
+
1497 286
|
1247 |
+
371 156
|
1248 |
+
150 304
|
1249 |
+
943 528
|
1250 |
+
174 279
|
1251 |
+
556 489
|
1252 |
+
400 301
|
1253 |
+
151 728
|
1254 |
+
382 301
|
1255 |
+
357 831
|
1256 |
+
1507 265
|
1257 |
+
173 1007
|
1258 |
+
315 865
|
1259 |
+
374 303
|
1260 |
+
155 574
|
1261 |
+
430 302
|
1262 |
+
133 1373
|
1263 |
+
453 1088
|
1264 |
+
1086 359
|
1265 |
+
485 273
|
1266 |
+
714 695
|
1267 |
+
331 794
|
1268 |
+
864 506
|
1269 |
+
946 295
|
1270 |
+
271 178
|
1271 |
+
541 455
|
1272 |
+
574 271
|
1273 |
+
1170 921
|
1274 |
+
948 674
|
1275 |
+
260 302
|
1276 |
+
390 274
|
1277 |
+
307 277
|
1278 |
+
585 170
|
1279 |
+
318 383
|
1280 |
+
161 994
|
1281 |
+
317 280
|
1282 |
+
133 283
|
1283 |
+
563 498
|
1284 |
+
639 323
|
1285 |
+
154 541
|
1286 |
+
549 303
|
1287 |
+
277 473
|
1288 |
+
257 145
|
1289 |
+
283 280
|
1290 |
+
353 274
|
1291 |
+
960 471
|
1292 |
+
277 426
|
1293 |
+
478 612
|
1294 |
+
1172 371
|
1295 |
+
311 651
|
1296 |
+
159 299
|
1297 |
+
262 631
|
1298 |
+
271 687
|
1299 |
+
817 537
|
1300 |
+
261 44
|
1301 |
+
334 156
|
1302 |
+
1176 388
|
1303 |
+
1285 342
|
1304 |
+
170 376
|
1305 |
+
32 40
|
1306 |
+
265 264
|
1307 |
+
337 294
|
1308 |
+
307 270
|
1309 |
+
370 342
|
1310 |
+
655 315
|
1311 |
+
1048 479
|
1312 |
+
294 598
|
1313 |
+
645 327
|
1314 |
+
277 386
|
1315 |
+
344 562
|
1316 |
+
344 1308
|
1317 |
+
845 463
|
1318 |
+
431 285
|
1319 |
+
1430 1432
|
1320 |
+
430 674
|
1321 |
+
176 330
|
1322 |
+
44 380
|
1323 |
+
524 285
|
1324 |
+
385 1318
|
1325 |
+
134 1207
|
1326 |
+
257 147
|
1327 |
+
172 816
|
1328 |
+
261 392
|
1329 |
+
675 178
|
1330 |
+
450 275
|
1331 |
+
134 303
|
1332 |
+
324 280
|
1333 |
+
461 426
|
1334 |
+
306 154
|
1335 |
+
284 290
|
1336 |
+
151 607
|
1337 |
+
133 280
|
1338 |
+
323 486
|
1339 |
+
493 827
|
1340 |
+
1591 308
|
1341 |
+
330 384
|
1342 |
+
370 412
|
1343 |
+
273 273
|
1344 |
+
1454 490
|
1345 |
+
328 1455
|
1346 |
+
283 837
|
1347 |
+
292 697
|
1348 |
+
372 558
|
1349 |
+
32 296
|
1350 |
+
264 470
|
1351 |
+
271 473
|
1352 |
+
161 357
|
1353 |
+
284 357
|
1354 |
+
519 373
|
1355 |
+
303 357
|
1356 |
+
438 184
|
1357 |
+
891 602
|
1358 |
+
257 404
|
1359 |
+
32 281
|
1360 |
+
270 176
|
1361 |
+
403 170
|
1362 |
+
298 284
|
1363 |
+
1227 1336
|
1364 |
+
1615 660
|
1365 |
+
1616 1228
|
1366 |
+
262 276
|
1367 |
+
285 292
|
1368 |
+
445 344
|
1369 |
+
752 654
|
1370 |
+
276 426
|
1371 |
+
372 368
|
1372 |
+
271 476
|
1373 |
+
998 335
|
1374 |
+
259 370
|
1375 |
+
515 381
|
1376 |
+
150 530
|
1377 |
+
274 629
|
1378 |
+
453 345
|
1379 |
+
361 1234
|
1380 |
+
381 713
|
1381 |
+
570 353
|
1382 |
+
756 896
|
1383 |
+
388 793
|
1384 |
+
172 366
|
1385 |
+
464 612
|
1386 |
+
401 284
|
1387 |
+
260 261
|
1388 |
+
298 380
|
1389 |
+
680 503
|
1390 |
+
360 893
|
1391 |
+
299 286
|
1392 |
+
363 370
|
1393 |
+
318 982
|
1394 |
+
1350 315
|
1395 |
+
1646 342
|
1396 |
+
365 285
|
1397 |
+
279 643
|
1398 |
+
340 683
|
1399 |
+
285 323
|
1400 |
+
1082 476
|
1401 |
+
271 410
|
1402 |
+
481 151
|
1403 |
+
287 283
|
1404 |
+
492 301
|
1405 |
+
151 477
|
1406 |
+
951 897
|
1407 |
+
866 443
|
1408 |
+
334 176
|
1409 |
+
264 495
|
1410 |
+
718 281
|
1411 |
+
172 307
|
1412 |
+
262 303
|
1413 |
+
264 279
|
1414 |
+
315 872
|
1415 |
+
669 166
|
1416 |
+
453 307
|
1417 |
+
757 319
|
1418 |
+
168 349
|
1419 |
+
156 323
|
1420 |
+
622 261
|
1421 |
+
1672 604
|
1422 |
+
390 333
|
1423 |
+
739 346
|
1424 |
+
338 627
|
1425 |
+
586 679
|
1426 |
+
133 308
|
1427 |
+
335 295
|
1428 |
+
374 261
|
1429 |
+
44 329
|
1430 |
+
1254 308
|
1431 |
+
584 425
|
1432 |
+
320 301
|
1433 |
+
664 156
|
1434 |
+
957 486
|
1435 |
+
561 273
|
1436 |
+
303 285
|
1437 |
+
1105 578
|
1438 |
+
260 528
|
1439 |
+
173 616
|
1440 |
+
599 324
|
1441 |
+
564 281
|
1442 |
+
598 313
|
1443 |
+
810 363
|
1444 |
+
603 273
|
1445 |
+
277 553
|
1446 |
+
285 359
|
1447 |
+
277 164
|
1448 |
+
301 444
|
1449 |
+
621 958
|
1450 |
+
756 259
|
1451 |
+
1520 393
|
1452 |
+
133 395
|
1453 |
+
268 172
|
1454 |
+
134 533
|
1455 |
+
174 1523
|
1456 |
+
374 283
|
1457 |
+
156 1273
|
1458 |
+
256 152
|
1459 |
+
285 828
|
1460 |
+
298 647
|
1461 |
+
342 1343
|
1462 |
+
1369 643
|
1463 |
+
294 1171
|
1464 |
+
32 380
|
1465 |
+
260 619
|
1466 |
+
829 357
|
1467 |
+
380 874
|
1468 |
+
277 171
|
1469 |
+
166 272
|
1470 |
+
325 768
|
1471 |
+
1257 565
|
1472 |
+
1374 498
|
1473 |
+
268 378
|
1474 |
+
501 299
|
1475 |
+
561 778
|
1476 |
+
283 789
|
1477 |
+
272 414
|
1478 |
+
291 417
|
1479 |
+
311 362
|
1480 |
+
304 349
|
1481 |
+
262 641
|
1482 |
+
264 319
|
1483 |
+
350 379
|
1484 |
+
377 717
|
1485 |
+
482 901
|
1486 |
+
285 486
|
1487 |
+
316 273
|
1488 |
+
151 309
|
1489 |
+
133 834
|
1490 |
+
184 708
|
1491 |
+
657 407
|
1492 |
+
1395 476
|
1493 |
+
262 301
|
1494 |
+
32 1384
|
1495 |
+
815 1398
|
1496 |
+
672 262
|
1497 |
+
1038 697
|
1498 |
+
44 292
|
1499 |
+
1101 271
|
1500 |
+
671 425
|
1501 |
+
997 1401
|
1502 |
+
431 309
|
1503 |
+
44 361
|
1504 |
+
907 295
|
1505 |
+
998 307
|
1506 |
+
702 260
|
1507 |
+
164 1290
|
1508 |
+
302 367
|
1509 |
+
280 463
|
1510 |
+
143 1184
|
1511 |
+
275 261
|
1512 |
+
1413 743
|
1513 |
+
339 643
|
1514 |
+
274 299
|
1515 |
+
496 181
|
1516 |
+
1189 304
|
1517 |
+
288 175
|
1518 |
+
478 1418
|
1519 |
+
529 184
|
1520 |
+
264 1300
|
1521 |
+
294 385
|
1522 |
+
631 332
|
1523 |
+
181 1116
|
1524 |
+
271 385
|
1525 |
+
259 296
|
1526 |
+
1111 276
|
1527 |
+
156 963
|
1528 |
+
355 558
|
1529 |
+
1569 283
|
1530 |
+
1781 819
|
1531 |
+
172 298
|
1532 |
+
508 382
|
1533 |
+
294 134
|
1534 |
+
688 261
|
1535 |
+
350 348
|
1536 |
+
1008 840
|
1537 |
+
462 923
|
1538 |
+
321 181
|
1539 |
+
302 174
|
1540 |
+
168 842
|
1541 |
+
137 280
|
1542 |
+
302 387
|
1543 |
+
259 44
|
1544 |
+
182 505
|
1545 |
+
264 283
|
1546 |
+
351 333
|
1547 |
+
851 290
|
1548 |
+
1125 646
|
1549 |
+
1126 1127
|
1550 |
+
330 307
|
1551 |
+
294 182
|
1552 |
+
154 581
|
1553 |
+
1125 362
|
1554 |
+
1587 827
|
1555 |
+
285 274
|
1556 |
+
257 157
|
1557 |
+
357 273
|
1558 |
+
601 1451
|
1559 |
+
289 1595
|
1560 |
+
788 295
|
1561 |
+
143 1596
|
1562 |
+
445 184
|
1563 |
+
133 715
|
1564 |
+
408 1328
|
1565 |
+
660 285
|
1566 |
+
307 837
|
1567 |
+
315 568
|
1568 |
+
257 152
|
1569 |
+
311 277
|
1570 |
+
431 273
|
1571 |
+
344 270
|
1572 |
+
689 417
|
1573 |
+
512 1221
|
1574 |
+
372 261
|
1575 |
+
1139 876
|
1576 |
+
1462 265
|
1577 |
+
764 296
|
1578 |
+
453 261
|
1579 |
+
805 274
|
1580 |
+
501 399
|
1581 |
+
284 309
|
1582 |
+
691 366
|
1583 |
+
1609 1020
|
1584 |
+
170 450
|
1585 |
+
339 448
|
1586 |
+
170 414
|
1587 |
+
451 746
|
1588 |
+
348 260
|
1589 |
+
1075 283
|
1590 |
+
270 803
|
1591 |
+
333 454
|
1592 |
+
1220 1469
|
1593 |
+
310 163
|
1594 |
+
262 333
|
1595 |
+
533 304
|
1596 |
+
1187 274
|
1597 |
+
178 434
|
1598 |
+
448 349
|
1599 |
+
937 537
|
1600 |
+
856 1597
|
1601 |
+
276 300
|
1602 |
+
342 410
|
1603 |
+
264 589
|
1604 |
+
527 307
|
1605 |
+
961 399
|
1606 |
+
327 367
|
1607 |
+
258 153
|
1608 |
+
1627 1078
|
1609 |
+
406 273
|
1610 |
+
360 609
|
1611 |
+
272 352
|
1612 |
+
716 1216
|
1613 |
+
465 32
|
1614 |
+
895 274
|
1615 |
+
159 431
|
1616 |
+
1145 374
|
1617 |
+
1868 395
|
1618 |
+
257 343
|
1619 |
+
322 678
|
1620 |
+
172 1477
|
1621 |
+
580 283
|
1622 |
+
178 260
|
1623 |
+
598 505
|
1624 |
+
1875 616
|
1625 |
+
719 388
|
1626 |
+
1480 1047
|
1627 |
+
260 303
|
1628 |
+
262 860
|
1629 |
+
308 299
|
1630 |
+
267 137
|
1631 |
+
168 434
|
1632 |
+
270 657
|
1633 |
+
907 378
|
1634 |
+
165 1643
|
1635 |
+
168 550
|
1636 |
+
164 475
|
1637 |
+
341 285
|
1638 |
+
891 1351
|
1639 |
+
402 1650
|
1640 |
+
134 1181
|
1641 |
+
523 829
|
1642 |
+
1893 383
|
1643 |
+
322 1113
|
1644 |
+
592 323
|
1645 |
+
664 687
|
1646 |
+
392 576
|
1647 |
+
331 304
|
1648 |
+
280 780
|
1649 |
+
334 182
|
1650 |
+
275 285
|
1651 |
+
610 469
|
1652 |
+
278 688
|
1653 |
+
493 309
|
1654 |
+
561 284
|
1655 |
+
388 303
|
1656 |
+
1907 1075
|
1657 |
+
370 280
|
1658 |
+
267 163
|
1659 |
+
273 334
|
1660 |
+
261 1493
|
1661 |
+
535 1240
|
1662 |
+
1357 1668
|
1663 |
+
1914 298
|
1664 |
+
1915 463
|
1665 |
+
1916 388
|
1666 |
+
340 1640
|
1667 |
+
1918 1445
|
1668 |
+
370 430
|
1669 |
+
270 181
|
1670 |
+
318 376
|
1671 |
+
327 174
|
1672 |
+
170 868
|
1673 |
+
261 757
|
1674 |
+
513 629
|
1675 |
+
427 808
|
1676 |
+
1173 1255
|
1677 |
+
1686 376
|
1678 |
+
274 283
|
1679 |
+
279 1508
|
1680 |
+
820 301
|
1681 |
+
285 416
|
1682 |
+
271 176
|
1683 |
+
433 532
|
1684 |
+
645 281
|
1685 |
+
1370 1239
|
1686 |
+
310 154
|
1687 |
+
345 349
|
1688 |
+
349 484
|
1689 |
+
261 995
|
1690 |
+
1694 1084
|
1691 |
+
154 390
|
1692 |
+
698 449
|
1693 |
+
319 396
|
1694 |
+
276 170
|
1695 |
+
304 787
|
1696 |
+
277 468
|
1697 |
+
1518 448
|
1698 |
+
279 1023
|
1699 |
+
32 422
|
1700 |
+
161 1095
|
1701 |
+
839 330
|
1702 |
+
277 410
|
1703 |
+
504 1095
|
1704 |
+
291 352
|
1705 |
+
318 991
|
1706 |
+
1193 1707
|
1707 |
+
294 1167
|
1708 |
+
702 379
|
1709 |
+
1960 862
|
1710 |
+
843 1712
|
1711 |
+
501 1166
|
1712 |
+
455 363
|
1713 |
+
350 427
|
1714 |
+
347 397
|
1715 |
+
280 292
|
1716 |
+
564 444
|
1717 |
+
373 301
|
1718 |
+
262 323
|
1719 |
+
487 562
|
1720 |
+
32 325
|
1721 |
+
1383 581
|
1722 |
+
331 429
|
1723 |
+
1718 1719
|
1724 |
+
156 284
|
1725 |
+
329 284
|
1726 |
+
178 459
|
1727 |
+
428 619
|
1728 |
+
1514 1347
|
1729 |
+
272 555
|
1730 |
+
380 336
|
1731 |
+
10 256
|
1732 |
+
385 1638
|
1733 |
+
321 182
|
1734 |
+
318 868
|
1735 |
+
1225 335
|
1736 |
+
1276 412
|
1737 |
+
171 1031
|
1738 |
+
393 648
|
1739 |
+
609 276
|
1740 |
+
360 1375
|
1741 |
+
1704 1728
|
1742 |
+
172 1275
|
1743 |
+
403 638
|
1744 |
+
737 525
|
1745 |
+
325 307
|
1746 |
+
291 279
|
1747 |
+
285 403
|
1748 |
+
280 949
|
1749 |
+
170 991
|
1750 |
+
171 1219
|
1751 |
+
988 776
|
1752 |
+
1381 407
|
1753 |
+
349 407
|
1754 |
+
165 574
|
1755 |
+
154 1159
|
1756 |
+
989 337
|
1757 |
+
279 287
|
1758 |
+
2009 641
|
1759 |
+
508 400
|
1760 |
+
162 642
|
1761 |
+
1320 1515
|
1762 |
+
323 285
|
1763 |
+
403 165
|
1764 |
+
319 1284
|
1765 |
+
501 975
|
1766 |
+
577 368
|
1767 |
+
736 32
|
1768 |
+
172 1279
|
1769 |
+
302 300
|
1770 |
+
314 334
|
1771 |
+
1399 455
|
1772 |
+
176 341
|
1773 |
+
724 1551
|
1774 |
+
288 152
|
1775 |
+
300 556
|
1776 |
+
1282 490
|
1777 |
+
326 140
|
1778 |
+
338 952
|
1779 |
+
287 308
|
1780 |
+
1758 1555
|
1781 |
+
276 436
|
1782 |
+
653 912
|
1783 |
+
381 369
|
1784 |
+
388 273
|
1785 |
+
334 133
|
1786 |
+
261 327
|
1787 |
+
819 491
|
1788 |
+
398 586
|
1789 |
+
467 1181
|
1790 |
+
273 401
|
1791 |
+
597 260
|
1792 |
+
345 632
|
1793 |
+
357 689
|
1794 |
+
277 161
|
1795 |
+
676 302
|
1796 |
+
44 350
|
1797 |
+
875 274
|
1798 |
+
460 425
|
1799 |
+
1187 273
|
1800 |
+
623 371
|
1801 |
+
284 286
|
1802 |
+
321 387
|
1803 |
+
322 170
|
1804 |
+
256 155
|
1805 |
+
539 371
|
1806 |
+
744 332
|
1807 |
+
335 305
|
1808 |
+
882 822
|
1809 |
+
285 332
|
1810 |
+
291 317
|
1811 |
+
397 345
|
1812 |
+
288 543
|
1813 |
+
280 271
|
1814 |
+
875 363
|
1815 |
+
694 333
|
1816 |
+
325 262
|
1817 |
+
543 1433
|
1818 |
+
322 176
|
1819 |
+
416 333
|
1820 |
+
377 384
|
1821 |
+
398 607
|
1822 |
+
1298 1435
|
1823 |
+
320 424
|
1824 |
+
294 344
|
1825 |
+
338 391
|
1826 |
+
322 595
|
1827 |
+
478 476
|
1828 |
+
598 319
|
1829 |
+
471 1059
|
1830 |
+
1012 884
|
1831 |
+
350 351
|
1832 |
+
264 285
|
1833 |
+
271 134
|
1834 |
+
277 378
|
1835 |
+
1796 313
|
1836 |
+
2087 851
|
1837 |
+
45 298
|
1838 |
+
171 1580
|
1839 |
+
338 411
|
1840 |
+
283 328
|
1841 |
+
1800 965
|
1842 |
+
341 363
|
1843 |
+
261 283
|
1844 |
+
331 625
|
1845 |
+
171 1582
|
1846 |
+
392 770
|
1847 |
+
467 309
|
1848 |
+
313 154
|
1849 |
+
523 399
|
1850 |
+
396 499
|
1851 |
+
150 285
|
1852 |
+
735 278
|
1853 |
+
659 181
|
1854 |
+
270 166
|
1855 |
+
772 260
|
1856 |
+
423 301
|
1857 |
+
259 39
|
1858 |
+
274 726
|
1859 |
+
2110 335
|
1860 |
+
324 449
|
1861 |
+
1322 603
|
1862 |
+
2113 1809
|
1863 |
+
1449 1594
|
1864 |
+
392 262
|
1865 |
+
178 1133
|
1866 |
+
260 294
|
1867 |
+
581 642
|
1868 |
+
299 379
|
1869 |
+
325 587
|
1870 |
+
628 1600
|
1871 |
+
2122 448
|
1872 |
+
319 353
|
1873 |
+
344 1457
|
1874 |
+
467 303
|
1875 |
+
747 615
|
1876 |
+
519 312
|
1877 |
+
1826 635
|
1878 |
+
643 308
|
1879 |
+
1180 1436
|
1880 |
+
1045 379
|
1881 |
+
1468 828
|
1882 |
+
348 438
|
1883 |
+
736 395
|
1884 |
+
44 487
|
1885 |
+
306 183
|
1886 |
+
559 184
|
1887 |
+
966 324
|
1888 |
+
977 613
|
1889 |
+
1005 936
|
1890 |
+
314 512
|
1891 |
+
331 1338
|
1892 |
+
1066 290
|
1893 |
+
700 265
|
1894 |
+
530 308
|
1895 |
+
2146 530
|
1896 |
+
894 262
|
1897 |
+
181 1623
|
1898 |
+
452 1206
|
1899 |
+
2150 363
|
1900 |
+
521 447
|
1901 |
+
479 296
|
1902 |
+
307 274
|
1903 |
+
937 312
|
1904 |
+
156 297
|
1905 |
+
706 333
|
1906 |
+
2157 1864
|
1907 |
+
172 328
|
1908 |
+
523 390
|
1909 |
+
1344 680
|
1910 |
+
656 749
|
1911 |
+
311 1475
|
1912 |
+
1867 715
|
1913 |
+
2164 1869
|
1914 |
+
341 537
|
1915 |
+
133 310
|
1916 |
+
170 363
|
1917 |
+
279 518
|
1918 |
+
406 438
|
1919 |
+
170 1479
|
1920 |
+
467 477
|
1921 |
+
691 1124
|
1922 |
+
365 330
|
1923 |
+
181 381
|
1924 |
+
292 532
|
1925 |
+
1026 1028
|
1926 |
+
1882 634
|
1927 |
+
292 394
|
1928 |
+
702 1884
|
1929 |
+
698 45
|
1930 |
+
348 667
|
1931 |
+
382 707
|
1932 |
+
432 301
|
1933 |
+
284 548
|
1934 |
+
152 381
|
1935 |
+
329 1891
|
1936 |
+
185 396
|
1937 |
+
582 382
|
1938 |
+
461 305
|
1939 |
+
365 1473
|
1940 |
+
261 399
|
1941 |
+
178 609
|
1942 |
+
44 264
|
1943 |
+
916 534
|
1944 |
+
1306 299
|
1945 |
+
279 475
|
1946 |
+
2197 357
|
1947 |
+
1592 630
|
1948 |
+
168 1248
|
1949 |
+
185 447
|
1950 |
+
1362 528
|
1951 |
+
275 333
|
1952 |
+
269 185
|
1953 |
+
371 170
|
1954 |
+
164 1291
|
1955 |
+
271 738
|
1956 |
+
454 371
|
1957 |
+
172 412
|
1958 |
+
899 321
|
1959 |
+
288 150
|
1960 |
+
257 986
|
1961 |
+
370 260
|
1962 |
+
327 164
|
1963 |
+
391 376
|
1964 |
+
175 1913
|
1965 |
+
732 271
|
1966 |
+
798 164
|
1967 |
+
2218 265
|
1968 |
+
425 184
|
1969 |
+
334 151
|
1970 |
+
810 969
|
1971 |
+
570 503
|
1972 |
+
867 970
|
1973 |
+
676 294
|
1974 |
+
1084 319
|
1975 |
+
285 609
|
1976 |
+
458 274
|
1977 |
+
165 1085
|
1978 |
+
1495 1919
|
1979 |
+
397 661
|
1980 |
+
276 410
|
1981 |
+
279 897
|
1982 |
+
424 387
|
1983 |
+
164 284
|
1984 |
+
408 261
|
1985 |
+
361 279
|
1986 |
+
1158 274
|
1987 |
+
134 308
|
1988 |
+
1160 1152
|
1989 |
+
266 773
|
1990 |
+
487 337
|
1991 |
+
287 310
|
1992 |
+
277 176
|
1993 |
+
1038 1925
|
1994 |
+
404 277
|
1995 |
+
137 354
|
1996 |
+
292 584
|
1997 |
+
320 811
|
1998 |
+
277 182
|
1999 |
+
1071 479
|
2000 |
+
156 285
|
2001 |
+
270 386
|
2002 |
+
684 460
|
2003 |
+
1321 640
|
2004 |
+
172 602
|
2005 |
+
143 323
|
2006 |
+
453 499
|
2007 |
+
2258 359
|
2008 |
+
1929 319
|
2009 |
+
1405 1690
|
2010 |
+
1692 352
|
2011 |
+
765 184
|
2012 |
+
554 271
|
2013 |
+
313 167
|
2014 |
+
324 693
|
2015 |
+
294 154
|
2016 |
+
320 707
|
2017 |
+
185 414
|
2018 |
+
411 419
|
2019 |
+
361 1371
|
2020 |
+
264 834
|
2021 |
+
404 633
|
2022 |
+
352 808
|
2023 |
+
977 384
|
2024 |
+
398 401
|
2025 |
+
1162 264
|
2026 |
+
2277 402
|
2027 |
+
2278 1688
|
2028 |
+
304 576
|
2029 |
+
361 1516
|
2030 |
+
276 156
|
2031 |
+
338 261
|
2032 |
+
325 1163
|
2033 |
+
1093 295
|
2034 |
+
311 1517
|
2035 |
+
318 505
|
2036 |
+
388 427
|
2037 |
+
292 753
|
2038 |
+
384 277
|
2039 |
+
665 299
|
2040 |
+
393 666
|
2041 |
+
301 325
|
2042 |
+
185 362
|
2043 |
+
705 298
|
2044 |
+
426 166
|
2045 |
+
353 359
|
2046 |
+
772 812
|
2047 |
+
277 476
|
2048 |
+
327 1709
|
2049 |
+
184 1711
|
2050 |
+
390 383
|
2051 |
+
800 1378
|
2052 |
+
321 404
|
2053 |
+
650 274
|
2054 |
+
450 396
|
2055 |
+
182 1528
|
2056 |
+
2307 384
|
2057 |
+
450 359
|
2058 |
+
257 905
|
2059 |
+
504 286
|
2060 |
+
403 664
|
2061 |
+
582 400
|
2062 |
+
159 1511
|
2063 |
+
650 283
|
2064 |
+
620 924
|
2065 |
+
2316 739
|
2066 |
+
488 300
|
2067 |
+
292 963
|
2068 |
+
2319 1303
|
2069 |
+
325 366
|
2070 |
+
339 933
|
2071 |
+
601 353
|
2072 |
+
564 422
|
2073 |
+
159 359
|
2074 |
+
151 1641
|
2075 |
+
32 1205
|
2076 |
+
2327 992
|
2077 |
+
32 1099
|
2078 |
+
10 10
|
2079 |
+
298 290
|
2080 |
+
397 859
|
2081 |
+
414 345
|
2082 |
+
602 260
|
2083 |
+
176 696
|
2084 |
+
338 715
|
2085 |
+
379 285
|
2086 |
+
451 261
|
2087 |
+
815 1065
|
2088 |
+
154 357
|
2089 |
+
270 168
|
2090 |
+
815 460
|
2091 |
+
329 347
|
2092 |
+
325 1275
|
2093 |
+
504 1535
|
2094 |
+
813 536
|
2095 |
+
314 46
|
2096 |
+
335 156
|
2097 |
+
429 1002
|
2098 |
+
265 417
|
2099 |
+
681 1065
|
2100 |
+
1980 273
|
2101 |
+
45 325
|
2102 |
+
133 1269
|
2103 |
+
170 396
|
2104 |
+
331 381
|
2105 |
+
379 286
|
2106 |
+
1263 783
|
2107 |
+
2358 355
|
2108 |
+
314 773
|
2109 |
+
298 953
|
2110 |
+
277 570
|
2111 |
+
1725 295
|
2112 |
+
279 341
|
2113 |
+
2364 304
|
2114 |
+
1989 593
|
2115 |
+
701 136
|
2116 |
+
1302 307
|
2117 |
+
736 376
|
2118 |
+
325 1169
|
2119 |
+
173 729
|
2120 |
+
175 291
|
2121 |
+
554 277
|
2122 |
+
647 1202
|
2123 |
+
762 1035
|
2124 |
+
1499 617
|
2125 |
+
338 330
|
2126 |
+
718 1533
|
2127 |
+
2378 273
|
2128 |
+
133 493
|
2129 |
+
331 617
|
2130 |
+
151 586
|
2131 |
+
795 699
|
2132 |
+
174 1669
|
2133 |
+
264 1221
|
2134 |
+
465 264
|
2135 |
+
165 1001
|
2136 |
+
1205 1541
|
2137 |
+
812 581
|
2138 |
+
330 357
|
2139 |
+
510 615
|
2140 |
+
133 480
|
2141 |
+
267 138
|
2142 |
+
698 273
|
2143 |
+
134 283
|
2144 |
+
362 571
|
2145 |
+
261 273
|
2146 |
+
338 280
|
2147 |
+
932 429
|
2148 |
+
284 862
|
2149 |
+
835 979
|
2150 |
+
322 166
|
2151 |
+
1391 566
|
2152 |
+
1426 858
|
2153 |
+
556 284
|
2154 |
+
174 1498
|
2155 |
+
258 157
|
2156 |
+
168 506
|
2157 |
+
574 329
|
2158 |
+
709 273
|
2159 |
+
304 481
|
2160 |
+
170 429
|
2161 |
+
370 478
|
2162 |
+
790 1268
|
2163 |
+
338 283
|
2164 |
+
327 173
|
2165 |
+
167 560
|
2166 |
+
436 855
|
2167 |
+
257 723
|
2168 |
+
980 604
|
2169 |
+
385 1394
|
2170 |
+
150 572
|
2171 |
+
341 276
|
2172 |
+
403 166
|
2173 |
+
758 868
|
2174 |
+
367 419
|
2175 |
+
601 721
|
2176 |
+
510 1729
|
2177 |
+
170 725
|
2178 |
+
702 1720
|
2179 |
+
2430 744
|
2180 |
+
444 283
|
2181 |
+
262 393
|
2182 |
+
741 32
|
2183 |
+
1005 1476
|
2184 |
+
948 371
|
2185 |
+
691 336
|
2186 |
+
504 2014
|
2187 |
+
361 384
|
2188 |
+
2439 490
|
2189 |
+
1466 419
|
2190 |
+
436 869
|
2191 |
+
1355 358
|
2192 |
+
536 314
|
2193 |
+
915 1730
|
2194 |
+
1532 662
|
2195 |
+
536 292
|
2196 |
+
2023 371
|
2197 |
+
1101 2025
|
2198 |
+
390 395
|
2199 |
+
2026 838
|
2200 |
+
294 1752
|
2201 |
+
582 699
|
2202 |
+
756 1756
|
2203 |
+
541 369
|
2204 |
+
154 1284
|
2205 |
+
272 1403
|
2206 |
+
452 463
|
2207 |
+
2458 396
|
2208 |
+
585 1404
|
2209 |
+
399 362
|
2210 |
+
372 2035
|
2211 |
+
277 367
|
2212 |
+
1558 1406
|
2213 |
+
361 259
|
2214 |
+
391 273
|
2215 |
+
350 1182
|
2216 |
+
304 319
|
2217 |
+
524 1107
|
2218 |
+
689 409
|
2219 |
+
281 337
|
2220 |
+
1761 1183
|
2221 |
+
328 335
|
2222 |
+
311 477
|
2223 |
+
303 273
|
2224 |
+
2045 285
|
2225 |
+
1185 1411
|
2226 |
+
1110 419
|
2227 |
+
292 552
|
2228 |
+
2479 1294
|
2229 |
+
381 332
|
2230 |
+
361 390
|
2231 |
+
761 382
|
2232 |
+
135 1768
|
2233 |
+
399 1004
|
2234 |
+
339 620
|
2235 |
+
322 150
|
2236 |
+
294 367
|
2237 |
+
493 273
|
2238 |
+
150 959
|
2239 |
+
1112 919
|
2240 |
+
544 299
|
2241 |
+
271 173
|
2242 |
+
1773 728
|
2243 |
+
277 686
|
2244 |
+
960 363
|
2245 |
+
635 317
|
2246 |
+
473 730
|
2247 |
+
174 317
|
2248 |
+
284 280
|
2249 |
+
1779 1425
|
2250 |
+
2501 299
|
2251 |
+
2502 399
|
2252 |
+
2503 284
|
2253 |
+
1194 484
|
2254 |
+
406 1780
|
2255 |
+
1196 302
|
2256 |
+
307 2064
|
2257 |
+
2508 359
|
2258 |
+
172 607
|
2259 |
+
745 491
|
2260 |
+
472 609
|
2261 |
+
322 367
|
2262 |
+
1783 285
|
2263 |
+
292 848
|
2264 |
+
294 1200
|
2265 |
+
961 285
|
2266 |
+
284 655
|
2267 |
+
501 602
|
2268 |
+
2519 332
|
2269 |
+
957 396
|
2270 |
+
436 280
|
2271 |
+
318 396
|
2272 |
+
311 842
|
2273 |
+
2524 764
|
2274 |
+
965 1202
|
2275 |
+
1112 560
|
2276 |
+
298 371
|
2277 |
+
1311 445
|
2278 |
+
732 460
|
2279 |
+
1281 381
|
2280 |
+
925 449
|
2281 |
+
614 1774
|
2282 |
+
138 303
|
2283 |
+
184 354
|
2284 |
+
1793 307
|
2285 |
+
267 160
|
2286 |
+
450 405
|
2287 |
+
2538 819
|
2288 |
+
802 1115
|
2289 |
+
356 657
|
2290 |
+
569 315
|
2291 |
+
328 1436
|
2292 |
+
557 596
|
2293 |
+
286 614
|
2294 |
+
310 164
|
2295 |
+
398 768
|
2296 |
+
337 302
|
2297 |
+
1578 284
|
2298 |
+
274 571
|
2299 |
+
175 1124
|
2300 |
+
277 800
|
2301 |
+
1061 1062
|
2302 |
+
2091 369
|
2303 |
+
259 413
|
2304 |
+
322 386
|
2305 |
+
1799 2092
|
2306 |
+
325 342
|
2307 |
+
1581 416
|
2308 |
+
524 2094
|
2309 |
+
494 801
|
2310 |
+
288 165
|
2311 |
+
2097 340
|
2312 |
+
334 970
|
2313 |
+
677 713
|
2314 |
+
379 329
|
2315 |
+
348 357
|
2316 |
+
930 1571
|
2317 |
+
321 367
|
2318 |
+
1805 962
|
2319 |
+
391 310
|
2320 |
+
259 391
|
2321 |
+
915 789
|
2322 |
+
524 1806
|
2323 |
+
350 353
|
2324 |
+
1111 273
|
2325 |
+
501 874
|
2326 |
+
1589 362
|
2327 |
+
2578 359
|
2328 |
+
44 377
|
2329 |
+
425 164
|
2330 |
+
791 369
|
2331 |
+
168 1593
|
2332 |
+
339 571
|
2333 |
+
181 2114
|
2334 |
+
1447 315
|
2335 |
+
1448 647
|
2336 |
+
2115 1067
|
2337 |
+
2588 1450
|
2338 |
+
257 1325
|
2339 |
+
1047 1326
|
2340 |
+
270 150
|
2341 |
+
318 542
|
2342 |
+
424 161
|
2343 |
+
1812 1327
|
2344 |
+
269 378
|
2345 |
+
184 447
|
2346 |
+
754 302
|
2347 |
+
360 1817
|
2348 |
+
1599 953
|
2349 |
+
2600 1818
|
2350 |
+
292 447
|
2351 |
+
521 354
|
2352 |
+
1827 274
|
2353 |
+
976 1310
|
2354 |
+
325 1828
|
2355 |
+
517 466
|
2356 |
+
1461 297
|
2357 |
+
288 157
|
2358 |
+
289 806
|
2359 |
+
168 279
|
2360 |
+
678 704
|
2361 |
+
1332 630
|
2362 |
+
526 1217
|
2363 |
+
1608 757
|
2364 |
+
892 357
|
2365 |
+
2133 528
|
2366 |
+
561 280
|
2367 |
+
528 278
|
2368 |
+
292 581
|
2369 |
+
1143 278
|
2370 |
+
918 260
|
2371 |
+
314 521
|
2372 |
+
1305 1618
|
2373 |
+
928 367
|
2374 |
+
601 503
|
2375 |
+
313 173
|
2376 |
+
351 1847
|
2377 |
+
667 268
|
2378 |
+
2629 289
|
2379 |
+
2630 1076
|
2380 |
+
649 557
|
2381 |
+
386 133
|
2382 |
+
455 286
|
2383 |
+
754 1852
|
2384 |
+
1045 2144
|
2385 |
+
408 505
|
2386 |
+
2637 304
|
2387 |
+
312 334
|
2388 |
+
311 368
|
2389 |
+
138 641
|
2390 |
+
2641 1754
|
2391 |
+
519 1000
|
2392 |
+
550 616
|
2393 |
+
491 387
|
2394 |
+
151 2147
|
2395 |
+
1230 914
|
2396 |
+
1854 174
|
2397 |
+
1465 1310
|
2398 |
+
360 260
|
2399 |
+
2151 377
|
2400 |
+
133 309
|
2401 |
+
598 1066
|
2402 |
+
2653 394
|
2403 |
+
181 297
|
2404 |
+
164 717
|
2405 |
+
368 292
|
2406 |
+
912 1121
|
2407 |
+
385 1863
|
2408 |
+
2659 1629
|
2409 |
+
275 634
|
2410 |
+
518 271
|
2411 |
+
1825 1134
|
2412 |
+
270 468
|
2413 |
+
284 715
|
2414 |
+
288 171
|
2415 |
+
1079 1632
|
2416 |
+
268 171
|
2417 |
+
413 307
|
2418 |
+
2669 939
|
2419 |
+
294 1759
|
2420 |
+
681 1016
|
2421 |
+
320 688
|
2422 |
+
261 724
|
2423 |
+
431 274
|
2424 |
+
658 593
|
2425 |
+
445 171
|
2426 |
+
361 1410
|
2427 |
+
264 416
|
2428 |
+
178 1635
|
2429 |
+
314 666
|
2430 |
+
555 339
|
2431 |
+
438 751
|
2432 |
+
377 272
|
2433 |
+
291 611
|
2434 |
+
2685 265
|
2435 |
+
271 1195
|
2436 |
+
360 1635
|
2437 |
+
262 414
|
2438 |
+
345 717
|
2439 |
+
513 361
|
2440 |
+
1024 291
|
2441 |
+
1602 592
|
2442 |
+
462 1148
|
2443 |
+
1877 371
|
2444 |
+
137 383
|
2445 |
+
292 539
|
2446 |
+
2175 1239
|
2447 |
+
608 447
|
2448 |
+
335 154
|
2449 |
+
292 560
|
2450 |
+
330 265
|
2451 |
+
172 658
|
2452 |
+
2703 1881
|
2453 |
+
2704 2178
|
2454 |
+
1022 379
|
2455 |
+
1599 486
|
2456 |
+
2707 454
|
2457 |
+
382 521
|
2458 |
+
329 1242
|
2459 |
+
1642 1080
|
2460 |
+
2181 354
|
2461 |
+
2712 2182
|
2462 |
+
1439 610
|
2463 |
+
317 401
|
2464 |
+
962 305
|
2465 |
+
287 785
|
2466 |
+
2717 368
|
2467 |
+
261 623
|
2468 |
+
1886 276
|
2469 |
+
345 859
|
2470 |
+
531 458
|
2471 |
+
302 1634
|
2472 |
+
178 535
|
2473 |
+
168 477
|
2474 |
+
1054 291
|
2475 |
+
349 632
|
2476 |
+
863 274
|
2477 |
+
485 363
|
2478 |
+
2729 1352
|
2479 |
+
1345 324
|
2480 |
+
133 1027
|
2481 |
+
438 166
|
2482 |
+
424 738
|
2483 |
+
553 886
|
2484 |
+
2735 1652
|
2485 |
+
653 1874
|
2486 |
+
324 425
|
2487 |
+
423 659
|
2488 |
+
507 271
|
2489 |
+
1892 274
|
2490 |
+
273 933
|
2491 |
+
2742 391
|
2492 |
+
2743 469
|
2493 |
+
269 163
|
2494 |
+
492 688
|
2495 |
+
984 476
|
2496 |
+
329 1441
|
2497 |
+
610 273
|
2498 |
+
548 453
|
2499 |
+
154 284
|
2500 |
+
262 525
|
2501 |
+
181 719
|
2502 |
+
315 274
|
2503 |
+
2754 265
|
2504 |
+
313 637
|
2505 |
+
292 518
|
2506 |
+
172 1900
|
2507 |
+
926 985
|
2508 |
+
334 134
|
2509 |
+
298 286
|
2510 |
+
1655 862
|
2511 |
+
1179 924
|
2512 |
+
1190 283
|
2513 |
+
320 521
|
2514 |
+
361 452
|
2515 |
+
2766 299
|
2516 |
+
503 745
|
2517 |
+
1906 593
|
2518 |
+
495 322
|
2519 |
+
918 784
|
2520 |
+
388 308
|
2521 |
+
864 279
|
2522 |
+
280 704
|
2523 |
+
484 529
|
2524 |
+
1637 387
|
2525 |
+
337 491
|
2526 |
+
304 504
|
2527 |
+
2778 357
|
2528 |
+
1801 630
|
2529 |
+
603 581
|
2530 |
+
725 284
|
2531 |
+
789 1256
|
2532 |
+
438 1062
|
2533 |
+
343 713
|
2534 |
+
134 340
|
2535 |
+
272 631
|
2536 |
+
585 184
|
2537 |
+
134 285
|
2538 |
+
1218 464
|
2539 |
+
467 261
|
2540 |
+
300 1490
|
2541 |
+
1917 445
|
2542 |
+
792 557
|
2543 |
+
523 285
|
2544 |
+
524 274
|
2545 |
+
908 315
|
2546 |
+
261 366
|
2547 |
+
271 143
|
2548 |
+
531 317
|
2549 |
+
512 319
|
2550 |
+
262 39
|
2551 |
+
262 568
|
2552 |
+
165 259
|
2553 |
+
1316 807
|
2554 |
+
151 841
|
2555 |
+
272 652
|
2556 |
+
1797 1674
|
2557 |
+
1499 1675
|
2558 |
+
354 262
|
2559 |
+
44 462
|
2560 |
+
450 291
|
2561 |
+
277 135
|
2562 |
+
361 328
|
2563 |
+
272 565
|
2564 |
+
2815 286
|
2565 |
+
342 166
|
2566 |
+
1676 528
|
2567 |
+
2239 877
|
2568 |
+
537 300
|
2569 |
+
344 713
|
2570 |
+
284 379
|
2571 |
+
519 1238
|
2572 |
+
305 184
|
2573 |
+
1437 280
|
2574 |
+
402 280
|
2575 |
+
1872 1136
|
2576 |
+
259 860
|
2577 |
+
261 280
|
2578 |
+
924 531
|
2579 |
+
185 1680
|
2580 |
+
2245 847
|
2581 |
+
385 1889
|
2582 |
+
2833 363
|
2583 |
+
154 307
|
2584 |
+
878 1027
|
2585 |
+
164 801
|
2586 |
+
311 1248
|
2587 |
+
776 707
|
2588 |
+
1128 389
|
2589 |
+
349 566
|
2590 |
+
527 353
|
2591 |
+
598 355
|
2592 |
+
906 278
|
2593 |
+
852 818
|
2594 |
+
461 570
|
2595 |
+
2252 330
|
2596 |
+
765 1682
|
2597 |
+
325 752
|
2598 |
+
151 458
|
2599 |
+
380 719
|
2600 |
+
900 281
|
2601 |
+
893 1080
|
2602 |
+
763 1770
|
2603 |
+
308 335
|
2604 |
+
1685 328
|
2605 |
+
259 568
|
2606 |
+
493 272
|
2607 |
+
479 521
|
2608 |
+
133 274
|
2609 |
+
2136 1933
|
2610 |
+
419 276
|
2611 |
+
1090 387
|
2612 |
+
1334 278
|
2613 |
+
592 261
|
2614 |
+
307 319
|
2615 |
+
1364 290
|
2616 |
+
1581 541
|
2617 |
+
334 170
|
2618 |
+
1510 279
|
2619 |
+
1115 321
|
2620 |
+
265 1901
|
2621 |
+
467 1207
|
2622 |
+
1226 46
|
2623 |
+
166 297
|
2624 |
+
324 588
|
2625 |
+
802 624
|
2626 |
+
891 2203
|
2627 |
+
2878 1020
|
2628 |
+
2180 1354
|
2629 |
+
380 1912
|
2630 |
+
423 512
|
2631 |
+
349 1236
|
2632 |
+
756 972
|
2633 |
+
797 2272
|
2634 |
+
426 1512
|
2635 |
+
1876 264
|
2636 |
+
2887 439
|
2637 |
+
2888 303
|
2638 |
+
32 50
|
2639 |
+
260 641
|
2640 |
+
285 1133
|
2641 |
+
462 280
|
2642 |
+
277 178
|
2643 |
+
863 1698
|
2644 |
+
1945 614
|
2645 |
+
2896 298
|
2646 |
+
184 539
|
2647 |
+
151 287
|
2648 |
+
161 374
|
2649 |
+
360 642
|
2650 |
+
292 1222
|
2651 |
+
841 354
|
2652 |
+
339 345
|
2653 |
+
353 312
|
2654 |
+
10 274
|
2655 |
+
340 399
|
2656 |
+
1024 302
|
2657 |
+
2167 378
|
2658 |
+
795 368
|
2659 |
+
271 1702
|
2660 |
+
2911 640
|
2661 |
+
348 1092
|
2662 |
+
1370 369
|
2663 |
+
184 944
|
2664 |
+
1376 134
|
2665 |
+
855 373
|
2666 |
+
283 599
|
2667 |
+
32 51
|
2668 |
+
747 1956
|
2669 |
+
451 283
|
2670 |
+
314 375
|
2671 |
+
507 349
|
2672 |
+
443 172
|
2673 |
+
452 369
|
2674 |
+
172 1365
|
2675 |
+
271 182
|
2676 |
+
259 46
|
2677 |
+
370 384
|
2678 |
+
259 622
|
2679 |
+
770 178
|
2680 |
+
1165 264
|
2681 |
+
1957 1958
|
2682 |
+
788 378
|
2683 |
+
323 1705
|
2684 |
+
2935 291
|
2685 |
+
282 184
|
2686 |
+
1109 968
|
2687 |
+
302 278
|
2688 |
+
518 1962
|
2689 |
+
577 1525
|
2690 |
+
300 1963
|
2691 |
+
1842 1713
|
2692 |
+
403 156
|
2693 |
+
144 1629
|
2694 |
+
172 1966
|
2695 |
+
1098 161
|
2696 |
+
2947 791
|
2697 |
+
2948 2309
|
2698 |
+
2949 602
|
2699 |
+
2310 302
|
2700 |
+
2951 2257
|
2701 |
+
2952 938
|
2702 |
+
561 417
|
2703 |
+
980 389
|
2704 |
+
1952 2311
|
2705 |
+
2956 527
|
2706 |
+
2957 261
|
2707 |
+
665 259
|
2708 |
+
431 330
|
2709 |
+
324 621
|
2710 |
+
155 353
|
2711 |
+
704 304
|
2712 |
+
684 349
|
2713 |
+
184 1964
|
2714 |
+
324 949
|
2715 |
+
360 541
|
2716 |
+
393 325
|
2717 |
+
259 435
|
2718 |
+
1154 968
|
2719 |
+
325 383
|
2720 |
+
333 284
|
2721 |
+
159 1337
|
2722 |
+
2973 286
|
2723 |
+
2974 2320
|
2724 |
+
2975 635
|
2725 |
+
813 470
|
2726 |
+
311 517
|
2727 |
+
1034 517
|
2728 |
+
470 264
|
2729 |
+
398 1714
|
2730 |
+
320 685
|
2731 |
+
10 340
|
2732 |
+
2983 299
|
2733 |
+
2984 1841
|
2734 |
+
1212 448
|
2735 |
+
172 283
|
2736 |
+
544 438
|
2737 |
+
277 173
|
2738 |
+
284 1973
|
2739 |
+
275 1077
|
2740 |
+
429 32
|
2741 |
+
1965 2329
|
2742 |
+
339 396
|
2743 |
+
1532 498
|
2744 |
+
861 184
|
2745 |
+
2335 1976
|
2746 |
+
1786 379
|
2747 |
+
423 618
|
2748 |
+
1442 321
|
2749 |
+
1349 448
|
2750 |
+
291 1631
|
2751 |
+
1260 283
|
2752 |
+
314 422
|
2753 |
+
337 525
|
2754 |
+
371 134
|
2755 |
+
370 574
|
2756 |
+
171 275
|
2757 |
+
782 687
|
2758 |
+
381 274
|
2759 |
+
345 368
|
2760 |
+
337 425
|
2761 |
+
1721 680
|
2762 |
+
709 1162
|
2763 |
+
727 273
|
2764 |
+
1468 261
|
2765 |
+
1385 321
|
2766 |
+
173 1377
|
2767 |
+
3018 476
|
2768 |
+
299 284
|
2769 |
+
161 1535
|
2770 |
+
448 682
|
2771 |
+
184 323
|
2772 |
+
1678 1538
|
2773 |
+
375 512
|
2774 |
+
482 591
|
2775 |
+
390 340
|
2776 |
+
1562 465
|
2777 |
+
551 477
|
2778 |
+
761 430
|
2779 |
+
781 1189
|
2780 |
+
323 335
|
2781 |
+
398 304
|
2782 |
+
392 826
|
2783 |
+
1033 256
|
2784 |
+
1054 668
|
2785 |
+
3036 476
|
2786 |
+
1985 2357
|
2787 |
+
377 285
|
2788 |
+
303 383
|
2789 |
+
270 955
|
2790 |
+
509 380
|
2791 |
+
703 386
|
2792 |
+
495 301
|
2793 |
+
181 336
|
2794 |
+
1399 2363
|
2795 |
+
324 529
|
2796 |
+
724 651
|
2797 |
+
1331 393
|
2798 |
+
350 1110
|
2799 |
+
1540 273
|
2800 |
+
350 286
|
2801 |
+
3052 938
|
2802 |
+
350 936
|
2803 |
+
494 2368
|
2804 |
+
160 454
|
2805 |
+
2369 2083
|
2806 |
+
3057 285
|
2807 |
+
311 379
|
2808 |
+
507 1058
|
2809 |
+
1170 658
|
2810 |
+
3061 419
|
2811 |
+
297 295
|
2812 |
+
391 299
|
2813 |
+
621 793
|
2814 |
+
667 810
|
2815 |
+
2372 282
|
2816 |
+
429 648
|
2817 |
+
708 321
|
2818 |
+
892 906
|
2819 |
+
559 426
|
2820 |
+
264 1152
|
2821 |
+
714 1035
|
2822 |
+
361 381
|
2823 |
+
45 341
|
2824 |
+
360 416
|
2825 |
+
718 296
|
2826 |
+
403 436
|
2827 |
+
361 538
|
2828 |
+
496 161
|
2829 |
+
360 1133
|
2830 |
+
1998 542
|
2831 |
+
1953 279
|
2832 |
+
39 321
|
2833 |
+
973 2042
|
2834 |
+
348 299
|
2835 |
+
3086 593
|
2836 |
+
338 284
|
2837 |
+
1732 922
|
2838 |
+
302 173
|
2839 |
+
408 1733
|
2840 |
+
665 1046
|
2841 |
+
133 857
|
2842 |
+
184 791
|
2843 |
+
256 1141
|
2844 |
+
314 1224
|
2845 |
+
2371 869
|
2846 |
+
409 265
|
2847 |
+
338 917
|
2848 |
+
398 287
|
2849 |
+
2389 1735
|
2850 |
+
3101 1607
|
2851 |
+
292 2390
|
2852 |
+
403 851
|
2853 |
+
168 1542
|
2854 |
+
345 381
|
2855 |
+
351 439
|
2856 |
+
3107 274
|
2857 |
+
276 671
|
2858 |
+
184 349
|
2859 |
+
467 411
|
2860 |
+
3111 646
|
2861 |
+
488 2006
|
2862 |
+
382 811
|
2863 |
+
1379 322
|
2864 |
+
415 1104
|
2865 |
+
667 616
|
2866 |
+
576 278
|
2867 |
+
426 803
|
2868 |
+
1738 1258
|
2869 |
+
288 2394
|
2870 |
+
608 323
|
2871 |
+
1067 949
|
2872 |
+
2404 1195
|
2873 |
+
438 2406
|
2874 |
+
370 885
|
2875 |
+
284 1027
|
2876 |
+
705 1012
|
2877 |
+
269 172
|
2878 |
+
482 1219
|
2879 |
+
1055 2409
|
2880 |
+
381 285
|
2881 |
+
387 899
|
2882 |
+
1259 1072
|
2883 |
+
302 751
|
2884 |
+
151 1494
|
2885 |
+
171 417
|
2886 |
+
681 670
|
2887 |
+
404 1940
|
2888 |
+
699 676
|
2889 |
+
825 509
|
2890 |
+
178 395
|
2891 |
+
387 814
|
2892 |
+
308 1975
|
2893 |
+
470 592
|
2894 |
+
307 1824
|
2895 |
+
166 1388
|
2896 |
+
160 680
|
2897 |
+
306 1741
|
2898 |
+
1251 703
|
2899 |
+
329 297
|
2900 |
+
3151 152
|
2901 |
+
3152 435
|
2902 |
+
1575 565
|
2903 |
+
166 1242
|
2904 |
+
298 1242
|
2905 |
+
724 2396
|
2906 |
+
1543 321
|
2907 |
+
920 389
|
2908 |
+
454 463
|
2909 |
+
320 509
|
2910 |
+
430 640
|
2911 |
+
133 572
|
2912 |
+
741 370
|
2913 |
+
417 2410
|
2914 |
+
1548 658
|
2915 |
+
292 1177
|
2916 |
+
161 261
|
2917 |
+
438 305
|
2918 |
+
403 178
|
2919 |
+
339 1157
|
2920 |
+
3171 1009
|
2921 |
+
3172 266
|
2922 |
+
274 261
|
2923 |
+
261 342
|
2924 |
+
436 260
|
2925 |
+
344 867
|
2926 |
+
257 1521
|
2927 |
+
493 431
|
2928 |
+
3179 340
|
2929 |
+
644 843
|
2930 |
+
3181 357
|
2931 |
+
2235 571
|
2932 |
+
436 400
|
2933 |
+
259 870
|
2934 |
+
350 696
|
2935 |
+
314 870
|
2936 |
+
382 393
|
2937 |
+
866 1724
|
2938 |
+
1744 172
|
2939 |
+
3190 1927
|
2940 |
+
345 2306
|
2941 |
+
920 2016
|
2942 |
+
260 301
|
2943 |
+
1138 414
|
2944 |
+
339 599
|
2945 |
+
353 1096
|
2946 |
+
993 2366
|
2947 |
+
292 875
|
2948 |
+
1050 792
|
2949 |
+
408 396
|
2950 |
+
1138 1538
|
2951 |
+
2438 2440
|
2952 |
+
1540 395
|
2953 |
+
135 634
|
2954 |
+
3205 283
|
2955 |
+
3206 1078
|
2956 |
+
814 1261
|
2957 |
+
172 1396
|
2958 |
+
504 994
|
2959 |
+
644 1266
|
2960 |
+
2431 1561
|
2961 |
+
3212 378
|
2962 |
+
645 301
|
2963 |
+
1378 1389
|
2964 |
+
264 262
|
2965 |
+
274 394
|
2966 |
+
32 524
|
2967 |
+
1731 1268
|
2968 |
+
423 945
|
2969 |
+
944 2286
|
2970 |
+
795 477
|
2971 |
+
1605 847
|
2972 |
+
1387 750
|
2973 |
+
376 1816
|
2974 |
+
639 682
|
2975 |
+
864 794
|
2976 |
+
3227 260
|
2977 |
+
1037 32
|
2978 |
+
360 330
|
2979 |
+
430 856
|
2980 |
+
32 2019
|
2981 |
+
742 1549
|
2982 |
+
318 620
|
2983 |
+
594 837
|
2984 |
+
3235 363
|
2985 |
+
3236 906
|
2986 |
+
995 1549
|
2987 |
+
1749 294
|
2988 |
+
161 1552
|
2989 |
+
408 2450
|
2990 |
+
871 950
|
2991 |
+
275 341
|
2992 |
+
3243 505
|
2993 |
+
3244 285
|
2994 |
+
2028 1753
|
2995 |
+
173 1754
|
2996 |
+
840 170
|
2997 |
+
951 309
|
2998 |
+
3249 2455
|
2999 |
+
908 909
|
3000 |
+
1402 557
|
3001 |
+
337 577
|
3002 |
+
2030 1757
|
3003 |
+
361 2031
|
3004 |
+
3255 953
|
3005 |
+
370 400
|
3006 |
+
280 290
|
3007 |
+
330 2459
|
3008 |
+
260 409
|
3009 |
+
303 333
|
3010 |
+
633 584
|
3011 |
+
181 633
|
3012 |
+
171 1179
|
3013 |
+
3264 314
|
3014 |
+
3265 298
|
3015 |
+
1105 1287
|
3016 |
+
3267 2462
|
3017 |
+
3268 304
|
3018 |
+
307 758
|
3019 |
+
269 188
|
3020 |
+
3271 309
|
3021 |
+
529 164
|
3022 |
+
530 953
|
3023 |
+
399 390
|
3024 |
+
3275 285
|
3025 |
+
322 182
|
3026 |
+
639 539
|
3027 |
+
1405 372
|
3028 |
+
181 1040
|
3029 |
+
340 417
|
3030 |
+
2041 471
|
3031 |
+
458 323
|
3032 |
+
3283 458
|
3033 |
+
3284 1557
|
3034 |
+
139 631
|
3035 |
+
3286 2464
|
3036 |
+
41 622
|
3037 |
+
2467 292
|
3038 |
+
277 2043
|
3039 |
+
3290 400
|
3040 |
+
344 2470
|
3041 |
+
1041 279
|
3042 |
+
312 666
|
3043 |
+
468 2473
|
3044 |
+
174 1410
|
3045 |
+
543 283
|
3046 |
+
3297 268
|
3047 |
+
3298 410
|
3048 |
+
1412 318
|
3049 |
+
304 703
|
3050 |
+
956 184
|
3051 |
+
165 1046
|
3052 |
+
350 363
|
3053 |
+
39 292
|
3054 |
+
2480 273
|
3055 |
+
1104 2481
|
3056 |
+
3307 359
|
3057 |
+
337 557
|
3058 |
+
2051 302
|
3059 |
+
379 274
|
3060 |
+
1562 525
|
3061 |
+
271 155
|
3062 |
+
541 1295
|
3063 |
+
259 41
|
3064 |
+
3315 292
|
3065 |
+
334 698
|
3066 |
+
957 2485
|
3067 |
+
1190 285
|
3068 |
+
1417 347
|
3069 |
+
1770 561
|
3070 |
+
3321 1768
|
3071 |
+
478 305
|
3072 |
+
294 1411
|
3073 |
+
261 363
|
3074 |
+
1298 279
|
3075 |
+
3326 2491
|
3076 |
+
3327 490
|
3077 |
+
3328 879
|
3078 |
+
3329 1005
|
3079 |
+
3330 842
|
3080 |
+
3331 2492
|
3081 |
+
3332 2057
|
3082 |
+
3333 300
|
3083 |
+
3334 1772
|
3084 |
+
3335 135
|
3085 |
+
3336 1420
|
3086 |
+
3337 2058
|
3087 |
+
3338 490
|
3088 |
+
1048 328
|
3089 |
+
424 595
|
3090 |
+
1301 376
|
3091 |
+
507 1193
|
3092 |
+
671 449
|
3093 |
+
690 1422
|
3094 |
+
3345 371
|
3095 |
+
432 281
|
3096 |
+
291 589
|
3097 |
+
327 162
|
3098 |
+
1564 541
|
3099 |
+
3350 729
|
3100 |
+
557 1117
|
3101 |
+
335 378
|
3102 |
+
292 1305
|
3103 |
+
582 1008
|
3104 |
+
1777 182
|
3105 |
+
437 1567
|
3106 |
+
184 1177
|
3107 |
+
824 608
|
3108 |
+
2506 907
|
3109 |
+
1782 461
|
3110 |
+
747 1570
|
3111 |
+
885 1309
|
3112 |
+
461 638
|
3113 |
+
3364 881
|
3114 |
+
166 376
|
3115 |
+
964 184
|
3116 |
+
785 1120
|
3117 |
+
601 479
|
3118 |
+
2520 576
|
3119 |
+
300 425
|
3120 |
+
1428 1009
|
3121 |
+
632 315
|
3122 |
+
385 580
|
3123 |
+
172 643
|
3124 |
+
3375 396
|
3125 |
+
519 1121
|
3126 |
+
388 359
|
3127 |
+
1564 355
|
3128 |
+
313 147
|
3129 |
+
2526 2527
|
3130 |
+
1791 298
|
3131 |
+
1192 261
|
3132 |
+
1434 1792
|
3133 |
+
1572 559
|
3134 |
+
3385 1314
|
3135 |
+
463 399
|
3136 |
+
3387 452
|
3137 |
+
1123 1057
|
3138 |
+
2496 1315
|
3139 |
+
908 425
|
3140 |
+
2077 388
|
3141 |
+
321 678
|
3142 |
+
438 554
|
3143 |
+
2534 1434
|
3144 |
+
45 340
|
3145 |
+
275 280
|
3146 |
+
318 1011
|
3147 |
+
723 155
|
3148 |
+
333 277
|
3149 |
+
678 2079
|
3150 |
+
3401 750
|
3151 |
+
176 2081
|
3152 |
+
276 182
|
3153 |
+
3404 841
|
3154 |
+
347 309
|
3155 |
+
150 526
|
3156 |
+
3407 954
|
3157 |
+
1575 2539
|
3158 |
+
1316 2082
|
3159 |
+
285 733
|
3160 |
+
264 362
|
3161 |
+
308 328
|
3162 |
+
266 261
|
3163 |
+
3414 341
|
3164 |
+
291 2029
|
3165 |
+
850 330
|
3166 |
+
1576 265
|
3167 |
+
156 287
|
3168 |
+
884 350
|
3169 |
+
372 376
|
3170 |
+
3421 2549
|
3171 |
+
3422 966
|
3172 |
+
3423 2550
|
3173 |
+
3424 451
|
3174 |
+
3425 680
|
3175 |
+
1579 271
|
3176 |
+
594 284
|
3177 |
+
568 462
|
3178 |
+
516 305
|
3179 |
+
273 262
|
3180 |
+
2553 296
|
3181 |
+
2090 2554
|
3182 |
+
1286 638
|
3183 |
+
268 150
|
3184 |
+
350 623
|
3185 |
+
531 261
|
3186 |
+
371 2093
|
3187 |
+
284 967
|
3188 |
+
172 357
|
3189 |
+
886 437
|
3190 |
+
1295 2096
|
3191 |
+
3442 787
|
3192 |
+
1439 2561
|
3193 |
+
260 322
|
3194 |
+
385 283
|
3195 |
+
2563 323
|
3196 |
+
3447 658
|
3197 |
+
1051 363
|
3198 |
+
3449 910
|
3199 |
+
1301 1209
|
3200 |
+
265 325
|
3201 |
+
349 265
|
3202 |
+
821 256
|
3203 |
+
341 399
|
3204 |
+
2102 1584
|
3205 |
+
285 461
|
3206 |
+
1583 322
|
3207 |
+
166 1441
|
3208 |
+
272 411
|
3209 |
+
1128 2104
|
3210 |
+
44 1129
|
3211 |
+
1585 278
|
3212 |
+
2567 2568
|
3213 |
+
925 909
|
3214 |
+
181 362
|
3215 |
+
390 2571
|
3216 |
+
3467 175
|
3217 |
+
272 533
|
3218 |
+
322 137
|
3219 |
+
181 1320
|
3220 |
+
157 1807
|
3221 |
+
1211 290
|
3222 |
+
2575 445
|
3223 |
+
1014 539
|
3224 |
+
322 1588
|
3225 |
+
1212 1132
|
3226 |
+
425 386
|
3227 |
+
1808 1807
|
3228 |
+
264 2576
|
3229 |
+
1003 273
|
3230 |
+
302 790
|
3231 |
+
1312 322
|
3232 |
+
385 324
|
3233 |
+
759 39
|
3234 |
+
496 157
|
3235 |
+
339 667
|
3236 |
+
3487 496
|
3237 |
+
3488 182
|
3238 |
+
2579 369
|
3239 |
+
330 366
|
3240 |
+
330 402
|
3241 |
+
334 1200
|
3242 |
+
2536 537
|
3243 |
+
970 386
|
3244 |
+
973 2111
|
3245 |
+
151 2582
|
3246 |
+
156 381
|
3247 |
+
2532 1588
|
3248 |
+
761 423
|
3249 |
+
1427 2584
|
3250 |
+
3501 284
|
3251 |
+
481 2585
|
3252 |
+
264 886
|
3253 |
+
544 575
|
3254 |
+
1811 594
|
3255 |
+
503 2593
|
3256 |
+
608 369
|
3257 |
+
353 749
|
3258 |
+
1108 270
|
3259 |
+
325 542
|
3260 |
+
2065 165
|
3261 |
+
702 1135
|
3262 |
+
3513 1291
|
3263 |
+
3514 334
|
3264 |
+
3515 1813
|
3265 |
+
504 547
|
3266 |
+
3517 1070
|
3267 |
+
3518 1216
|
3268 |
+
260 327
|
3269 |
+
311 1551
|
3270 |
+
388 887
|
3271 |
+
3522 335
|
3272 |
+
1071 328
|
3273 |
+
3524 358
|
3274 |
+
723 951
|
3275 |
+
3526 1598
|
3276 |
+
3527 363
|
3277 |
+
3528 265
|
3278 |
+
3529 649
|
3279 |
+
488 1071
|
3280 |
+
3531 1456
|
3281 |
+
2123 1218
|
3282 |
+
311 2124
|
3283 |
+
276 965
|
3284 |
+
1072 174
|
3285 |
+
747 299
|
3286 |
+
1825 2129
|
3287 |
+
1460 2604
|
3288 |
+
3539 649
|
3289 |
+
666 168
|
3290 |
+
185 933
|
3291 |
+
175 2607
|
3292 |
+
258 152
|
3293 |
+
1018 367
|
3294 |
+
523 2466
|
3295 |
+
321 476
|
3296 |
+
341 284
|
3297 |
+
1223 1309
|
3298 |
+
361 2609
|
3299 |
+
276 185
|
3300 |
+
1831 911
|
3301 |
+
135 417
|
3302 |
+
324 397
|
3303 |
+
349 661
|
3304 |
+
1747 155
|
3305 |
+
621 479
|
3306 |
+
688 284
|
3307 |
+
315 525
|
3308 |
+
303 342
|
3309 |
+
717 381
|
3310 |
+
610 1120
|
3311 |
+
635 283
|
3312 |
+
299 602
|
3313 |
+
890 261
|
3314 |
+
311 353
|
3315 |
+
1141 2614
|
3316 |
+
3567 270
|
3317 |
+
633 1833
|
3318 |
+
1607 1834
|
3319 |
+
3570 330
|
3320 |
+
322 1467
|
3321 |
+
672 1019
|
3322 |
+
2616 302
|
3323 |
+
359 337
|
3324 |
+
367 2617
|
3325 |
+
2618 412
|
3326 |
+
136 828
|
3327 |
+
172 261
|
3328 |
+
935 626
|
3329 |
+
1314 467
|
3330 |
+
855 312
|
3331 |
+
32 512
|
3332 |
+
890 323
|
3333 |
+
2135 1469
|
3334 |
+
1142 292
|
3335 |
+
1611 466
|
3336 |
+
433 584
|
3337 |
+
356 1838
|
3338 |
+
845 2137
|
3339 |
+
259 442
|
3340 |
+
789 332
|
3341 |
+
279 372
|
3342 |
+
1145 1841
|
3343 |
+
645 294
|
3344 |
+
543 649
|
3345 |
+
673 768
|
3346 |
+
513 1614
|
3347 |
+
292 1843
|
3348 |
+
1835 271
|
3349 |
+
1617 445
|
3350 |
+
1143 1844
|
3351 |
+
1845 2139
|
3352 |
+
2624 174
|
3353 |
+
264 2141
|
3354 |
+
1112 299
|
3355 |
+
2627 361
|
3356 |
+
3607 348
|
3357 |
+
3608 1619
|
3358 |
+
3609 2628
|
3359 |
+
3610 39
|
3360 |
+
673 1621
|
3361 |
+
461 168
|
3362 |
+
1622 134
|
3363 |
+
3614 718
|
3364 |
+
44 644
|
3365 |
+
380 1623
|
3366 |
+
3617 377
|
3367 |
+
3618 1449
|
3368 |
+
3619 577
|
3369 |
+
3620 2634
|
3370 |
+
368 2143
|
3371 |
+
1624 1332
|
3372 |
+
1851 2635
|
3373 |
+
3624 648
|
3374 |
+
2636 304
|
3375 |
+
3626 2638
|
3376 |
+
287 276
|
3377 |
+
638 1339
|
3378 |
+
649 329
|
3379 |
+
1023 155
|
3380 |
+
2145 318
|
3381 |
+
3632 936
|
3382 |
+
3633 273
|
3383 |
+
3634 355
|
3384 |
+
1286 386
|
3385 |
+
871 182
|
3386 |
+
1102 181
|
3387 |
+
3638 2644
|
3388 |
+
178 416
|
3389 |
+
2646 2647
|
3390 |
+
2648 1024
|
3391 |
+
261 2148
|
3392 |
+
1197 2040
|
3393 |
+
2651 1290
|
3394 |
+
491 175
|
3395 |
+
3646 270
|
3396 |
+
133 340
|
3397 |
+
463 347
|
3398 |
+
2652 319
|
3399 |
+
353 537
|
3400 |
+
1472 1857
|
3401 |
+
2152 654
|
3402 |
+
3653 387
|
3403 |
+
302 1332
|
3404 |
+
328 299
|
3405 |
+
385 515
|
3406 |
+
1038 350
|
3407 |
+
3658 287
|
3408 |
+
3659 1859
|
3409 |
+
521 532
|
3410 |
+
1861 1016
|
3411 |
+
1341 2154
|
3412 |
+
3663 1023
|
3413 |
+
453 320
|
3414 |
+
449 1026
|
3415 |
+
164 307
|
3416 |
+
394 359
|
3417 |
+
325 1621
|
3418 |
+
1408 2661
|
3419 |
+
633 349
|
3420 |
+
2152 339
|
3421 |
+
536 466
|
3422 |
+
717 857
|
3423 |
+
330 353
|
3424 |
+
271 553
|
3425 |
+
1330 297
|
3426 |
+
1823 367
|
3427 |
+
601 586
|
3428 |
+
1002 428
|
3429 |
+
1120 830
|
3430 |
+
320 840
|
3431 |
+
642 311
|
3432 |
+
3683 363
|
3433 |
+
3684 347
|
3434 |
+
3685 361
|
3435 |
+
3686 541
|
3436 |
+
3687 376
|
3437 |
+
1280 1236
|
3438 |
+
2160 533
|
3439 |
+
3690 2674
|
3440 |
+
397 276
|
3441 |
+
1827 273
|
3442 |
+
644 325
|
3443 |
+
1050 277
|
3444 |
+
313 134
|
3445 |
+
404 610
|
3446 |
+
374 352
|
3447 |
+
300 1870
|
3448 |
+
800 143
|
3449 |
+
348 593
|
3450 |
+
370 767
|
3451 |
+
2684 465
|
3452 |
+
1237 1020
|
3453 |
+
849 491
|
3454 |
+
676 1871
|
3455 |
+
1872 559
|
3456 |
+
310 1636
|
3457 |
+
644 337
|
3458 |
+
370 711
|
3459 |
+
277 159
|
3460 |
+
355 634
|
3461 |
+
827 284
|
3462 |
+
2599 1151
|
3463 |
+
3714 328
|
3464 |
+
3715 370
|
3465 |
+
3716 1637
|
3466 |
+
323 2689
|
3467 |
+
181 775
|
3468 |
+
1859 769
|
3469 |
+
264 1614
|
3470 |
+
3721 467
|
3471 |
+
307 614
|
3472 |
+
804 357
|
3473 |
+
794 593
|
3474 |
+
308 1303
|
3475 |
+
331 2130
|
3476 |
+
914 331
|
3477 |
+
318 1586
|
3478 |
+
3729 827
|
3479 |
+
397 353
|
3480 |
+
1857 819
|
3481 |
+
2142 489
|
3482 |
+
588 174
|
3483 |
+
2696 304
|
3484 |
+
345 589
|
3485 |
+
267 2145
|
3486 |
+
462 897
|
3487 |
+
433 354
|
3488 |
+
908 1771
|
3489 |
+
321 154
|
3490 |
+
682 639
|
3491 |
+
2177 871
|
3492 |
+
1349 2161
|
3493 |
+
472 535
|
3494 |
+
173 427
|
3495 |
+
1325 484
|
3496 |
+
898 2124
|
3497 |
+
697 486
|
3498 |
+
3749 280
|
3499 |
+
371 1241
|
3500 |
+
318 280
|
3501 |
+
164 273
|
3502 |
+
524 298
|
3503 |
+
448 384
|
3504 |
+
267 378
|
3505 |
+
2705 2179
|
3506 |
+
137 443
|
3507 |
+
305 1883
|
3508 |
+
660 274
|
3509 |
+
365 1766
|
3510 |
+
3761 384
|
3511 |
+
2482 514
|
3512 |
+
315 413
|
3513 |
+
2119 2710
|
3514 |
+
950 585
|
3515 |
+
1316 298
|
3516 |
+
334 1480
|
3517 |
+
3768 283
|
3518 |
+
3769 1482
|
3519 |
+
766 172
|
3520 |
+
325 285
|
3521 |
+
136 340
|
3522 |
+
174 2718
|
3523 |
+
159 547
|
3524 |
+
1154 324
|
3525 |
+
315 45
|
3526 |
+
462 1240
|
3527 |
+
325 779
|
3528 |
+
302 176
|
3529 |
+
2725 2726
|
3530 |
+
259 409
|
3531 |
+
728 292
|
3532 |
+
959 1288
|
3533 |
+
3784 1407
|
3534 |
+
257 1647
|
3535 |
+
705 1040
|
3536 |
+
3787 274
|
3537 |
+
182 527
|
3538 |
+
537 675
|
3539 |
+
1243 299
|
3540 |
+
758 1011
|
3541 |
+
1350 464
|
3542 |
+
150 458
|
3543 |
+
734 389
|
3544 |
+
327 754
|
3545 |
+
1648 405
|
3546 |
+
577 1236
|
3547 |
+
1244 900
|
3548 |
+
1890 1245
|
3549 |
+
154 286
|
3550 |
+
3801 450
|
3551 |
+
370 894
|
3552 |
+
1649 887
|
3553 |
+
3804 2731
|
3554 |
+
3805 2185
|
3555 |
+
334 166
|
3556 |
+
821 303
|
3557 |
+
2714 2733
|
3558 |
+
339 381
|
3559 |
+
280 1651
|
3560 |
+
423 521
|
3561 |
+
950 690
|
3562 |
+
318 1354
|
3563 |
+
568 453
|
3564 |
+
171 967
|
3565 |
+
554 481
|
3566 |
+
2745 401
|
3567 |
+
3818 265
|
3568 |
+
3819 1894
|
3569 |
+
772 942
|
3570 |
+
350 2166
|
3571 |
+
470 50
|
3572 |
+
2750 330
|
3573 |
+
603 383
|
3574 |
+
2751 274
|
3575 |
+
3826 528
|
3576 |
+
563 355
|
3577 |
+
503 594
|
3578 |
+
665 910
|
3579 |
+
424 1647
|
3580 |
+
2753 309
|
3581 |
+
365 298
|
3582 |
+
285 1482
|
3583 |
+
3834 273
|
3584 |
+
540 274
|
3585 |
+
338 354
|
3586 |
+
1589 458
|
3587 |
+
261 382
|
3588 |
+
367 1487
|
3589 |
+
403 678
|
3590 |
+
656 312
|
3591 |
+
763 1186
|
3592 |
+
318 461
|
3593 |
+
1862 2195
|
3594 |
+
1899 996
|
3595 |
+
2758 2196
|
3596 |
+
448 2123
|
3597 |
+
3848 347
|
3598 |
+
3849 1155
|
3599 |
+
1156 1050
|
3600 |
+
325 2198
|
3601 |
+
323 455
|
3602 |
+
2074 1654
|
3603 |
+
3854 1655
|
3604 |
+
3855 419
|
3605 |
+
3856 1902
|
3606 |
+
3857 2759
|
3607 |
+
3858 1903
|
3608 |
+
3859 2082
|
3609 |
+
325 545
|
3610 |
+
2761 339
|
3611 |
+
3862 2762
|
3612 |
+
3863 445
|
3613 |
+
308 275
|
3614 |
+
397 886
|
3615 |
+
492 707
|
3616 |
+
1657 428
|
3617 |
+
1077 2067
|
3618 |
+
750 2768
|
3619 |
+
1361 271
|
3620 |
+
2084 614
|
3621 |
+
3872 273
|
3622 |
+
1244 776
|
3623 |
+
1108 277
|
3624 |
+
408 346
|
3625 |
+
3876 396
|
3626 |
+
272 323
|
3627 |
+
472 2204
|
3628 |
+
3879 388
|
3629 |
+
324 603
|
3630 |
+
3881 1908
|
3631 |
+
156 729
|
3632 |
+
3883 2071
|
3633 |
+
2771 299
|
3634 |
+
576 168
|
3635 |
+
274 285
|
3636 |
+
2774 941
|
3637 |
+
1663 454
|
3638 |
+
966 1080
|
3639 |
+
879 484
|
3640 |
+
3891 1106
|
3641 |
+
321 473
|
3642 |
+
663 1243
|
3643 |
+
686 2206
|
3644 |
+
1649 2207
|
3645 |
+
178 2208
|
3646 |
+
333 653
|
3647 |
+
344 2210
|
3648 |
+
345 345
|
3649 |
+
424 723
|
3650 |
+
465 340
|
3651 |
+
3902 452
|
3652 |
+
1032 2212
|
3653 |
+
334 1848
|
3654 |
+
266 424
|
3655 |
+
355 1487
|
3656 |
+
157 822
|
3657 |
+
134 519
|
3658 |
+
298 285
|
3659 |
+
3910 351
|
3660 |
+
2214 304
|
3661 |
+
259 1225
|
3662 |
+
1906 1255
|
3663 |
+
526 279
|
3664 |
+
181 1912
|
3665 |
+
298 299
|
3666 |
+
274 594
|
3667 |
+
170 503
|
3668 |
+
184 399
|
3669 |
+
508 2784
|
3670 |
+
170 2509
|
3671 |
+
548 322
|
3672 |
+
151 1024
|
3673 |
+
2786 590
|
3674 |
+
3925 2787
|
3675 |
+
1495 1258
|
3676 |
+
3927 847
|
3677 |
+
271 2223
|
3678 |
+
181 683
|
3679 |
+
491 367
|
3680 |
+
367 2224
|
3681 |
+
166 628
|
3682 |
+
1484 638
|
3683 |
+
1241 749
|
3684 |
+
2791 1305
|
3685 |
+
3936 359
|
3686 |
+
711 723
|
3687 |
+
592 298
|
3688 |
+
1447 1666
|
3689 |
+
519 270
|
3690 |
+
264 355
|
3691 |
+
3942 270
|
3692 |
+
3943 1811
|
3693 |
+
2192 458
|
3694 |
+
1470 277
|
3695 |
+
1855 319
|
3696 |
+
977 260
|
3697 |
+
2497 620
|
3698 |
+
3949 2799
|
3699 |
+
3950 285
|
3700 |
+
3951 477
|
3701 |
+
3952 1651
|
3702 |
+
327 135
|
3703 |
+
659 1671
|
3704 |
+
1821 664
|
3705 |
+
164 859
|
3706 |
+
361 1498
|
3707 |
+
1203 387
|
3708 |
+
1208 302
|
3709 |
+
1920 1673
|
3710 |
+
1642 2139
|
3711 |
+
369 2232
|
3712 |
+
1230 262
|
3713 |
+
569 909
|
3714 |
+
1259 606
|
3715 |
+
3966 840
|
3716 |
+
1312 865
|
3717 |
+
1803 1590
|
3718 |
+
673 752
|
3719 |
+
978 670
|
3720 |
+
1082 437
|
3721 |
+
1280 484
|
3722 |
+
2809 270
|
3723 |
+
2236 2687
|
3724 |
+
414 805
|
3725 |
+
296 344
|
3726 |
+
447 972
|
3727 |
+
2811 260
|
3728 |
+
3979 1157
|
3729 |
+
334 2238
|
3730 |
+
2814 910
|
3731 |
+
3982 386
|
3732 |
+
881 387
|
3733 |
+
467 284
|
3734 |
+
300 766
|
3735 |
+
181 317
|
3736 |
+
931 279
|
3737 |
+
3988 298
|
3738 |
+
536 296
|
3739 |
+
2819 607
|
3740 |
+
763 1572
|
3741 |
+
1678 285
|
3742 |
+
1802 808
|
3743 |
+
331 401
|
3744 |
+
570 586
|
3745 |
+
1018 1472
|
3746 |
+
563 939
|
3747 |
+
805 954
|
3748 |
+
167 261
|
3749 |
+
987 265
|
3750 |
+
2825 1679
|
3751 |
+
4002 181
|
3752 |
+
1402 2645
|
3753 |
+
1353 1322
|
3754 |
+
166 2243
|
3755 |
+
367 654
|
3756 |
+
148 2829
|
3757 |
+
1496 297
|
3758 |
+
156 2830
|
3759 |
+
280 531
|
3760 |
+
361 399
|
3761 |
+
740 2763
|
3762 |
+
44 672
|
3763 |
+
1769 1262
|
3764 |
+
339 1680
|
3765 |
+
1361 887
|
3766 |
+
895 713
|
3767 |
+
659 2832
|
3768 |
+
325 1157
|
3769 |
+
4020 261
|
3770 |
+
4021 335
|
3771 |
+
173 1088
|
3772 |
+
262 607
|
3773 |
+
463 391
|
3774 |
+
4025 463
|
3775 |
+
1556 492
|
3776 |
+
522 266
|
3777 |
+
1926 818
|
3778 |
+
175 356
|
3779 |
+
300 930
|
3780 |
+
681 277
|
3781 |
+
4032 1658
|
3782 |
+
2838 818
|
3783 |
+
1633 312
|
3784 |
+
488 168
|
3785 |
+
320 740
|
3786 |
+
339 1508
|
3787 |
+
2676 490
|
3788 |
+
519 382
|
3789 |
+
335 570
|
3790 |
+
2654 2250
|
3791 |
+
4042 874
|
3792 |
+
852 334
|
3793 |
+
635 340
|
3794 |
+
772 432
|
3795 |
+
1251 669
|
3796 |
+
513 419
|
3797 |
+
4048 966
|
3798 |
+
4049 744
|
3799 |
+
1617 327
|
3800 |
+
390 1077
|
3801 |
+
2259 1488
|
3802 |
+
986 1241
|
3803 |
+
404 345
|
3804 |
+
294 278
|
3805 |
+
2850 317
|
3806 |
+
2851 2756
|
3807 |
+
568 1922
|
3808 |
+
284 2049
|
3809 |
+
166 416
|
3810 |
+
4061 869
|
3811 |
+
523 261
|
3812 |
+
4063 692
|
3813 |
+
1352 284
|
3814 |
+
265 812
|
3815 |
+
284 420
|
3816 |
+
1819 318
|
3817 |
+
468 351
|
3818 |
+
1144 2260
|
3819 |
+
321 1309
|
3820 |
+
4071 519
|
3821 |
+
4072 711
|
3822 |
+
138 812
|
3823 |
+
453 913
|
3824 |
+
4075 578
|
3825 |
+
1502 286
|
3826 |
+
4077 824
|
3827 |
+
1355 1040
|
3828 |
+
4079 1644
|
3829 |
+
765 1404
|
3830 |
+
1161 1123
|
3831 |
+
601 328
|
3832 |
+
134 2211
|
3833 |
+
4084 529
|
3834 |
+
269 157
|
3835 |
+
896 386
|
3836 |
+
537 172
|
3837 |
+
983 736
|
3838 |
+
4089 280
|
3839 |
+
4090 528
|
3840 |
+
4091 1161
|
3841 |
+
4092 2642
|
3842 |
+
4093 830
|
3843 |
+
4094 2251
|
3844 |
+
154 1688
|
3845 |
+
2861 1117
|
3846 |
+
1474 334
|
3847 |
+
283 2862
|
3848 |
+
4099 1227
|
3849 |
+
4100 1368
|
3850 |
+
562 1140
|
3851 |
+
170 1265
|
3852 |
+
303 614
|
3853 |
+
259 1197
|
3854 |
+
2261 300
|
3855 |
+
398 1369
|
3856 |
+
944 2185
|
3857 |
+
318 2262
|
3858 |
+
274 1202
|
3859 |
+
2867 302
|
3860 |
+
846 1335
|
3861 |
+
292 328
|
3862 |
+
492 659
|
3863 |
+
167 463
|
3864 |
+
4115 273
|
3865 |
+
4116 2872
|
3866 |
+
353 829
|
3867 |
+
344 329
|
3868 |
+
4119 780
|
3869 |
+
1400 2876
|
3870 |
+
1794 788
|
3871 |
+
272 689
|
3872 |
+
267 162
|
3873 |
+
362 641
|
3874 |
+
742 1262
|
3875 |
+
325 1908
|
3876 |
+
328 373
|
3877 |
+
659 595
|
3878 |
+
2877 1486
|
3879 |
+
262 546
|
3880 |
+
1003 1162
|
3881 |
+
302 884
|
3882 |
+
1031 642
|
3883 |
+
445 1119
|
3884 |
+
302 182
|
3885 |
+
334 690
|
3886 |
+
405 1232
|
3887 |
+
165 560
|
3888 |
+
458 276
|
3889 |
+
1128 604
|
3890 |
+
350 2052
|
3891 |
+
291 445
|
3892 |
+
283 332
|
3893 |
+
390 280
|
3894 |
+
823 962
|
3895 |
+
133 611
|
3896 |
+
377 1856
|
3897 |
+
724 349
|
3898 |
+
2885 2886
|
3899 |
+
933 616
|
3900 |
+
4151 797
|
3901 |
+
749 592
|
3902 |
+
350 1351
|
3903 |
+
319 499
|
3904 |
+
786 885
|
3905 |
+
526 447
|
3906 |
+
2273 395
|
3907 |
+
850 352
|
3908 |
+
311 616
|
3909 |
+
505 270
|
3910 |
+
909 164
|
3911 |
+
167 273
|
3912 |
+
284 530
|
3913 |
+
1892 363
|
3914 |
+
280 384
|
3915 |
+
557 273
|
3916 |
+
2275 2708
|
3917 |
+
312 1224
|
3918 |
+
1943 611
|
3919 |
+
328 537
|
3920 |
+
823 425
|
3921 |
+
348 270
|
3922 |
+
259 740
|
3923 |
+
2188 2897
|
3924 |
+
721 170
|
3925 |
+
161 716
|
3926 |
+
1201 163
|
3927 |
+
262 433
|
3928 |
+
2279 1947
|
3929 |
+
281 281
|
3930 |
+
285 434
|
3931 |
+
2901 898
|
3932 |
+
4183 353
|
3933 |
+
4184 352
|
3934 |
+
4185 291
|
3935 |
+
166 581
|
3936 |
+
291 341
|
3937 |
+
4188 703
|
3938 |
+
277 165
|
3939 |
+
2284 321
|
3940 |
+
1231 437
|
3941 |
+
513 350
|
3942 |
+
2177 360
|
3943 |
+
340 743
|
3944 |
+
279 1701
|
3945 |
+
798 181
|
3946 |
+
719 330
|
3947 |
+
304 861
|
3948 |
+
264 1860
|
3949 |
+
1137 2908
|
3950 |
+
4201 1270
|
3951 |
+
1375 2909
|
3952 |
+
1949 2912
|
3953 |
+
422 175
|
3954 |
+
585 2254
|
3955 |
+
945 731
|
3956 |
+
2914 307
|
3957 |
+
4208 1164
|
3958 |
+
2915 1613
|
3959 |
+
4210 383
|
3960 |
+
4211 2817
|
3961 |
+
181 1368
|
3962 |
+
997 2138
|
3963 |
+
4214 2916
|
3964 |
+
259 608
|
3965 |
+
335 473
|
3966 |
+
168 2918
|
3967 |
+
792 314
|
3968 |
+
622 304
|
3969 |
+
2248 732
|
3970 |
+
2920 1265
|
3971 |
+
419 525
|
3972 |
+
2921 593
|
3973 |
+
292 279
|
3974 |
+
376 274
|
3975 |
+
2096 481
|
3976 |
+
2294 2280
|
3977 |
+
361 2692
|
3978 |
+
280 318
|
3979 |
+
178 330
|
3980 |
+
307 715
|
3981 |
+
835 299
|
3982 |
+
342 2296
|
3983 |
+
450 284
|
3984 |
+
1013 271
|
3985 |
+
4236 167
|
3986 |
+
383 274
|
3987 |
+
264 2880
|
3988 |
+
299 454
|
3989 |
+
1282 261
|
3990 |
+
656 1096
|
3991 |
+
444 280
|
3992 |
+
686 1199
|
3993 |
+
4244 1097
|
3994 |
+
4245 2929
|
3995 |
+
669 1167
|
3996 |
+
2298 273
|
3997 |
+
1079 2790
|
3998 |
+
487 1949
|
3999 |
+
785 1626
|
4000 |
+
430 1106
|
4001 |
+
4252 1930
|
4002 |
+
4253 2528
|
4003 |
+
1199 339
|
4004 |
+
337 315
|
4005 |
+
332 435
|
4006 |
+
278 840
|
4007 |
+
2933 1377
|
4008 |
+
324 272
|
4009 |
+
393 264
|
4010 |
+
501 680
|
4011 |
+
178 2853
|
4012 |
+
292 527
|
4013 |
+
299 395
|
4014 |
+
826 1709
|
4015 |
+
1553 260
|
4016 |
+
4267 430
|
4017 |
+
4268 285
|
4018 |
+
4269 495
|
4019 |
+
556 1860
|
4020 |
+
320 619
|
4021 |
+
1173 369
|
4022 |
+
283 318
|
4023 |
+
4274 374
|
4024 |
+
4275 1416
|
4025 |
+
4276 435
|
4026 |
+
2300 301
|
4027 |
+
1685 479
|
4028 |
+
811 10
|
4029 |
+
182 1941
|
4030 |
+
733 182
|
4031 |
+
677 342
|
4032 |
+
319 307
|
4033 |
+
1052 414
|
4034 |
+
382 334
|
4035 |
+
685 387
|
4036 |
+
841 1760
|
4037 |
+
1748 618
|
4038 |
+
436 270
|
4039 |
+
504 822
|
4040 |
+
397 797
|
4041 |
+
1273 619
|
4042 |
+
351 1294
|
4043 |
+
334 973
|
4044 |
+
143 435
|
4045 |
+
4296 299
|
4046 |
+
182 1166
|
4047 |
+
256 851
|
4048 |
+
325 1210
|
4049 |
+
1512 721
|
4050 |
+
280 1057
|
4051 |
+
312 650
|
4052 |
+
2275 1832
|
4053 |
+
432 685
|
4054 |
+
308 603
|
4055 |
+
4306 1163
|
4056 |
+
1234 277
|
4057 |
+
171 299
|
4058 |
+
314 619
|
4059 |
+
256 133
|
4060 |
+
257 2945
|
4061 |
+
596 449
|
4062 |
+
4313 2946
|
4063 |
+
4314 2950
|
4064 |
+
1702 568
|
4065 |
+
1361 1962
|
4066 |
+
562 184
|
4067 |
+
2312 2959
|
4068 |
+
259 472
|
4069 |
+
2581 2772
|
4070 |
+
826 1762
|
4071 |
+
904 294
|
4072 |
+
2281 523
|
4073 |
+
4324 1070
|
4074 |
+
4325 321
|
4075 |
+
2314 482
|
4076 |
+
4327 2960
|
4077 |
+
4328 488
|
4078 |
+
261 379
|
4079 |
+
185 974
|
4080 |
+
4331 307
|
4081 |
+
4332 555
|
4082 |
+
337 930
|
4083 |
+
2288 327
|
4084 |
+
4335 2840
|
4085 |
+
4336 271
|
4086 |
+
4337 2216
|
4087 |
+
314 945
|
4088 |
+
344 443
|
4089 |
+
172 616
|
4090 |
+
4341 323
|
4091 |
+
4342 304
|
4092 |
+
178 1134
|
4093 |
+
150 383
|
4094 |
+
1149 495
|
4095 |
+
482 1580
|
4096 |
+
2965 264
|
4097 |
+
4348 2966
|
4098 |
+
1176 276
|
4099 |
+
156 317
|
4100 |
+
1096 264
|
4101 |
+
307 369
|
4102 |
+
4353 359
|
4103 |
+
658 332
|
4104 |
+
2967 321
|
4105 |
+
1708 302
|
4106 |
+
166 1664
|
4107 |
+
4358 359
|
4108 |
+
2954 614
|
4109 |
+
653 436
|
4110 |
+
620 332
|
4111 |
+
270 178
|
4112 |
+
353 277
|
4113 |
+
134 1416
|
4114 |
+
4365 2972
|
4115 |
+
729 420
|
4116 |
+
536 39
|
4117 |
+
1274 2321
|
4118 |
+
4369 32
|
4119 |
+
32 331
|
4120 |
+
287 421
|
4121 |
+
4372 340
|
4122 |
+
370 471
|
4123 |
+
2979 888
|
4124 |
+
681 460
|
4125 |
+
383 1366
|
4126 |
+
618 802
|
4127 |
+
1081 2793
|
4128 |
+
370 1249
|
4129 |
+
271 1030
|
4130 |
+
271 846
|
4131 |
+
2988 1382
|
4132 |
+
4383 311
|
4133 |
+
4384 550
|
4134 |
+
481 170
|
4135 |
+
32 523
|
4136 |
+
32 465
|
4137 |
+
4388 1034
|
4138 |
+
1274 2993
|
4139 |
+
2331 32
|
4140 |
+
338 611
|
4141 |
+
4392 505
|
4142 |
+
4393 1716
|
4143 |
+
4394 362
|
4144 |
+
4395 357
|
4145 |
+
714 2992
|
4146 |
+
519 1717
|
4147 |
+
839 348
|
4148 |
+
4399 319
|
4149 |
+
156 273
|
4150 |
+
526 708
|
4151 |
+
423 685
|
4152 |
+
702 613
|
4153 |
+
421 538
|
4154 |
+
747 307
|
4155 |
+
4406 419
|
4156 |
+
971 379
|
4157 |
+
398 1975
|
4158 |
+
2940 712
|
4159 |
+
296 156
|
4160 |
+
1328 280
|
4161 |
+
279 277
|
4162 |
+
167 623
|
4163 |
+
1530 991
|
4164 |
+
1660 696
|
4165 |
+
350 1533
|
4166 |
+
320 2998
|
4167 |
+
262 945
|
4168 |
+
302 905
|
4169 |
+
1656 292
|
4170 |
+
264 1406
|
4171 |
+
331 272
|
4172 |
+
721 295
|
4173 |
+
327 1380
|
4174 |
+
1057 172
|
4175 |
+
487 270
|
4176 |
+
594 1905
|
4177 |
+
292 389
|
4178 |
+
577 1237
|
4179 |
+
1314 2855
|
4180 |
+
331 658
|
4181 |
+
371 184
|
4182 |
+
4433 317
|
4183 |
+
618 676
|
4184 |
+
468 1969
|
4185 |
+
2340 3002
|
4186 |
+
4437 270
|
4187 |
+
3003 1674
|
4188 |
+
4439 1653
|
4189 |
+
1018 943
|
4190 |
+
4441 786
|
4191 |
+
174 1458
|
4192 |
+
166 261
|
4193 |
+
4444 256
|
4194 |
+
4445 1534
|
4195 |
+
4446 285
|
4196 |
+
397 589
|
4197 |
+
463 2719
|
4198 |
+
4449 292
|
4199 |
+
435 744
|
4200 |
+
451 285
|
4201 |
+
276 181
|
4202 |
+
676 636
|
4203 |
+
325 280
|
4204 |
+
2345 992
|
4205 |
+
1695 32
|
4206 |
+
1909 517
|
4207 |
+
397 379
|
4208 |
+
32 444
|
4209 |
+
329 376
|
4210 |
+
368 257
|
4211 |
+
292 2903
|
4212 |
+
1536 443
|
4213 |
+
4464 1348
|
4214 |
+
2230 481
|
4215 |
+
487 443
|
4216 |
+
277 1537
|
4217 |
+
134 284
|
4218 |
+
155 2349
|
4219 |
+
800 2093
|
4220 |
+
4471 1722
|
4221 |
+
462 2350
|
4222 |
+
4473 547
|
4223 |
+
4474 285
|
4224 |
+
3015 3016
|
4225 |
+
1270 444
|
4226 |
+
838 330
|
4227 |
+
361 1698
|
4228 |
+
377 323
|
4229 |
+
264 1098
|
4230 |
+
171 346
|
4231 |
+
4482 265
|
4232 |
+
4483 364
|
4233 |
+
4484 285
|
4234 |
+
4485 540
|
4235 |
+
806 2353
|
4236 |
+
4487 2334
|
4237 |
+
1259 372
|
4238 |
+
4489 3020
|
4239 |
+
758 982
|
4240 |
+
4491 1715
|
4241 |
+
1722 2943
|
4242 |
+
314 2305
|
4243 |
+
381 304
|
4244 |
+
393 1982
|
4245 |
+
482 333
|
4246 |
+
1903 807
|
4247 |
+
3023 1724
|
4248 |
+
4499 2318
|
4249 |
+
470 45
|
4250 |
+
482 275
|
4251 |
+
4502 2053
|
4252 |
+
392 669
|
4253 |
+
2179 729
|
4254 |
+
264 3027
|
4255 |
+
371 638
|
4256 |
+
300 1503
|
4257 |
+
3032 970
|
4258 |
+
888 262
|
4259 |
+
289 285
|
4260 |
+
1229 349
|
4261 |
+
2354 2322
|
4262 |
+
342 1083
|
4263 |
+
271 543
|
4264 |
+
747 1070
|
4265 |
+
4516 762
|
4266 |
+
4517 291
|
4267 |
+
850 634
|
4268 |
+
386 473
|
4269 |
+
156 775
|
4270 |
+
310 161
|
4271 |
+
270 164
|
4272 |
+
312 619
|
4273 |
+
1984 1233
|
4274 |
+
4525 1977
|
4275 |
+
4526 2619
|
4276 |
+
4527 3035
|
4277 |
+
4528 802
|
4278 |
+
4529 2976
|
4279 |
+
4530 2356
|
4280 |
+
4531 2343
|
4281 |
+
4532 2338
|
4282 |
+
4533 603
|
4283 |
+
4534 319
|
4284 |
+
4535 399
|
4285 |
+
4536 508
|
4286 |
+
4537 330
|
4287 |
+
4538 894
|
4288 |
+
4539 1386
|
4289 |
+
4540 39
|
4290 |
+
4541 3037
|
4291 |
+
4542 2314
|
4292 |
+
4543 762
|
4293 |
+
4544 716
|
4294 |
+
4545 3038
|
4295 |
+
4546 564
|
4296 |
+
4547 2985
|
4297 |
+
4548 3039
|
4298 |
+
4549 3040
|
4299 |
+
4550 349
|
4300 |
+
4551 1961
|
4301 |
+
4552 861
|
4302 |
+
4553 1165
|
4303 |
+
2359 2160
|
4304 |
+
4555 323
|
4305 |
+
154 944
|
4306 |
+
1986 896
|
4307 |
+
672 574
|
4308 |
+
334 178
|
4309 |
+
319 356
|
4310 |
+
265 634
|
4311 |
+
259 861
|
4312 |
+
610 335
|
4313 |
+
2294 1947
|
4314 |
+
327 2847
|
4315 |
+
898 842
|
4316 |
+
393 361
|
4317 |
+
1898 1505
|
4318 |
+
755 280
|
4319 |
+
408 600
|
4320 |
+
4571 273
|
4321 |
+
4572 372
|
4322 |
+
300 433
|
4323 |
+
4574 307
|
4324 |
+
833 347
|
4325 |
+
370 324
|
4326 |
+
294 135
|
4327 |
+
4578 421
|
4328 |
+
4579 308
|
4329 |
+
4580 474
|
4330 |
+
762 359
|
4331 |
+
316 301
|
4332 |
+
905 559
|
4333 |
+
576 1021
|
4334 |
+
1727 647
|
4335 |
+
272 395
|
4336 |
+
3048 382
|
4337 |
+
277 1382
|
4338 |
+
400 650
|
4339 |
+
170 567
|
4340 |
+
3050 3051
|
4341 |
+
674 513
|
4342 |
+
3053 371
|
4343 |
+
159 384
|
4344 |
+
477 317
|
4345 |
+
4596 1146
|
4346 |
+
526 505
|
4347 |
+
185 269
|
4348 |
+
4599 289
|
4349 |
+
4600 340
|
4350 |
+
487 867
|
4351 |
+
367 332
|
4352 |
+
3054 324
|
4353 |
+
4604 297
|
4354 |
+
431 395
|
4355 |
+
690 182
|
4356 |
+
1654 1714
|
4357 |
+
4608 3059
|
4358 |
+
4609 298
|
4359 |
+
4610 660
|
4360 |
+
181 1873
|
4361 |
+
638 745
|
4362 |
+
2962 1490
|
4363 |
+
561 340
|
4364 |
+
4615 394
|
4365 |
+
307 290
|
4366 |
+
1448 3066
|
4367 |
+
1983 300
|
4368 |
+
508 478
|
4369 |
+
2043 461
|
4370 |
+
786 2162
|
4371 |
+
325 372
|
4372 |
+
379 2468
|
4373 |
+
1039 292
|
4374 |
+
2697 594
|
4375 |
+
281 264
|
4376 |
+
260 44
|
4377 |
+
503 44
|
4378 |
+
2274 271
|
4379 |
+
1264 1388
|
4380 |
+
1731 571
|
4381 |
+
776 281
|
4382 |
+
339 283
|
4383 |
+
401 292
|
4384 |
+
473 461
|
4385 |
+
569 1510
|
4386 |
+
403 803
|
4387 |
+
2376 551
|
4388 |
+
262 2056
|
4389 |
+
1789 425
|
4390 |
+
1100 272
|
4391 |
+
1995 835
|
4392 |
+
1058 509
|
4393 |
+
555 3073
|
4394 |
+
1443 271
|
4395 |
+
148 1541
|
4396 |
+
337 529
|
4397 |
+
2377 439
|
4398 |
+
557 311
|
4399 |
+
2379 337
|
4400 |
+
338 834
|
4401 |
+
294 2355
|
4402 |
+
1156 820
|
4403 |
+
1997 1987
|
4404 |
+
334 3083
|
4405 |
+
335 678
|
4406 |
+
636 927
|
4407 |
+
32 562
|
4408 |
+
509 531
|
4409 |
+
4660 287
|
4410 |
+
837 304
|
4411 |
+
2246 1543
|
4412 |
+
488 134
|
4413 |
+
319 616
|
4414 |
+
596 2541
|
4415 |
+
1568 653
|
4416 |
+
274 478
|
4417 |
+
334 671
|
4418 |
+
341 373
|
4419 |
+
445 1214
|
4420 |
+
562 626
|
4421 |
+
1272 867
|
4422 |
+
3088 402
|
4423 |
+
276 154
|
4424 |
+
379 729
|
4425 |
+
3089 321
|
4426 |
+
1534 848
|
4427 |
+
1306 824
|
4428 |
+
3090 262
|
4429 |
+
671 529
|
4430 |
+
1500 580
|
4431 |
+
4682 2219
|
4432 |
+
338 274
|
4433 |
+
4684 833
|
4434 |
+
430 622
|
4435 |
+
1263 1945
|
4436 |
+
737 622
|
4437 |
+
4688 1338
|
4438 |
+
610 607
|
4439 |
+
980 2104
|
4440 |
+
3095 39
|
4441 |
+
380 1116
|
4442 |
+
2385 2129
|
4443 |
+
2001 633
|
4444 |
+
185 280
|
4445 |
+
4696 571
|
4446 |
+
361 1528
|
4447 |
+
353 1701
|
4448 |
+
1238 277
|
4449 |
+
4700 387
|
4450 |
+
4701 1390
|
4451 |
+
329 272
|
4452 |
+
4703 538
|
4453 |
+
916 654
|
4454 |
+
542 349
|
4455 |
+
1435 271
|
4456 |
+
410 386
|
4457 |
+
184 581
|
4458 |
+
2297 277
|
4459 |
+
318 3080
|
4460 |
+
654 168
|
4461 |
+
379 1681
|
4462 |
+
775 172
|
4463 |
+
151 1025
|
4464 |
+
488 154
|
4465 |
+
4716 607
|
4466 |
+
2385 1134
|
4467 |
+
2388 337
|
4468 |
+
523 541
|
4469 |
+
271 161
|
4470 |
+
260 39
|
4471 |
+
519 745
|
4472 |
+
632 529
|
4473 |
+
733 171
|
4474 |
+
719 729
|
4475 |
+
1124 269
|
4476 |
+
4727 167
|
4477 |
+
327 2392
|
4478 |
+
503 311
|
4479 |
+
323 2393
|
4480 |
+
907 437
|
4481 |
+
1483 3108
|
4482 |
+
178 785
|
4483 |
+
490 971
|
4484 |
+
32 318
|
4485 |
+
755 645
|
4486 |
+
385 728
|
4487 |
+
174 1371
|
4488 |
+
699 156
|
4489 |
+
291 565
|
4490 |
+
377 299
|
4491 |
+
541 383
|
4492 |
+
951 317
|
4493 |
+
284 391
|
4494 |
+
850 1184
|
4495 |
+
948 647
|
4496 |
+
2810 1006
|
4497 |
+
468 277
|
4498 |
+
915 454
|
4499 |
+
741 296
|
4500 |
+
1036 1946
|
4501 |
+
305 846
|
4502 |
+
2737 1545
|
4503 |
+
691 277
|
4504 |
+
649 648
|
4505 |
+
958 1215
|
4506 |
+
667 2397
|
4507 |
+
1734 941
|
4508 |
+
4759 537
|
4509 |
+
566 278
|
4510 |
+
1217 613
|
4511 |
+
1335 557
|
4512 |
+
168 1517
|
4513 |
+
814 170
|
4514 |
+
1339 1019
|
4515 |
+
1367 292
|
4516 |
+
44 895
|
4517 |
+
1687 866
|
4518 |
+
361 715
|
4519 |
+
276 174
|
4520 |
+
323 366
|
4521 |
+
4772 2907
|
4522 |
+
4773 272
|
4523 |
+
1150 1371
|
4524 |
+
900 424
|
4525 |
+
360 405
|
4526 |
+
4777 273
|
4527 |
+
1460 2388
|
4528 |
+
302 1250
|
4529 |
+
804 3116
|
4530 |
+
491 156
|
4531 |
+
329 463
|
4532 |
+
488 1530
|
4533 |
+
4784 982
|
4534 |
+
4785 1810
|
4535 |
+
1036 1831
|
4536 |
+
489 657
|
4537 |
+
588 1167
|
4538 |
+
298 440
|
4539 |
+
1141 277
|
4540 |
+
325 1477
|
4541 |
+
3121 1072
|
4542 |
+
963 1206
|
4543 |
+
687 491
|
4544 |
+
171 620
|
4545 |
+
3122 2403
|
4546 |
+
151 285
|
4547 |
+
4798 280
|
4548 |
+
325 391
|
4549 |
+
137 1806
|
4550 |
+
830 3124
|
4551 |
+
4802 1662
|
4552 |
+
1871 342
|
4553 |
+
276 912
|
4554 |
+
759 466
|
4555 |
+
307 704
|
4556 |
+
339 284
|
4557 |
+
890 1237
|
4558 |
+
168 1164
|
4559 |
+
2816 1563
|
4560 |
+
347 274
|
4561 |
+
2106 3117
|
4562 |
+
419 314
|
4563 |
+
4814 282
|
4564 |
+
274 542
|
4565 |
+
2337 939
|
4566 |
+
4817 2007
|
4567 |
+
374 317
|
4568 |
+
4819 842
|
4569 |
+
371 993
|
4570 |
+
2666 1086
|
4571 |
+
1048 1459
|
4572 |
+
277 150
|
4573 |
+
174 328
|
4574 |
+
329 1388
|
4575 |
+
426 170
|
4576 |
+
4827 834
|
4577 |
+
989 1114
|
4578 |
+
302 929
|
4579 |
+
743 264
|
4580 |
+
1362 1739
|
4581 |
+
529 170
|
4582 |
+
664 1740
|
4583 |
+
292 2215
|
4584 |
+
672 1524
|
4585 |
+
171 3132
|
4586 |
+
165 1524
|
4587 |
+
1383 286
|
4588 |
+
172 1163
|
4589 |
+
260 438
|
4590 |
+
458 1648
|
4591 |
+
4842 291
|
4592 |
+
523 284
|
4593 |
+
355 561
|
4594 |
+
4845 2798
|
4595 |
+
487 2210
|
4596 |
+
381 1256
|
4597 |
+
436 764
|
4598 |
+
380 722
|
4599 |
+
4850 371
|
4600 |
+
413 372
|
4601 |
+
582 1359
|
4602 |
+
430 283
|
4603 |
+
1897 557
|
4604 |
+
3136 425
|
4605 |
+
2100 363
|
4606 |
+
408 634
|
4607 |
+
903 616
|
4608 |
+
292 303
|
4609 |
+
321 3137
|
4610 |
+
1344 2270
|
4611 |
+
2412 1039
|
4612 |
+
610 342
|
4613 |
+
624 1739
|
4614 |
+
3139 2870
|
4615 |
+
345 886
|
4616 |
+
341 347
|
4617 |
+
260 391
|
4618 |
+
1539 461
|
4619 |
+
929 329
|
4620 |
+
271 624
|
4621 |
+
2169 398
|
4622 |
+
4873 310
|
4623 |
+
4874 3142
|
4624 |
+
4875 299
|
4625 |
+
4876 260
|
4626 |
+
4877 634
|
4627 |
+
548 636
|
4628 |
+
1013 349
|
4629 |
+
335 278
|
4630 |
+
288 182
|
4631 |
+
284 320
|
4632 |
+
3145 627
|
4633 |
+
996 2919
|
4634 |
+
4885 548
|
4635 |
+
296 1993
|
4636 |
+
1139 1262
|
4637 |
+
596 1213
|
4638 |
+
835 262
|
4639 |
+
1119 1505
|
4640 |
+
893 382
|
4641 |
+
449 1429
|
4642 |
+
423 740
|
4643 |
+
266 639
|
4644 |
+
268 160
|
4645 |
+
764 424
|
4646 |
+
377 1761
|
4647 |
+
1928 2405
|
4648 |
+
325 3149
|
4649 |
+
2418 749
|
4650 |
+
2419 846
|
4651 |
+
170 1061
|
4652 |
+
361 2140
|
4653 |
+
279 274
|
4654 |
+
1536 2403
|
4655 |
+
709 363
|
4656 |
+
1836 1481
|
4657 |
+
267 543
|
4658 |
+
4909 1394
|
4659 |
+
533 265
|
4660 |
+
1513 1546
|
4661 |
+
181 274
|
4662 |
+
512 489
|
4663 |
+
3154 764
|
4664 |
+
3085 265
|
4665 |
+
3030 2267
|
4666 |
+
274 365
|
4667 |
+
3155 1625
|
4668 |
+
771 273
|
4669 |
+
379 1319
|
4670 |
+
321 626
|
4671 |
+
323 555
|
4672 |
+
360 2423
|
4673 |
+
763 342
|
4674 |
+
636 407
|
4675 |
+
1992 664
|
4676 |
+
323 348
|
4677 |
+
1220 3146
|
4678 |
+
184 3160
|
4679 |
+
2036 274
|
4680 |
+
2421 2375
|
4681 |
+
941 373
|
4682 |
+
368 283
|
4683 |
+
2380 2615
|
4684 |
+
270 742
|
4685 |
+
1765 1193
|
4686 |
+
4937 2834
|
4687 |
+
2222 858
|
4688 |
+
438 2422
|
4689 |
+
4940 911
|
4690 |
+
888 669
|
4691 |
+
150 328
|
4692 |
+
143 273
|
4693 |
+
1776 962
|
4694 |
+
426 278
|
4695 |
+
3164 645
|
4696 |
+
930 868
|
4697 |
+
1957 460
|
4698 |
+
133 3102
|
4699 |
+
426 570
|
4700 |
+
2424 1851
|
4701 |
+
588 168
|
4702 |
+
4953 1017
|
4703 |
+
4954 181
|
4704 |
+
4955 399
|
4705 |
+
1260 284
|
4706 |
+
371 1429
|
4707 |
+
1172 1390
|
4708 |
+
898 836
|
4709 |
+
4960 276
|
4710 |
+
4961 665
|
4711 |
+
329 1131
|
4712 |
+
4963 270
|
4713 |
+
508 730
|
4714 |
+
380 2013
|
4715 |
+
403 172
|
4716 |
+
185 448
|
4717 |
+
2013 445
|
4718 |
+
1287 591
|
4719 |
+
1972 372
|
4720 |
+
178 2423
|
4721 |
+
553 566
|
4722 |
+
3006 1478
|
4723 |
+
659 170
|
4724 |
+
332 1570
|
4725 |
+
321 134
|
4726 |
+
154 2686
|
4727 |
+
272 298
|
4728 |
+
278 648
|
4729 |
+
334 723
|
4730 |
+
740 273
|
4731 |
+
1076 298
|
4732 |
+
939 172
|
4733 |
+
2427 1278
|
4734 |
+
636 1098
|
4735 |
+
2417 271
|
4736 |
+
711 344
|
4737 |
+
342 378
|
4738 |
+
1446 867
|
4739 |
+
271 1278
|
4740 |
+
156 2779
|
4741 |
+
900 773
|
4742 |
+
956 2193
|
4743 |
+
327 168
|
4744 |
+
555 325
|
4745 |
+
323 274
|
4746 |
+
1135 361
|
4747 |
+
1223 172
|
tokenizer_model/hindi_sentiments_basic.vocab
ADDED
The diff for this file is too large to render.
See raw diff
|
|
train.py
ADDED
@@ -0,0 +1,24 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
"""
|
2 |
+
This script is used to train the tokenizer model using the combined content of the dataset.
|
3 |
+
The trained model is saved in the tokenizer_model directory.
|
4 |
+
"""
|
5 |
+
|
6 |
+
import os
|
7 |
+
from tokenizer.basic_bpe import BasicTokenizer
|
8 |
+
|
9 |
+
# reading the input file
|
10 |
+
combined_file_path = "hindi_combined.txt"
|
11 |
+
combined_file_path = os.path.join(os.getcwd(), "data", combined_file_path)
|
12 |
+
with open(combined_file_path, "r") as file:
|
13 |
+
combined_content = file.read()
|
14 |
+
|
15 |
+
basic_tokenizer = BasicTokenizer()
|
16 |
+
print("Training the tokenizer model...")
|
17 |
+
basic_tokenizer.train(combined_content, vocab_size=5000, verbose=True)
|
18 |
+
|
19 |
+
print("Saving the model...")
|
20 |
+
model_path = os.path.join(os.getcwd(), "tokenizer_model")
|
21 |
+
os.makedirs(model_path, exist_ok=True)
|
22 |
+
prefix = os.path.join(model_path, "hindi_sentiments_basic")
|
23 |
+
basic_tokenizer.save(prefix)
|
24 |
+
print("Model saved at:", prefix)
|