diff --git a/examples/15_sasrec_with_llm.ipynb b/examples/15_sasrec_with_llm.ipynb new file mode 100644 index 000000000..849e25d56 --- /dev/null +++ b/examples/15_sasrec_with_llm.ipynb @@ -0,0 +1,941 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Example of the SASRec training with knowledge transfer from LLM-generated profiles\n", + "Note that all the given examples can be run without using PySpark, using only Pandas" + ] + }, + { + "cell_type": "code", + "metadata": { + "jupyter": { + "is_executing": true + } + }, + "source": [ + "import lightning as L\n", + "from lightning.pytorch.loggers import CSVLogger\n", + "from lightning.pytorch.callbacks import ModelCheckpoint\n", + "from torch.utils.data import DataLoader\n", + "\n", + "from replay.splitters import LastNSplitter\n", + "from replay.data import (\n", + " FeatureHint,\n", + " FeatureInfo,\n", + " FeatureSchema,\n", + " FeatureSource,\n", + " FeatureType,\n", + " Dataset,\n", + ")\n", + "from replay.models.nn.optimizer_utils import FatOptimizerFactory\n", + "from replay.models.nn.sequential.callbacks import ValidationMetricsCallback\n", + "from replay.models.nn.sequential.postprocessors import RemoveSeenItems\n", + "from replay.data.nn import SequenceTokenizer, SequentialDataset, TensorFeatureSource, TensorSchema, TensorFeatureInfo\n", + "from replay.models.nn.sequential import SasRecLLM\n", + "from replay.models.nn.sequential.sasrec_with_llm import SasRecLLMTrainingDataset\n", + "from replay.models.nn.sequential.sasrec import (\n", + " SasRecValidationDataset,\n", + ")" + ], + "outputs": [], + "execution_count": null + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Prepare data\n", + "### Load raw movielens-1M interactions, item features and user features.\n", + "In the current implementation, the SASRec does not take into account the features of items or users. They are only used to get a complete list of users and items." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install rs-datasets" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "from rs_datasets import MovieLens" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "movielens = MovieLens(\"100k\")\n", + "interactions = movielens.ratings\n", + "user_features = movielens.users\n", + "item_features = movielens.items" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_iditem_idratingtimestamp
0111935978300760
116613978302109
219143978301968
3134084978300275
4123555978824291
\n", + "
" + ], + "text/plain": [ + " user_id item_id rating timestamp\n", + "0 1 1193 5 978300760\n", + "1 1 661 3 978302109\n", + "2 1 914 3 978301968\n", + "3 1 3408 4 978300275\n", + "4 1 2355 5 978824291" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "interactions.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_idgenderageoccupationzip_code
01F11048067
12M561670072
23M251555117
34M45702460
45M252055455
\n", + "
" + ], + "text/plain": [ + " user_id gender age occupation zip_code\n", + "0 1 F 1 10 48067\n", + "1 2 M 56 16 70072\n", + "2 3 M 25 15 55117\n", + "3 4 M 45 7 02460\n", + "4 5 M 25 20 55455" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "user_features.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
item_idtitlegenres
01Toy Story (1995)Animation|Children's|Comedy
12Jumanji (1995)Adventure|Children's|Fantasy
23Grumpier Old Men (1995)Comedy|Romance
34Waiting to Exhale (1995)Comedy|Drama
45Father of the Bride Part II (1995)Comedy
\n", + "
" + ], + "text/plain": [ + " item_id title genres\n", + "0 1 Toy Story (1995) Animation|Children's|Comedy\n", + "1 2 Jumanji (1995) Adventure|Children's|Fantasy\n", + "2 3 Grumpier Old Men (1995) Comedy|Romance\n", + "3 4 Waiting to Exhale (1995) Comedy|Drama\n", + "4 5 Father of the Bride Part II (1995) Comedy" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "item_features.head()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Removing duplicates in the timestamp column without changing the original items order where timestamp is the same" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
user_iditem_idratingtimestamp
1000138604085840
10001536040238441
999873604059352
10000076040196143
10001926040201954
...............
825793495823991446
825438495814075447
825724495832644448
825731495826343449
825603495819244450
\n", + "

1000209 rows × 4 columns

\n", + "
" + ], + "text/plain": [ + " user_id item_id rating timestamp\n", + "1000138 6040 858 4 0\n", + "1000153 6040 2384 4 1\n", + "999873 6040 593 5 2\n", + "1000007 6040 1961 4 3\n", + "1000192 6040 2019 5 4\n", + "... ... ... ... ...\n", + "825793 4958 2399 1 446\n", + "825438 4958 1407 5 447\n", + "825724 4958 3264 4 448\n", + "825731 4958 2634 3 449\n", + "825603 4958 1924 4 450\n", + "\n", + "[1000209 rows x 4 columns]" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "interactions[\"timestamp\"] = interactions[\"timestamp\"].astype(\"int64\")\n", + "interactions = interactions.sort_values(by=\"timestamp\")\n", + "interactions[\"timestamp\"] = interactions.groupby(\"user_id\").cumcount()\n", + "interactions" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Split interactions into the train, validation and test datasets using LastNSplitter" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "splitter = LastNSplitter(\n", + " N=1,\n", + " divide_column=\"user_id\",\n", + " query_column=\"user_id\",\n", + " strategy=\"interactions\",\n", + ")\n", + "\n", + "raw_test_events, raw_test_gt = splitter.split(interactions)\n", + "raw_validation_events, raw_validation_gt = splitter.split(raw_test_events)\n", + "raw_train_events = raw_validation_events" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Prepare FeatureSchema required to create Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "def prepare_feature_schema(is_ground_truth: bool) -> FeatureSchema:\n", + " base_features = FeatureSchema(\n", + " [\n", + " FeatureInfo(\n", + " column=\"user_id\",\n", + " feature_hint=FeatureHint.QUERY_ID,\n", + " feature_type=FeatureType.CATEGORICAL,\n", + " ),\n", + " FeatureInfo(\n", + " column=\"item_id\",\n", + " feature_hint=FeatureHint.ITEM_ID,\n", + " feature_type=FeatureType.CATEGORICAL,\n", + " ),\n", + " ]\n", + " )\n", + " if is_ground_truth:\n", + " return base_features\n", + "\n", + " all_features = base_features + FeatureSchema(\n", + " [\n", + " FeatureInfo(\n", + " column=\"timestamp\",\n", + " feature_type=FeatureType.NUMERICAL,\n", + " feature_hint=FeatureHint.TIMESTAMP,\n", + " ),\n", + " ]\n", + " )\n", + " return all_features" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create Dataset for the training stage" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "train_dataset = Dataset(\n", + " feature_schema=prepare_feature_schema(is_ground_truth=False),\n", + " interactions=raw_train_events,\n", + " query_features=user_features,\n", + " item_features=item_features,\n", + " check_consistency=True,\n", + " categorical_encoded=False,\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create Datasets (events and ground_truth) for the validation stage" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "validation_dataset = Dataset(\n", + " feature_schema=prepare_feature_schema(is_ground_truth=False),\n", + " interactions=raw_validation_events,\n", + " query_features=user_features,\n", + " item_features=item_features,\n", + " check_consistency=True,\n", + " categorical_encoded=False,\n", + ")\n", + "validation_gt = Dataset(\n", + " feature_schema=prepare_feature_schema(is_ground_truth=True),\n", + " interactions=raw_validation_gt,\n", + " check_consistency=True,\n", + " categorical_encoded=False,\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create Datasets (events and ground_truth) for the testing stage" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "test_dataset = Dataset(\n", + " feature_schema=prepare_feature_schema(is_ground_truth=False),\n", + " interactions=raw_test_events,\n", + " query_features=user_features,\n", + " item_features=item_features,\n", + " check_consistency=True,\n", + " categorical_encoded=False,\n", + ")\n", + "test_gt = Dataset(\n", + " feature_schema=prepare_feature_schema(is_ground_truth=True),\n", + " interactions=raw_test_gt,\n", + " check_consistency=True,\n", + " categorical_encoded=False,\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create the tensor schema\n", + "A schema shows the correspondence of columns from the source dataset with the internal representation of tensors inside the model" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "ITEM_FEATURE_NAME = \"item_id_seq\"\n", + "\n", + "tensor_schema = TensorSchema(\n", + " TensorFeatureInfo(\n", + " name=ITEM_FEATURE_NAME,\n", + " is_seq=True,\n", + " feature_type=FeatureType.CATEGORICAL,\n", + " feature_sources=[TensorFeatureSource(FeatureSource.INTERACTIONS, train_dataset.feature_schema.item_id_column)],\n", + " feature_hint=FeatureHint.ITEM_ID,\n", + " )\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create sequential datasets using SequenceTokenizer\n", + "The SequentialDataset internally store data in the form of sequences of items sorted by increasing interaction time (timestamp). A SequenceTokenizer is used to convert to this format. In addition, the SequenceTokenizer encodes all categorical columns from the source dataset and stores mapping inside itself.\n", + "SequentialDataset.keep_common_query_ids is used to leave only sequences from the same users" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "tokenizer = SequenceTokenizer(tensor_schema, allow_collect_to_master=True)\n", + "tokenizer.fit(train_dataset)\n", + "\n", + "sequential_train_dataset = tokenizer.transform(train_dataset)\n", + "\n", + "sequential_validation_dataset = tokenizer.transform(validation_dataset)\n", + "sequential_validation_gt = tokenizer.transform(validation_gt, [tensor_schema.item_id_feature_name])\n", + "\n", + "sequential_validation_dataset, sequential_validation_gt = SequentialDataset.keep_common_query_ids(\n", + " sequential_validation_dataset, sequential_validation_gt\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "test_query_ids = test_gt.query_ids\n", + "test_query_ids_np = tokenizer.query_id_encoder.transform(test_query_ids)[\"user_id\"].values\n", + "sequential_test_dataset = tokenizer.transform(test_dataset).filter_by_query_id(test_query_ids_np)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "You can get the user and item mapping and inverse mapping as follows" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'user_id': {1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 7, 9: 8, 10: 9, 11: 10, 12: 11, 13: 12, 14: 13, 15: 14, 16: 15, 17: 16, 18: 17, 19: 18, 20: 19, 21: 20, 22: 21, 23: 22, 24: 23, 25: 24, 26: 25, 27: 26, 28: 27, 29: 28, 30: 29, 31: 30, 32: 31, 33: 32, 34: 33, 35: 34, 36: 35, 37: 36, 38: 37, 39: 38, 40: 39, 41: 40, 42: 41, 43: 42, 44: 43, 45: 44, 46: 45, 47: 46, 48: 47, 49: 48, 50: 49, 51: 50, 52: 51, 53: 52, 54: 53, 55: 54, 56: 55, 57: 56, 58: 57, 59: 58, 60: 59, 61: 60, 62: 61, 63: 62, 64: 63, 65: 64, 66: 65, 67: 66, 68: 67, 69: 68, 70: 69, 71: 70, 72: 71, 73: 72, 74: 73, 75: 74, 76: 75, 77: 76, 78: 77, 79: 78, 80: 79, 81: 80, 82: 81, 83: 82, 84: 83, 85: 84, 86: 85, 87: 86, 88: 87, 89: 88, 90: 89, 91: 90, 92: 91, 93: 92, 94: 93, 95: 94, 96: 95, 97: 96, 98: 97, 99: 98, 100: 99, 101: 100, 102: 101, 103: 102, 104: 103, 105: 104, 106: 105, 107: 106, 108: 107, 109: 108, 110: 109, 111: 110, 112: 111, 113: 112, 114: 113, 115: 114, 116: 115, 117: 116, 118: 117, 119: 118, 120: 119, 121: 120, 122: 121, 123: 122, 124: 123, 125: 124, 126: 125, 127: 126, 128: 127, 129: 128, 130: 129, 131: 130, 132: 131, 133: 132, 134: 133, 135: 134, 136: 135, 137: 136, 138: 137, 139: 138, 140: 139, 141: 140, 142: 141, 143: 142, 144: 143, 145: 144, 146: 145, 147: 146, 148: 147, 149: 148, 150: 149, 151: 150, 152: 151, 153: 152, 154: 153, 155: 154, 156: 155, 157: 156, 158: 157, 159: 158, 160: 159, 161: 160, 162: 161, 163: 162, 164: 163, 165: 164, 166: 165, 167: 166, 168: 167, 169: 168, 170: 169, 171: 170, 172: 171, 173: 172, 174: 173, 175: 174, 176: 175, 177: 176, 178: 177, 179: 178, 180: 179, 181: 180, 182: 181, 183: 182, 184: 183, 185: 184, 186: 185, 187: 186, 188: 187, 189: 188, 190: 189, 191: 190, 192: 191, 193: 192, 194: 193, 195: 194, 196: 195, 197: 196, 198: 197, 199: 198, 200: 199, 201: 200, 202: 201, 203: 202, 204: 203, 205: 204, 206: 205, 207: 206, 208: 207, 209: 208, 210: 209, 211: 210, 212: 211, 213: 212, 214: 213, 215: 214, 216: 215, 217: 216, 218: 217, 219: 218, 220: 219, 221: 220, 222: 221, 223: 222, 224: 223, 225: 224, 226: 225, 227: 226, 228: 227, 229: 228, 230: 229, 231: 230, 232: 231, 233: 232, 234: 233, 235: 234, 236: 235, 237: 236, 238: 237, 239: 238, 240: 239, 241: 240, 242: 241, 243: 242, 244: 243, 245: 244, 246: 245, 247: 246, 248: 247, 249: 248, 250: 249, 251: 250, 252: 251, 253: 252, 254: 253, 255: 254, 256: 255, 257: 256, 258: 257, 259: 258, 260: 259, 261: 260, 262: 261, 263: 262, 264: 263, 265: 264, 266: 265, 267: 266, 268: 267, 269: 268, 270: 269, 271: 270, 272: 271, 273: 272, 274: 273, 275: 274, 276: 275, 277: 276, 278: 277, 279: 278, 280: 279, 281: 280, 282: 281, 283: 282, 284: 283, 285: 284, 286: 285, 287: 286, 288: 287, 289: 288, 290: 289, 291: 290, 292: 291, 293: 292, 294: 293, 295: 294, 296: 295, 297: 296, 298: 297, 299: 298, 300: 299, 301: 300, 302: 301, 303: 302, 304: 303, 305: 304, 306: 305, 307: 306, 308: 307, 309: 308, 310: 309, 311: 310, 312: 311, 313: 312, 314: 313, 315: 314, 316: 315, 317: 316, 318: 317, 319: 318, 320: 319, 321: 320, 322: 321, 323: 322, 324: 323, 325: 324, 326: 325, 327: 326, 328: 327, 329: 328, 330: 329, 331: 330, 332: 331, 333: 332, 334: 333, 335: 334, 336: 335, 337: 336, 338: 337, 339: 338, 340: 339, 341: 340, 342: 341, 343: 342, 344: 343, 345: 344, 346: 345, 347: 346, 348: 347, 349: 348, 350: 349, 351: 350, 352: 351, 353: 352, 354: 353, 355: 354, 356: 355, 357: 356, 358: 357, 359: 358, 360: 359, 361: 360, 362: 361, 363: 362, 364: 363, 365: 364, 366: 365, 367: 366, 368: 367, 369: 368, 370: 369, 371: 370, 372: 371, 373: 372, 374: 373, 375: 374, 376: 375, 377: 376, 378: 377, 379: 378, 380: 379, 381: 380, 382: 381, 383: 382, 384: 383, 385: 384, 386: 385, 387: 386, 388: 387, 389: 388, 390: 389, 391: 390, 392: 391, 393: 392, 394: 393, 395: 394, 396: 395, 397: 396, 398: 397, 399: 398, 400: 399, 401: 400, 402: 401, 403: 402, 404: 403, 405: 404, 406: 405, 407: 406, 408: 407, 409: 408, 410: 409, 411: 410, 412: 411, 413: 412, 414: 413, 415: 414, 416: 415, 417: 416, 418: 417, 419: 418, 420: 419, 421: 420, 422: 421, 423: 422, 424: 423, 425: 424, 426: 425, 427: 426, 428: 427, 429: 428, 430: 429, 431: 430, 432: 431, 433: 432, 434: 433, 435: 434, 436: 435, 437: 436, 438: 437, 439: 438, 440: 439, 441: 440, 442: 441, 443: 442, 444: 443, 445: 444, 446: 445, 447: 446, 448: 447, 449: 448, 450: 449, 451: 450, 452: 451, 453: 452, 454: 453, 455: 454, 456: 455, 457: 456, 458: 457, 459: 458, 460: 459, 461: 460, 462: 461, 463: 462, 464: 463, 465: 464, 466: 465, 467: 466, 468: 467, 469: 468, 470: 469, 471: 470, 472: 471, 473: 472, 474: 473, 475: 474, 476: 475, 477: 476, 478: 477, 479: 478, 480: 479, 481: 480, 482: 481, 483: 482, 484: 483, 485: 484, 486: 485, 487: 486, 488: 487, 489: 488, 490: 489, 491: 490, 492: 491, 493: 492, 494: 493, 495: 494, 496: 495, 497: 496, 498: 497, 499: 498, 500: 499, 501: 500, 502: 501, 503: 502, 504: 503, 505: 504, 506: 505, 507: 506, 508: 507, 509: 508, 510: 509, 511: 510, 512: 511, 513: 512, 514: 513, 515: 514, 516: 515, 517: 516, 518: 517, 519: 518, 520: 519, 521: 520, 522: 521, 523: 522, 524: 523, 525: 524, 526: 525, 527: 526, 528: 527, 529: 528, 530: 529, 531: 530, 532: 531, 533: 532, 534: 533, 535: 534, 536: 535, 537: 536, 538: 537, 539: 538, 540: 539, 541: 540, 542: 541, 543: 542, 544: 543, 545: 544, 546: 545, 547: 546, 548: 547, 549: 548, 550: 549, 551: 550, 552: 551, 553: 552, 554: 553, 555: 554, 556: 555, 557: 556, 558: 557, 559: 558, 560: 559, 561: 560, 562: 561, 563: 562, 564: 563, 565: 564, 566: 565, 567: 566, 568: 567, 569: 568, 570: 569, 571: 570, 572: 571, 573: 572, 574: 573, 575: 574, 576: 575, 577: 576, 578: 577, 579: 578, 580: 579, 581: 580, 582: 581, 583: 582, 584: 583, 585: 584, 586: 585, 587: 586, 588: 587, 589: 588, 590: 589, 591: 590, 592: 591, 593: 592, 594: 593, 595: 594, 596: 595, 597: 596, 598: 597, 599: 598, 600: 599, 601: 600, 602: 601, 603: 602, 604: 603, 605: 604, 606: 605, 607: 606, 608: 607, 609: 608, 610: 609, 611: 610, 612: 611, 613: 612, 614: 613, 615: 614, 616: 615, 617: 616, 618: 617, 619: 618, 620: 619, 621: 620, 622: 621, 623: 622, 624: 623, 625: 624, 626: 625, 627: 626, 628: 627, 629: 628, 630: 629, 631: 630, 632: 631, 633: 632, 634: 633, 635: 634, 636: 635, 637: 636, 638: 637, 639: 638, 640: 639, 641: 640, 642: 641, 643: 642, 644: 643, 645: 644, 646: 645, 647: 646, 648: 647, 649: 648, 650: 649, 651: 650, 652: 651, 653: 652, 654: 653, 655: 654, 656: 655, 657: 656, 658: 657, 659: 658, 660: 659, 661: 660, 662: 661, 663: 662, 664: 663, 665: 664, 666: 665, 667: 666, 668: 667, 669: 668, 670: 669, 671: 670, 672: 671, 673: 672, 674: 673, 675: 674, 676: 675, 677: 676, 678: 677, 679: 678, 680: 679, 681: 680, 682: 681, 683: 682, 684: 683, 685: 684, 686: 685, 687: 686, 688: 687, 689: 688, 690: 689, 691: 690, 692: 691, 693: 692, 694: 693, 695: 694, 696: 695, 697: 696, 698: 697, 699: 698, 700: 699, 701: 700, 702: 701, 703: 702, 704: 703, 705: 704, 706: 705, 707: 706, 708: 707, 709: 708, 710: 709, 711: 710, 712: 711, 713: 712, 714: 713, 715: 714, 716: 715, 717: 716, 718: 717, 719: 718, 720: 719, 721: 720, 722: 721, 723: 722, 724: 723, 725: 724, 726: 725, 727: 726, 728: 727, 729: 728, 730: 729, 731: 730, 732: 731, 733: 732, 734: 733, 735: 734, 736: 735, 737: 736, 738: 737, 739: 738, 740: 739, 741: 740, 742: 741, 743: 742, 744: 743, 745: 744, 746: 745, 747: 746, 748: 747, 749: 748, 750: 749, 751: 750, 752: 751, 753: 752, 754: 753, 755: 754, 756: 755, 757: 756, 758: 757, 759: 758, 760: 759, 761: 760, 762: 761, 763: 762, 764: 763, 765: 764, 766: 765, 767: 766, 768: 767, 769: 768, 770: 769, 771: 770, 772: 771, 773: 772, 774: 773, 775: 774, 776: 775, 777: 776, 778: 777, 779: 778, 780: 779, 781: 780, 782: 781, 783: 782, 784: 783, 785: 784, 786: 785, 787: 786, 788: 787, 789: 788, 790: 789, 791: 790, 792: 791, 793: 792, 794: 793, 795: 794, 796: 795, 797: 796, 798: 797, 799: 798, 800: 799, 801: 800, 802: 801, 803: 802, 804: 803, 805: 804, 806: 805, 807: 806, 808: 807, 809: 808, 810: 809, 811: 810, 812: 811, 813: 812, 814: 813, 815: 814, 816: 815, 817: 816, 818: 817, 819: 818, 820: 819, 821: 820, 822: 821, 823: 822, 824: 823, 825: 824, 826: 825, 827: 826, 828: 827, 829: 828, 830: 829, 831: 830, 832: 831, 833: 832, 834: 833, 835: 834, 836: 835, 837: 836, 838: 837, 839: 838, 840: 839, 841: 840, 842: 841, 843: 842, 844: 843, 845: 844, 846: 845, 847: 846, 848: 847, 849: 848, 850: 849, 851: 850, 852: 851, 853: 852, 854: 853, 855: 854, 856: 855, 857: 856, 858: 857, 859: 858, 860: 859, 861: 860, 862: 861, 863: 862, 864: 863, 865: 864, 866: 865, 867: 866, 868: 867, 869: 868, 870: 869, 871: 870, 872: 871, 873: 872, 874: 873, 875: 874, 876: 875, 877: 876, 878: 877, 879: 878, 880: 879, 881: 880, 882: 881, 883: 882, 884: 883, 885: 884, 886: 885, 887: 886, 888: 887, 889: 888, 890: 889, 891: 890, 892: 891, 893: 892, 894: 893, 895: 894, 896: 895, 897: 896, 898: 897, 899: 898, 900: 899, 901: 900, 902: 901, 903: 902, 904: 903, 905: 904, 906: 905, 907: 906, 908: 907, 909: 908, 910: 909, 911: 910, 912: 911, 913: 912, 914: 913, 915: 914, 916: 915, 917: 916, 918: 917, 919: 918, 920: 919, 921: 920, 922: 921, 923: 922, 924: 923, 925: 924, 926: 925, 927: 926, 928: 927, 929: 928, 930: 929, 931: 930, 932: 931, 933: 932, 934: 933, 935: 934, 936: 935, 937: 936, 938: 937, 939: 938, 940: 939, 941: 940, 942: 941, 943: 942, 944: 943, 945: 944, 946: 945, 947: 946, 948: 947, 949: 948, 950: 949, 951: 950, 952: 951, 953: 952, 954: 953, 955: 954, 956: 955, 957: 956, 958: 957, 959: 958, 960: 959, 961: 960, 962: 961, 963: 962, 964: 963, 965: 964, 966: 965, 967: 966, 968: 967, 969: 968, 970: 969, 971: 970, 972: 971, 973: 972, 974: 973, 975: 974, 976: 975, 977: 976, 978: 977, 979: 978, 980: 979, 981: 980, 982: 981, 983: 982, 984: 983, 985: 984, 986: 985, 987: 986, 988: 987, 989: 988, 990: 989, 991: 990, 992: 991, 993: 992, 994: 993, 995: 994, 996: 995, 997: 996, 998: 997, 999: 998, 1000: 999, 1001: 1000, 1002: 1001, 1003: 1002, 1004: 1003, 1005: 1004, 1006: 1005, 1007: 1006, 1008: 1007, 1009: 1008, 1010: 1009, 1011: 1010, 1012: 1011, 1013: 1012, 1014: 1013, 1015: 1014, 1016: 1015, 1017: 1016, 1018: 1017, 1019: 1018, 1020: 1019, 1021: 1020, 1022: 1021, 1023: 1022, 1024: 1023, 1025: 1024, 1026: 1025, 1027: 1026, 1028: 1027, 1029: 1028, 1030: 1029, 1031: 1030, 1032: 1031, 1033: 1032, 1034: 1033, 1035: 1034, 1036: 1035, 1037: 1036, 1038: 1037, 1039: 1038, 1040: 1039, 1041: 1040, 1042: 1041, 1043: 1042, 1044: 1043, 1045: 1044, 1046: 1045, 1047: 1046, 1048: 1047, 1049: 1048, 1050: 1049, 1051: 1050, 1052: 1051, 1053: 1052, 1054: 1053, 1055: 1054, 1056: 1055, 1057: 1056, 1058: 1057, 1059: 1058, 1060: 1059, 1061: 1060, 1062: 1061, 1063: 1062, 1064: 1063, 1065: 1064, 1066: 1065, 1067: 1066, 1068: 1067, 1069: 1068, 1070: 1069, 1071: 1070, 1072: 1071, 1073: 1072, 1074: 1073, 1075: 1074, 1076: 1075, 1077: 1076, 1078: 1077, 1079: 1078, 1080: 1079, 1081: 1080, 1082: 1081, 1083: 1082, 1084: 1083, 1085: 1084, 1086: 1085, 1087: 1086, 1088: 1087, 1089: 1088, 1090: 1089, 1091: 1090, 1092: 1091, 1093: 1092, 1094: 1093, 1095: 1094, 1096: 1095, 1097: 1096, 1098: 1097, 1099: 1098, 1100: 1099, 1101: 1100, 1102: 1101, 1103: 1102, 1104: 1103, 1105: 1104, 1106: 1105, 1107: 1106, 1108: 1107, 1109: 1108, 1110: 1109, 1111: 1110, 1112: 1111, 1113: 1112, 1114: 1113, 1115: 1114, 1116: 1115, 1117: 1116, 1118: 1117, 1119: 1118, 1120: 1119, 1121: 1120, 1122: 1121, 1123: 1122, 1124: 1123, 1125: 1124, 1126: 1125, 1127: 1126, 1128: 1127, 1129: 1128, 1130: 1129, 1131: 1130, 1132: 1131, 1133: 1132, 1134: 1133, 1135: 1134, 1136: 1135, 1137: 1136, 1138: 1137, 1139: 1138, 1140: 1139, 1141: 1140, 1142: 1141, 1143: 1142, 1144: 1143, 1145: 1144, 1146: 1145, 1147: 1146, 1148: 1147, 1149: 1148, 1150: 1149, 1151: 1150, 1152: 1151, 1153: 1152, 1154: 1153, 1155: 1154, 1156: 1155, 1157: 1156, 1158: 1157, 1159: 1158, 1160: 1159, 1161: 1160, 1162: 1161, 1163: 1162, 1164: 1163, 1165: 1164, 1166: 1165, 1167: 1166, 1168: 1167, 1169: 1168, 1170: 1169, 1171: 1170, 1172: 1171, 1173: 1172, 1174: 1173, 1175: 1174, 1176: 1175, 1177: 1176, 1178: 1177, 1179: 1178, 1180: 1179, 1181: 1180, 1182: 1181, 1183: 1182, 1184: 1183, 1185: 1184, 1186: 1185, 1187: 1186, 1188: 1187, 1189: 1188, 1190: 1189, 1191: 1190, 1192: 1191, 1193: 1192, 1194: 1193, 1195: 1194, 1196: 1195, 1197: 1196, 1198: 1197, 1199: 1198, 1200: 1199, 1201: 1200, 1202: 1201, 1203: 1202, 1204: 1203, 1205: 1204, 1206: 1205, 1207: 1206, 1208: 1207, 1209: 1208, 1210: 1209, 1211: 1210, 1212: 1211, 1213: 1212, 1214: 1213, 1215: 1214, 1216: 1215, 1217: 1216, 1218: 1217, 1219: 1218, 1220: 1219, 1221: 1220, 1222: 1221, 1223: 1222, 1224: 1223, 1225: 1224, 1226: 1225, 1227: 1226, 1228: 1227, 1229: 1228, 1230: 1229, 1231: 1230, 1232: 1231, 1233: 1232, 1234: 1233, 1235: 1234, 1236: 1235, 1237: 1236, 1238: 1237, 1239: 1238, 1240: 1239, 1241: 1240, 1242: 1241, 1243: 1242, 1244: 1243, 1245: 1244, 1246: 1245, 1247: 1246, 1248: 1247, 1249: 1248, 1250: 1249, 1251: 1250, 1252: 1251, 1253: 1252, 1254: 1253, 1255: 1254, 1256: 1255, 1257: 1256, 1258: 1257, 1259: 1258, 1260: 1259, 1261: 1260, 1262: 1261, 1263: 1262, 1264: 1263, 1265: 1264, 1266: 1265, 1267: 1266, 1268: 1267, 1269: 1268, 1270: 1269, 1271: 1270, 1272: 1271, 1273: 1272, 1274: 1273, 1275: 1274, 1276: 1275, 1277: 1276, 1278: 1277, 1279: 1278, 1280: 1279, 1281: 1280, 1282: 1281, 1283: 1282, 1284: 1283, 1285: 1284, 1286: 1285, 1287: 1286, 1288: 1287, 1289: 1288, 1290: 1289, 1291: 1290, 1292: 1291, 1293: 1292, 1294: 1293, 1295: 1294, 1296: 1295, 1297: 1296, 1298: 1297, 1299: 1298, 1300: 1299, 1301: 1300, 1302: 1301, 1303: 1302, 1304: 1303, 1305: 1304, 1306: 1305, 1307: 1306, 1308: 1307, 1309: 1308, 1310: 1309, 1311: 1310, 1312: 1311, 1313: 1312, 1314: 1313, 1315: 1314, 1316: 1315, 1317: 1316, 1318: 1317, 1319: 1318, 1320: 1319, 1321: 1320, 1322: 1321, 1323: 1322, 1324: 1323, 1325: 1324, 1326: 1325, 1327: 1326, 1328: 1327, 1329: 1328, 1330: 1329, 1331: 1330, 1332: 1331, 1333: 1332, 1334: 1333, 1335: 1334, 1336: 1335, 1337: 1336, 1338: 1337, 1339: 1338, 1340: 1339, 1341: 1340, 1342: 1341, 1343: 1342, 1344: 1343, 1345: 1344, 1346: 1345, 1347: 1346, 1348: 1347, 1349: 1348, 1350: 1349, 1351: 1350, 1352: 1351, 1353: 1352, 1354: 1353, 1355: 1354, 1356: 1355, 1357: 1356, 1358: 1357, 1359: 1358, 1360: 1359, 1361: 1360, 1362: 1361, 1363: 1362, 1364: 1363, 1365: 1364, 1366: 1365, 1367: 1366, 1368: 1367, 1369: 1368, 1370: 1369, 1371: 1370, 1372: 1371, 1373: 1372, 1374: 1373, 1375: 1374, 1376: 1375, 1377: 1376, 1378: 1377, 1379: 1378, 1380: 1379, 1381: 1380, 1382: 1381, 1383: 1382, 1384: 1383, 1385: 1384, 1386: 1385, 1387: 1386, 1388: 1387, 1389: 1388, 1390: 1389, 1391: 1390, 1392: 1391, 1393: 1392, 1394: 1393, 1395: 1394, 1396: 1395, 1397: 1396, 1398: 1397, 1399: 1398, 1400: 1399, 1401: 1400, 1402: 1401, 1403: 1402, 1404: 1403, 1405: 1404, 1406: 1405, 1407: 1406, 1408: 1407, 1409: 1408, 1410: 1409, 1411: 1410, 1412: 1411, 1413: 1412, 1414: 1413, 1415: 1414, 1416: 1415, 1417: 1416, 1418: 1417, 1419: 1418, 1420: 1419, 1421: 1420, 1422: 1421, 1423: 1422, 1424: 1423, 1425: 1424, 1426: 1425, 1427: 1426, 1428: 1427, 1429: 1428, 1430: 1429, 1431: 1430, 1432: 1431, 1433: 1432, 1434: 1433, 1435: 1434, 1436: 1435, 1437: 1436, 1438: 1437, 1439: 1438, 1440: 1439, 1441: 1440, 1442: 1441, 1443: 1442, 1444: 1443, 1445: 1444, 1446: 1445, 1447: 1446, 1448: 1447, 1449: 1448, 1450: 1449, 1451: 1450, 1452: 1451, 1453: 1452, 1454: 1453, 1455: 1454, 1456: 1455, 1457: 1456, 1458: 1457, 1459: 1458, 1460: 1459, 1461: 1460, 1462: 1461, 1463: 1462, 1464: 1463, 1465: 1464, 1466: 1465, 1467: 1466, 1468: 1467, 1469: 1468, 1470: 1469, 1471: 1470, 1472: 1471, 1473: 1472, 1474: 1473, 1475: 1474, 1476: 1475, 1477: 1476, 1478: 1477, 1479: 1478, 1480: 1479, 1481: 1480, 1482: 1481, 1483: 1482, 1484: 1483, 1485: 1484, 1486: 1485, 1487: 1486, 1488: 1487, 1489: 1488, 1490: 1489, 1491: 1490, 1492: 1491, 1493: 1492, 1494: 1493, 1495: 1494, 1496: 1495, 1497: 1496, 1498: 1497, 1499: 1498, 1500: 1499, 1501: 1500, 1502: 1501, 1503: 1502, 1504: 1503, 1505: 1504, 1506: 1505, 1507: 1506, 1508: 1507, 1509: 1508, 1510: 1509, 1511: 1510, 1512: 1511, 1513: 1512, 1514: 1513, 1515: 1514, 1516: 1515, 1517: 1516, 1518: 1517, 1519: 1518, 1520: 1519, 1521: 1520, 1522: 1521, 1523: 1522, 1524: 1523, 1525: 1524, 1526: 1525, 1527: 1526, 1528: 1527, 1529: 1528, 1530: 1529, 1531: 1530, 1532: 1531, 1533: 1532, 1534: 1533, 1535: 1534, 1536: 1535, 1537: 1536, 1538: 1537, 1539: 1538, 1540: 1539, 1541: 1540, 1542: 1541, 1543: 1542, 1544: 1543, 1545: 1544, 1546: 1545, 1547: 1546, 1548: 1547, 1549: 1548, 1550: 1549, 1551: 1550, 1552: 1551, 1553: 1552, 1554: 1553, 1555: 1554, 1556: 1555, 1557: 1556, 1558: 1557, 1559: 1558, 1560: 1559, 1561: 1560, 1562: 1561, 1563: 1562, 1564: 1563, 1565: 1564, 1566: 1565, 1567: 1566, 1568: 1567, 1569: 1568, 1570: 1569, 1571: 1570, 1572: 1571, 1573: 1572, 1574: 1573, 1575: 1574, 1576: 1575, 1577: 1576, 1578: 1577, 1579: 1578, 1580: 1579, 1581: 1580, 1582: 1581, 1583: 1582, 1584: 1583, 1585: 1584, 1586: 1585, 1587: 1586, 1588: 1587, 1589: 1588, 1590: 1589, 1591: 1590, 1592: 1591, 1593: 1592, 1594: 1593, 1595: 1594, 1596: 1595, 1597: 1596, 1598: 1597, 1599: 1598, 1600: 1599, 1601: 1600, 1602: 1601, 1603: 1602, 1604: 1603, 1605: 1604, 1606: 1605, 1607: 1606, 1608: 1607, 1609: 1608, 1610: 1609, 1611: 1610, 1612: 1611, 1613: 1612, 1614: 1613, 1615: 1614, 1616: 1615, 1617: 1616, 1618: 1617, 1619: 1618, 1620: 1619, 1621: 1620, 1622: 1621, 1623: 1622, 1624: 1623, 1625: 1624, 1626: 1625, 1627: 1626, 1628: 1627, 1629: 1628, 1630: 1629, 1631: 1630, 1632: 1631, 1633: 1632, 1634: 1633, 1635: 1634, 1636: 1635, 1637: 1636, 1638: 1637, 1639: 1638, 1640: 1639, 1641: 1640, 1642: 1641, 1643: 1642, 1644: 1643, 1645: 1644, 1646: 1645, 1647: 1646, 1648: 1647, 1649: 1648, 1650: 1649, 1651: 1650, 1652: 1651, 1653: 1652, 1654: 1653, 1655: 1654, 1656: 1655, 1657: 1656, 1658: 1657, 1659: 1658, 1660: 1659, 1661: 1660, 1662: 1661, 1663: 1662, 1664: 1663, 1665: 1664, 1666: 1665, 1667: 1666, 1668: 1667, 1669: 1668, 1670: 1669, 1671: 1670, 1672: 1671, 1673: 1672, 1674: 1673, 1675: 1674, 1676: 1675, 1677: 1676, 1678: 1677, 1679: 1678, 1680: 1679, 1681: 1680, 1682: 1681, 1683: 1682, 1684: 1683, 1685: 1684, 1686: 1685, 1687: 1686, 1688: 1687, 1689: 1688, 1690: 1689, 1691: 1690, 1692: 1691, 1693: 1692, 1694: 1693, 1695: 1694, 1696: 1695, 1697: 1696, 1698: 1697, 1699: 1698, 1700: 1699, 1701: 1700, 1702: 1701, 1703: 1702, 1704: 1703, 1705: 1704, 1706: 1705, 1707: 1706, 1708: 1707, 1709: 1708, 1710: 1709, 1711: 1710, 1712: 1711, 1713: 1712, 1714: 1713, 1715: 1714, 1716: 1715, 1717: 1716, 1718: 1717, 1719: 1718, 1720: 1719, 1721: 1720, 1722: 1721, 1723: 1722, 1724: 1723, 1725: 1724, 1726: 1725, 1727: 1726, 1728: 1727, 1729: 1728, 1730: 1729, 1731: 1730, 1732: 1731, 1733: 1732, 1734: 1733, 1735: 1734, 1736: 1735, 1737: 1736, 1738: 1737, 1739: 1738, 1740: 1739, 1741: 1740, 1742: 1741, 1743: 1742, 1744: 1743, 1745: 1744, 1746: 1745, 1747: 1746, 1748: 1747, 1749: 1748, 1750: 1749, 1751: 1750, 1752: 1751, 1753: 1752, 1754: 1753, 1755: 1754, 1756: 1755, 1757: 1756, 1758: 1757, 1759: 1758, 1760: 1759, 1761: 1760, 1762: 1761, 1763: 1762, 1764: 1763, 1765: 1764, 1766: 1765, 1767: 1766, 1768: 1767, 1769: 1768, 1770: 1769, 1771: 1770, 1772: 1771, 1773: 1772, 1774: 1773, 1775: 1774, 1776: 1775, 1777: 1776, 1778: 1777, 1779: 1778, 1780: 1779, 1781: 1780, 1782: 1781, 1783: 1782, 1784: 1783, 1785: 1784, 1786: 1785, 1787: 1786, 1788: 1787, 1789: 1788, 1790: 1789, 1791: 1790, 1792: 1791, 1793: 1792, 1794: 1793, 1795: 1794, 1796: 1795, 1797: 1796, 1798: 1797, 1799: 1798, 1800: 1799, 1801: 1800, 1802: 1801, 1803: 1802, 1804: 1803, 1805: 1804, 1806: 1805, 1807: 1806, 1808: 1807, 1809: 1808, 1810: 1809, 1811: 1810, 1812: 1811, 1813: 1812, 1814: 1813, 1815: 1814, 1816: 1815, 1817: 1816, 1818: 1817, 1819: 1818, 1820: 1819, 1821: 1820, 1822: 1821, 1823: 1822, 1824: 1823, 1825: 1824, 1826: 1825, 1827: 1826, 1828: 1827, 1829: 1828, 1830: 1829, 1831: 1830, 1832: 1831, 1833: 1832, 1834: 1833, 1835: 1834, 1836: 1835, 1837: 1836, 1838: 1837, 1839: 1838, 1840: 1839, 1841: 1840, 1842: 1841, 1843: 1842, 1844: 1843, 1845: 1844, 1846: 1845, 1847: 1846, 1848: 1847, 1849: 1848, 1850: 1849, 1851: 1850, 1852: 1851, 1853: 1852, 1854: 1853, 1855: 1854, 1856: 1855, 1857: 1856, 1858: 1857, 1859: 1858, 1860: 1859, 1861: 1860, 1862: 1861, 1863: 1862, 1864: 1863, 1865: 1864, 1866: 1865, 1867: 1866, 1868: 1867, 1869: 1868, 1870: 1869, 1871: 1870, 1872: 1871, 1873: 1872, 1874: 1873, 1875: 1874, 1876: 1875, 1877: 1876, 1878: 1877, 1879: 1878, 1880: 1879, 1881: 1880, 1882: 1881, 1883: 1882, 1884: 1883, 1885: 1884, 1886: 1885, 1887: 1886, 1888: 1887, 1889: 1888, 1890: 1889, 1891: 1890, 1892: 1891, 1893: 1892, 1894: 1893, 1895: 1894, 1896: 1895, 1897: 1896, 1898: 1897, 1899: 1898, 1900: 1899, 1901: 1900, 1902: 1901, 1903: 1902, 1904: 1903, 1905: 1904, 1906: 1905, 1907: 1906, 1908: 1907, 1909: 1908, 1910: 1909, 1911: 1910, 1912: 1911, 1913: 1912, 1914: 1913, 1915: 1914, 1916: 1915, 1917: 1916, 1918: 1917, 1919: 1918, 1920: 1919, 1921: 1920, 1922: 1921, 1923: 1922, 1924: 1923, 1925: 1924, 1926: 1925, 1927: 1926, 1928: 1927, 1929: 1928, 1930: 1929, 1931: 1930, 1932: 1931, 1933: 1932, 1934: 1933, 1935: 1934, 1936: 1935, 1937: 1936, 1938: 1937, 1939: 1938, 1940: 1939, 1941: 1940, 1942: 1941, 1943: 1942, 1944: 1943, 1945: 1944, 1946: 1945, 1947: 1946, 1948: 1947, 1949: 1948, 1950: 1949, 1951: 1950, 1952: 1951, 1953: 1952, 1954: 1953, 1955: 1954, 1956: 1955, 1957: 1956, 1958: 1957, 1959: 1958, 1960: 1959, 1961: 1960, 1962: 1961, 1963: 1962, 1964: 1963, 1965: 1964, 1966: 1965, 1967: 1966, 1968: 1967, 1969: 1968, 1970: 1969, 1971: 1970, 1972: 1971, 1973: 1972, 1974: 1973, 1975: 1974, 1976: 1975, 1977: 1976, 1978: 1977, 1979: 1978, 1980: 1979, 1981: 1980, 1982: 1981, 1983: 1982, 1984: 1983, 1985: 1984, 1986: 1985, 1987: 1986, 1988: 1987, 1989: 1988, 1990: 1989, 1991: 1990, 1992: 1991, 1993: 1992, 1994: 1993, 1995: 1994, 1996: 1995, 1997: 1996, 1998: 1997, 1999: 1998, 2000: 1999, 2001: 2000, 2002: 2001, 2003: 2002, 2004: 2003, 2005: 2004, 2006: 2005, 2007: 2006, 2008: 2007, 2009: 2008, 2010: 2009, 2011: 2010, 2012: 2011, 2013: 2012, 2014: 2013, 2015: 2014, 2016: 2015, 2017: 2016, 2018: 2017, 2019: 2018, 2020: 2019, 2021: 2020, 2022: 2021, 2023: 2022, 2024: 2023, 2025: 2024, 2026: 2025, 2027: 2026, 2028: 2027, 2029: 2028, 2030: 2029, 2031: 2030, 2032: 2031, 2033: 2032, 2034: 2033, 2035: 2034, 2036: 2035, 2037: 2036, 2038: 2037, 2039: 2038, 2040: 2039, 2041: 2040, 2042: 2041, 2043: 2042, 2044: 2043, 2045: 2044, 2046: 2045, 2047: 2046, 2048: 2047, 2049: 2048, 2050: 2049, 2051: 2050, 2052: 2051, 2053: 2052, 2054: 2053, 2055: 2054, 2056: 2055, 2057: 2056, 2058: 2057, 2059: 2058, 2060: 2059, 2061: 2060, 2062: 2061, 2063: 2062, 2064: 2063, 2065: 2064, 2066: 2065, 2067: 2066, 2068: 2067, 2069: 2068, 2070: 2069, 2071: 2070, 2072: 2071, 2073: 2072, 2074: 2073, 2075: 2074, 2076: 2075, 2077: 2076, 2078: 2077, 2079: 2078, 2080: 2079, 2081: 2080, 2082: 2081, 2083: 2082, 2084: 2083, 2085: 2084, 2086: 2085, 2087: 2086, 2088: 2087, 2089: 2088, 2090: 2089, 2091: 2090, 2092: 2091, 2093: 2092, 2094: 2093, 2095: 2094, 2096: 2095, 2097: 2096, 2098: 2097, 2099: 2098, 2100: 2099, 2101: 2100, 2102: 2101, 2103: 2102, 2104: 2103, 2105: 2104, 2106: 2105, 2107: 2106, 2108: 2107, 2109: 2108, 2110: 2109, 2111: 2110, 2112: 2111, 2113: 2112, 2114: 2113, 2115: 2114, 2116: 2115, 2117: 2116, 2118: 2117, 2119: 2118, 2120: 2119, 2121: 2120, 2122: 2121, 2123: 2122, 2124: 2123, 2125: 2124, 2126: 2125, 2127: 2126, 2128: 2127, 2129: 2128, 2130: 2129, 2131: 2130, 2132: 2131, 2133: 2132, 2134: 2133, 2135: 2134, 2136: 2135, 2137: 2136, 2138: 2137, 2139: 2138, 2140: 2139, 2141: 2140, 2142: 2141, 2143: 2142, 2144: 2143, 2145: 2144, 2146: 2145, 2147: 2146, 2148: 2147, 2149: 2148, 2150: 2149, 2151: 2150, 2152: 2151, 2153: 2152, 2154: 2153, 2155: 2154, 2156: 2155, 2157: 2156, 2158: 2157, 2159: 2158, 2160: 2159, 2161: 2160, 2162: 2161, 2163: 2162, 2164: 2163, 2165: 2164, 2166: 2165, 2167: 2166, 2168: 2167, 2169: 2168, 2170: 2169, 2171: 2170, 2172: 2171, 2173: 2172, 2174: 2173, 2175: 2174, 2176: 2175, 2177: 2176, 2178: 2177, 2179: 2178, 2180: 2179, 2181: 2180, 2182: 2181, 2183: 2182, 2184: 2183, 2185: 2184, 2186: 2185, 2187: 2186, 2188: 2187, 2189: 2188, 2190: 2189, 2191: 2190, 2192: 2191, 2193: 2192, 2194: 2193, 2195: 2194, 2196: 2195, 2197: 2196, 2198: 2197, 2199: 2198, 2200: 2199, 2201: 2200, 2202: 2201, 2203: 2202, 2204: 2203, 2205: 2204, 2206: 2205, 2207: 2206, 2208: 2207, 2209: 2208, 2210: 2209, 2211: 2210, 2212: 2211, 2213: 2212, 2214: 2213, 2215: 2214, 2216: 2215, 2217: 2216, 2218: 2217, 2219: 2218, 2220: 2219, 2221: 2220, 2222: 2221, 2223: 2222, 2224: 2223, 2225: 2224, 2226: 2225, 2227: 2226, 2228: 2227, 2229: 2228, 2230: 2229, 2231: 2230, 2232: 2231, 2233: 2232, 2234: 2233, 2235: 2234, 2236: 2235, 2237: 2236, 2238: 2237, 2239: 2238, 2240: 2239, 2241: 2240, 2242: 2241, 2243: 2242, 2244: 2243, 2245: 2244, 2246: 2245, 2247: 2246, 2248: 2247, 2249: 2248, 2250: 2249, 2251: 2250, 2252: 2251, 2253: 2252, 2254: 2253, 2255: 2254, 2256: 2255, 2257: 2256, 2258: 2257, 2259: 2258, 2260: 2259, 2261: 2260, 2262: 2261, 2263: 2262, 2264: 2263, 2265: 2264, 2266: 2265, 2267: 2266, 2268: 2267, 2269: 2268, 2270: 2269, 2271: 2270, 2272: 2271, 2273: 2272, 2274: 2273, 2275: 2274, 2276: 2275, 2277: 2276, 2278: 2277, 2279: 2278, 2280: 2279, 2281: 2280, 2282: 2281, 2283: 2282, 2284: 2283, 2285: 2284, 2286: 2285, 2287: 2286, 2288: 2287, 2289: 2288, 2290: 2289, 2291: 2290, 2292: 2291, 2293: 2292, 2294: 2293, 2295: 2294, 2296: 2295, 2297: 2296, 2298: 2297, 2299: 2298, 2300: 2299, 2301: 2300, 2302: 2301, 2303: 2302, 2304: 2303, 2305: 2304, 2306: 2305, 2307: 2306, 2308: 2307, 2309: 2308, 2310: 2309, 2311: 2310, 2312: 2311, 2313: 2312, 2314: 2313, 2315: 2314, 2316: 2315, 2317: 2316, 2318: 2317, 2319: 2318, 2320: 2319, 2321: 2320, 2322: 2321, 2323: 2322, 2324: 2323, 2325: 2324, 2326: 2325, 2327: 2326, 2328: 2327, 2329: 2328, 2330: 2329, 2331: 2330, 2332: 2331, 2333: 2332, 2334: 2333, 2335: 2334, 2336: 2335, 2337: 2336, 2338: 2337, 2339: 2338, 2340: 2339, 2341: 2340, 2342: 2341, 2343: 2342, 2344: 2343, 2345: 2344, 2346: 2345, 2347: 2346, 2348: 2347, 2349: 2348, 2350: 2349, 2351: 2350, 2352: 2351, 2353: 2352, 2354: 2353, 2355: 2354, 2356: 2355, 2357: 2356, 2358: 2357, 2359: 2358, 2360: 2359, 2361: 2360, 2362: 2361, 2363: 2362, 2364: 2363, 2365: 2364, 2366: 2365, 2367: 2366, 2368: 2367, 2369: 2368, 2370: 2369, 2371: 2370, 2372: 2371, 2373: 2372, 2374: 2373, 2375: 2374, 2376: 2375, 2377: 2376, 2378: 2377, 2379: 2378, 2380: 2379, 2381: 2380, 2382: 2381, 2383: 2382, 2384: 2383, 2385: 2384, 2386: 2385, 2387: 2386, 2388: 2387, 2389: 2388, 2390: 2389, 2391: 2390, 2392: 2391, 2393: 2392, 2394: 2393, 2395: 2394, 2396: 2395, 2397: 2396, 2398: 2397, 2399: 2398, 2400: 2399, 2401: 2400, 2402: 2401, 2403: 2402, 2404: 2403, 2405: 2404, 2406: 2405, 2407: 2406, 2408: 2407, 2409: 2408, 2410: 2409, 2411: 2410, 2412: 2411, 2413: 2412, 2414: 2413, 2415: 2414, 2416: 2415, 2417: 2416, 2418: 2417, 2419: 2418, 2420: 2419, 2421: 2420, 2422: 2421, 2423: 2422, 2424: 2423, 2425: 2424, 2426: 2425, 2427: 2426, 2428: 2427, 2429: 2428, 2430: 2429, 2431: 2430, 2432: 2431, 2433: 2432, 2434: 2433, 2435: 2434, 2436: 2435, 2437: 2436, 2438: 2437, 2439: 2438, 2440: 2439, 2441: 2440, 2442: 2441, 2443: 2442, 2444: 2443, 2445: 2444, 2446: 2445, 2447: 2446, 2448: 2447, 2449: 2448, 2450: 2449, 2451: 2450, 2452: 2451, 2453: 2452, 2454: 2453, 2455: 2454, 2456: 2455, 2457: 2456, 2458: 2457, 2459: 2458, 2460: 2459, 2461: 2460, 2462: 2461, 2463: 2462, 2464: 2463, 2465: 2464, 2466: 2465, 2467: 2466, 2468: 2467, 2469: 2468, 2470: 2469, 2471: 2470, 2472: 2471, 2473: 2472, 2474: 2473, 2475: 2474, 2476: 2475, 2477: 2476, 2478: 2477, 2479: 2478, 2480: 2479, 2481: 2480, 2482: 2481, 2483: 2482, 2484: 2483, 2485: 2484, 2486: 2485, 2487: 2486, 2488: 2487, 2489: 2488, 2490: 2489, 2491: 2490, 2492: 2491, 2493: 2492, 2494: 2493, 2495: 2494, 2496: 2495, 2497: 2496, 2498: 2497, 2499: 2498, 2500: 2499, 2501: 2500, 2502: 2501, 2503: 2502, 2504: 2503, 2505: 2504, 2506: 2505, 2507: 2506, 2508: 2507, 2509: 2508, 2510: 2509, 2511: 2510, 2512: 2511, 2513: 2512, 2514: 2513, 2515: 2514, 2516: 2515, 2517: 2516, 2518: 2517, 2519: 2518, 2520: 2519, 2521: 2520, 2522: 2521, 2523: 2522, 2524: 2523, 2525: 2524, 2526: 2525, 2527: 2526, 2528: 2527, 2529: 2528, 2530: 2529, 2531: 2530, 2532: 2531, 2533: 2532, 2534: 2533, 2535: 2534, 2536: 2535, 2537: 2536, 2538: 2537, 2539: 2538, 2540: 2539, 2541: 2540, 2542: 2541, 2543: 2542, 2544: 2543, 2545: 2544, 2546: 2545, 2547: 2546, 2548: 2547, 2549: 2548, 2550: 2549, 2551: 2550, 2552: 2551, 2553: 2552, 2554: 2553, 2555: 2554, 2556: 2555, 2557: 2556, 2558: 2557, 2559: 2558, 2560: 2559, 2561: 2560, 2562: 2561, 2563: 2562, 2564: 2563, 2565: 2564, 2566: 2565, 2567: 2566, 2568: 2567, 2569: 2568, 2570: 2569, 2571: 2570, 2572: 2571, 2573: 2572, 2574: 2573, 2575: 2574, 2576: 2575, 2577: 2576, 2578: 2577, 2579: 2578, 2580: 2579, 2581: 2580, 2582: 2581, 2583: 2582, 2584: 2583, 2585: 2584, 2586: 2585, 2587: 2586, 2588: 2587, 2589: 2588, 2590: 2589, 2591: 2590, 2592: 2591, 2593: 2592, 2594: 2593, 2595: 2594, 2596: 2595, 2597: 2596, 2598: 2597, 2599: 2598, 2600: 2599, 2601: 2600, 2602: 2601, 2603: 2602, 2604: 2603, 2605: 2604, 2606: 2605, 2607: 2606, 2608: 2607, 2609: 2608, 2610: 2609, 2611: 2610, 2612: 2611, 2613: 2612, 2614: 2613, 2615: 2614, 2616: 2615, 2617: 2616, 2618: 2617, 2619: 2618, 2620: 2619, 2621: 2620, 2622: 2621, 2623: 2622, 2624: 2623, 2625: 2624, 2626: 2625, 2627: 2626, 2628: 2627, 2629: 2628, 2630: 2629, 2631: 2630, 2632: 2631, 2633: 2632, 2634: 2633, 2635: 2634, 2636: 2635, 2637: 2636, 2638: 2637, 2639: 2638, 2640: 2639, 2641: 2640, 2642: 2641, 2643: 2642, 2644: 2643, 2645: 2644, 2646: 2645, 2647: 2646, 2648: 2647, 2649: 2648, 2650: 2649, 2651: 2650, 2652: 2651, 2653: 2652, 2654: 2653, 2655: 2654, 2656: 2655, 2657: 2656, 2658: 2657, 2659: 2658, 2660: 2659, 2661: 2660, 2662: 2661, 2663: 2662, 2664: 2663, 2665: 2664, 2666: 2665, 2667: 2666, 2668: 2667, 2669: 2668, 2670: 2669, 2671: 2670, 2672: 2671, 2673: 2672, 2674: 2673, 2675: 2674, 2676: 2675, 2677: 2676, 2678: 2677, 2679: 2678, 2680: 2679, 2681: 2680, 2682: 2681, 2683: 2682, 2684: 2683, 2685: 2684, 2686: 2685, 2687: 2686, 2688: 2687, 2689: 2688, 2690: 2689, 2691: 2690, 2692: 2691, 2693: 2692, 2694: 2693, 2695: 2694, 2696: 2695, 2697: 2696, 2698: 2697, 2699: 2698, 2700: 2699, 2701: 2700, 2702: 2701, 2703: 2702, 2704: 2703, 2705: 2704, 2706: 2705, 2707: 2706, 2708: 2707, 2709: 2708, 2710: 2709, 2711: 2710, 2712: 2711, 2713: 2712, 2714: 2713, 2715: 2714, 2716: 2715, 2717: 2716, 2718: 2717, 2719: 2718, 2720: 2719, 2721: 2720, 2722: 2721, 2723: 2722, 2724: 2723, 2725: 2724, 2726: 2725, 2727: 2726, 2728: 2727, 2729: 2728, 2730: 2729, 2731: 2730, 2732: 2731, 2733: 2732, 2734: 2733, 2735: 2734, 2736: 2735, 2737: 2736, 2738: 2737, 2739: 2738, 2740: 2739, 2741: 2740, 2742: 2741, 2743: 2742, 2744: 2743, 2745: 2744, 2746: 2745, 2747: 2746, 2748: 2747, 2749: 2748, 2750: 2749, 2751: 2750, 2752: 2751, 2753: 2752, 2754: 2753, 2755: 2754, 2756: 2755, 2757: 2756, 2758: 2757, 2759: 2758, 2760: 2759, 2761: 2760, 2762: 2761, 2763: 2762, 2764: 2763, 2765: 2764, 2766: 2765, 2767: 2766, 2768: 2767, 2769: 2768, 2770: 2769, 2771: 2770, 2772: 2771, 2773: 2772, 2774: 2773, 2775: 2774, 2776: 2775, 2777: 2776, 2778: 2777, 2779: 2778, 2780: 2779, 2781: 2780, 2782: 2781, 2783: 2782, 2784: 2783, 2785: 2784, 2786: 2785, 2787: 2786, 2788: 2787, 2789: 2788, 2790: 2789, 2791: 2790, 2792: 2791, 2793: 2792, 2794: 2793, 2795: 2794, 2796: 2795, 2797: 2796, 2798: 2797, 2799: 2798, 2800: 2799, 2801: 2800, 2802: 2801, 2803: 2802, 2804: 2803, 2805: 2804, 2806: 2805, 2807: 2806, 2808: 2807, 2809: 2808, 2810: 2809, 2811: 2810, 2812: 2811, 2813: 2812, 2814: 2813, 2815: 2814, 2816: 2815, 2817: 2816, 2818: 2817, 2819: 2818, 2820: 2819, 2821: 2820, 2822: 2821, 2823: 2822, 2824: 2823, 2825: 2824, 2826: 2825, 2827: 2826, 2828: 2827, 2829: 2828, 2830: 2829, 2831: 2830, 2832: 2831, 2833: 2832, 2834: 2833, 2835: 2834, 2836: 2835, 2837: 2836, 2838: 2837, 2839: 2838, 2840: 2839, 2841: 2840, 2842: 2841, 2843: 2842, 2844: 2843, 2845: 2844, 2846: 2845, 2847: 2846, 2848: 2847, 2849: 2848, 2850: 2849, 2851: 2850, 2852: 2851, 2853: 2852, 2854: 2853, 2855: 2854, 2856: 2855, 2857: 2856, 2858: 2857, 2859: 2858, 2860: 2859, 2861: 2860, 2862: 2861, 2863: 2862, 2864: 2863, 2865: 2864, 2866: 2865, 2867: 2866, 2868: 2867, 2869: 2868, 2870: 2869, 2871: 2870, 2872: 2871, 2873: 2872, 2874: 2873, 2875: 2874, 2876: 2875, 2877: 2876, 2878: 2877, 2879: 2878, 2880: 2879, 2881: 2880, 2882: 2881, 2883: 2882, 2884: 2883, 2885: 2884, 2886: 2885, 2887: 2886, 2888: 2887, 2889: 2888, 2890: 2889, 2891: 2890, 2892: 2891, 2893: 2892, 2894: 2893, 2895: 2894, 2896: 2895, 2897: 2896, 2898: 2897, 2899: 2898, 2900: 2899, 2901: 2900, 2902: 2901, 2903: 2902, 2904: 2903, 2905: 2904, 2906: 2905, 2907: 2906, 2908: 2907, 2909: 2908, 2910: 2909, 2911: 2910, 2912: 2911, 2913: 2912, 2914: 2913, 2915: 2914, 2916: 2915, 2917: 2916, 2918: 2917, 2919: 2918, 2920: 2919, 2921: 2920, 2922: 2921, 2923: 2922, 2924: 2923, 2925: 2924, 2926: 2925, 2927: 2926, 2928: 2927, 2929: 2928, 2930: 2929, 2931: 2930, 2932: 2931, 2933: 2932, 2934: 2933, 2935: 2934, 2936: 2935, 2937: 2936, 2938: 2937, 2939: 2938, 2940: 2939, 2941: 2940, 2942: 2941, 2943: 2942, 2944: 2943, 2945: 2944, 2946: 2945, 2947: 2946, 2948: 2947, 2949: 2948, 2950: 2949, 2951: 2950, 2952: 2951, 2953: 2952, 2954: 2953, 2955: 2954, 2956: 2955, 2957: 2956, 2958: 2957, 2959: 2958, 2960: 2959, 2961: 2960, 2962: 2961, 2963: 2962, 2964: 2963, 2965: 2964, 2966: 2965, 2967: 2966, 2968: 2967, 2969: 2968, 2970: 2969, 2971: 2970, 2972: 2971, 2973: 2972, 2974: 2973, 2975: 2974, 2976: 2975, 2977: 2976, 2978: 2977, 2979: 2978, 2980: 2979, 2981: 2980, 2982: 2981, 2983: 2982, 2984: 2983, 2985: 2984, 2986: 2985, 2987: 2986, 2988: 2987, 2989: 2988, 2990: 2989, 2991: 2990, 2992: 2991, 2993: 2992, 2994: 2993, 2995: 2994, 2996: 2995, 2997: 2996, 2998: 2997, 2999: 2998, 3000: 2999, 3001: 3000, 3002: 3001, 3003: 3002, 3004: 3003, 3005: 3004, 3006: 3005, 3007: 3006, 3008: 3007, 3009: 3008, 3010: 3009, 3011: 3010, 3012: 3011, 3013: 3012, 3014: 3013, 3015: 3014, 3016: 3015, 3017: 3016, 3018: 3017, 3019: 3018, 3020: 3019, 3021: 3020, 3022: 3021, 3023: 3022, 3024: 3023, 3025: 3024, 3026: 3025, 3027: 3026, 3028: 3027, 3029: 3028, 3030: 3029, 3031: 3030, 3032: 3031, 3033: 3032, 3034: 3033, 3035: 3034, 3036: 3035, 3037: 3036, 3038: 3037, 3039: 3038, 3040: 3039, 3041: 3040, 3042: 3041, 3043: 3042, 3044: 3043, 3045: 3044, 3046: 3045, 3047: 3046, 3048: 3047, 3049: 3048, 3050: 3049, 3051: 3050, 3052: 3051, 3053: 3052, 3054: 3053, 3055: 3054, 3056: 3055, 3057: 3056, 3058: 3057, 3059: 3058, 3060: 3059, 3061: 3060, 3062: 3061, 3063: 3062, 3064: 3063, 3065: 3064, 3066: 3065, 3067: 3066, 3068: 3067, 3069: 3068, 3070: 3069, 3071: 3070, 3072: 3071, 3073: 3072, 3074: 3073, 3075: 3074, 3076: 3075, 3077: 3076, 3078: 3077, 3079: 3078, 3080: 3079, 3081: 3080, 3082: 3081, 3083: 3082, 3084: 3083, 3085: 3084, 3086: 3085, 3087: 3086, 3088: 3087, 3089: 3088, 3090: 3089, 3091: 3090, 3092: 3091, 3093: 3092, 3094: 3093, 3095: 3094, 3096: 3095, 3097: 3096, 3098: 3097, 3099: 3098, 3100: 3099, 3101: 3100, 3102: 3101, 3103: 3102, 3104: 3103, 3105: 3104, 3106: 3105, 3107: 3106, 3108: 3107, 3109: 3108, 3110: 3109, 3111: 3110, 3112: 3111, 3113: 3112, 3114: 3113, 3115: 3114, 3116: 3115, 3117: 3116, 3118: 3117, 3119: 3118, 3120: 3119, 3121: 3120, 3122: 3121, 3123: 3122, 3124: 3123, 3125: 3124, 3126: 3125, 3127: 3126, 3128: 3127, 3129: 3128, 3130: 3129, 3131: 3130, 3132: 3131, 3133: 3132, 3134: 3133, 3135: 3134, 3136: 3135, 3137: 3136, 3138: 3137, 3139: 3138, 3140: 3139, 3141: 3140, 3142: 3141, 3143: 3142, 3144: 3143, 3145: 3144, 3146: 3145, 3147: 3146, 3148: 3147, 3149: 3148, 3150: 3149, 3151: 3150, 3152: 3151, 3153: 3152, 3154: 3153, 3155: 3154, 3156: 3155, 3157: 3156, 3158: 3157, 3159: 3158, 3160: 3159, 3161: 3160, 3162: 3161, 3163: 3162, 3164: 3163, 3165: 3164, 3166: 3165, 3167: 3166, 3168: 3167, 3169: 3168, 3170: 3169, 3171: 3170, 3172: 3171, 3173: 3172, 3174: 3173, 3175: 3174, 3176: 3175, 3177: 3176, 3178: 3177, 3179: 3178, 3180: 3179, 3181: 3180, 3182: 3181, 3183: 3182, 3184: 3183, 3185: 3184, 3186: 3185, 3187: 3186, 3188: 3187, 3189: 3188, 3190: 3189, 3191: 3190, 3192: 3191, 3193: 3192, 3194: 3193, 3195: 3194, 3196: 3195, 3197: 3196, 3198: 3197, 3199: 3198, 3200: 3199, 3201: 3200, 3202: 3201, 3203: 3202, 3204: 3203, 3205: 3204, 3206: 3205, 3207: 3206, 3208: 3207, 3209: 3208, 3210: 3209, 3211: 3210, 3212: 3211, 3213: 3212, 3214: 3213, 3215: 3214, 3216: 3215, 3217: 3216, 3218: 3217, 3219: 3218, 3220: 3219, 3221: 3220, 3222: 3221, 3223: 3222, 3224: 3223, 3225: 3224, 3226: 3225, 3227: 3226, 3228: 3227, 3229: 3228, 3230: 3229, 3231: 3230, 3232: 3231, 3233: 3232, 3234: 3233, 3235: 3234, 3236: 3235, 3237: 3236, 3238: 3237, 3239: 3238, 3240: 3239, 3241: 3240, 3242: 3241, 3243: 3242, 3244: 3243, 3245: 3244, 3246: 3245, 3247: 3246, 3248: 3247, 3249: 3248, 3250: 3249, 3251: 3250, 3252: 3251, 3253: 3252, 3254: 3253, 3255: 3254, 3256: 3255, 3257: 3256, 3258: 3257, 3259: 3258, 3260: 3259, 3261: 3260, 3262: 3261, 3263: 3262, 3264: 3263, 3265: 3264, 3266: 3265, 3267: 3266, 3268: 3267, 3269: 3268, 3270: 3269, 3271: 3270, 3272: 3271, 3273: 3272, 3274: 3273, 3275: 3274, 3276: 3275, 3277: 3276, 3278: 3277, 3279: 3278, 3280: 3279, 3281: 3280, 3282: 3281, 3283: 3282, 3284: 3283, 3285: 3284, 3286: 3285, 3287: 3286, 3288: 3287, 3289: 3288, 3290: 3289, 3291: 3290, 3292: 3291, 3293: 3292, 3294: 3293, 3295: 3294, 3296: 3295, 3297: 3296, 3298: 3297, 3299: 3298, 3300: 3299, 3301: 3300, 3302: 3301, 3303: 3302, 3304: 3303, 3305: 3304, 3306: 3305, 3307: 3306, 3308: 3307, 3309: 3308, 3310: 3309, 3311: 3310, 3312: 3311, 3313: 3312, 3314: 3313, 3315: 3314, 3316: 3315, 3317: 3316, 3318: 3317, 3319: 3318, 3320: 3319, 3321: 3320, 3322: 3321, 3323: 3322, 3324: 3323, 3325: 3324, 3326: 3325, 3327: 3326, 3328: 3327, 3329: 3328, 3330: 3329, 3331: 3330, 3332: 3331, 3333: 3332, 3334: 3333, 3335: 3334, 3336: 3335, 3337: 3336, 3338: 3337, 3339: 3338, 3340: 3339, 3341: 3340, 3342: 3341, 3343: 3342, 3344: 3343, 3345: 3344, 3346: 3345, 3347: 3346, 3348: 3347, 3349: 3348, 3350: 3349, 3351: 3350, 3352: 3351, 3353: 3352, 3354: 3353, 3355: 3354, 3356: 3355, 3357: 3356, 3358: 3357, 3359: 3358, 3360: 3359, 3361: 3360, 3362: 3361, 3363: 3362, 3364: 3363, 3365: 3364, 3366: 3365, 3367: 3366, 3368: 3367, 3369: 3368, 3370: 3369, 3371: 3370, 3372: 3371, 3373: 3372, 3374: 3373, 3375: 3374, 3376: 3375, 3377: 3376, 3378: 3377, 3379: 3378, 3380: 3379, 3381: 3380, 3382: 3381, 3383: 3382, 3384: 3383, 3385: 3384, 3386: 3385, 3387: 3386, 3388: 3387, 3389: 3388, 3390: 3389, 3391: 3390, 3392: 3391, 3393: 3392, 3394: 3393, 3395: 3394, 3396: 3395, 3397: 3396, 3398: 3397, 3399: 3398, 3400: 3399, 3401: 3400, 3402: 3401, 3403: 3402, 3404: 3403, 3405: 3404, 3406: 3405, 3407: 3406, 3408: 3407, 3409: 3408, 3410: 3409, 3411: 3410, 3412: 3411, 3413: 3412, 3414: 3413, 3415: 3414, 3416: 3415, 3417: 3416, 3418: 3417, 3419: 3418, 3420: 3419, 3421: 3420, 3422: 3421, 3423: 3422, 3424: 3423, 3425: 3424, 3426: 3425, 3427: 3426, 3428: 3427, 3429: 3428, 3430: 3429, 3431: 3430, 3432: 3431, 3433: 3432, 3434: 3433, 3435: 3434, 3436: 3435, 3437: 3436, 3438: 3437, 3439: 3438, 3440: 3439, 3441: 3440, 3442: 3441, 3443: 3442, 3444: 3443, 3445: 3444, 3446: 3445, 3447: 3446, 3448: 3447, 3449: 3448, 3450: 3449, 3451: 3450, 3452: 3451, 3453: 3452, 3454: 3453, 3455: 3454, 3456: 3455, 3457: 3456, 3458: 3457, 3459: 3458, 3460: 3459, 3461: 3460, 3462: 3461, 3463: 3462, 3464: 3463, 3465: 3464, 3466: 3465, 3467: 3466, 3468: 3467, 3469: 3468, 3470: 3469, 3471: 3470, 3472: 3471, 3473: 3472, 3474: 3473, 3475: 3474, 3476: 3475, 3477: 3476, 3478: 3477, 3479: 3478, 3480: 3479, 3481: 3480, 3482: 3481, 3483: 3482, 3484: 3483, 3485: 3484, 3486: 3485, 3487: 3486, 3488: 3487, 3489: 3488, 3490: 3489, 3491: 3490, 3492: 3491, 3493: 3492, 3494: 3493, 3495: 3494, 3496: 3495, 3497: 3496, 3498: 3497, 3499: 3498, 3500: 3499, 3501: 3500, 3502: 3501, 3503: 3502, 3504: 3503, 3505: 3504, 3506: 3505, 3507: 3506, 3508: 3507, 3509: 3508, 3510: 3509, 3511: 3510, 3512: 3511, 3513: 3512, 3514: 3513, 3515: 3514, 3516: 3515, 3517: 3516, 3518: 3517, 3519: 3518, 3520: 3519, 3521: 3520, 3522: 3521, 3523: 3522, 3524: 3523, 3525: 3524, 3526: 3525, 3527: 3526, 3528: 3527, 3529: 3528, 3530: 3529, 3531: 3530, 3532: 3531, 3533: 3532, 3534: 3533, 3535: 3534, 3536: 3535, 3537: 3536, 3538: 3537, 3539: 3538, 3540: 3539, 3541: 3540, 3542: 3541, 3543: 3542, 3544: 3543, 3545: 3544, 3546: 3545, 3547: 3546, 3548: 3547, 3549: 3548, 3550: 3549, 3551: 3550, 3552: 3551, 3553: 3552, 3554: 3553, 3555: 3554, 3556: 3555, 3557: 3556, 3558: 3557, 3559: 3558, 3560: 3559, 3561: 3560, 3562: 3561, 3563: 3562, 3564: 3563, 3565: 3564, 3566: 3565, 3567: 3566, 3568: 3567, 3569: 3568, 3570: 3569, 3571: 3570, 3572: 3571, 3573: 3572, 3574: 3573, 3575: 3574, 3576: 3575, 3577: 3576, 3578: 3577, 3579: 3578, 3580: 3579, 3581: 3580, 3582: 3581, 3583: 3582, 3584: 3583, 3585: 3584, 3586: 3585, 3587: 3586, 3588: 3587, 3589: 3588, 3590: 3589, 3591: 3590, 3592: 3591, 3593: 3592, 3594: 3593, 3595: 3594, 3596: 3595, 3597: 3596, 3598: 3597, 3599: 3598, 3600: 3599, 3601: 3600, 3602: 3601, 3603: 3602, 3604: 3603, 3605: 3604, 3606: 3605, 3607: 3606, 3608: 3607, 3609: 3608, 3610: 3609, 3611: 3610, 3612: 3611, 3613: 3612, 3614: 3613, 3615: 3614, 3616: 3615, 3617: 3616, 3618: 3617, 3619: 3618, 3620: 3619, 3621: 3620, 3622: 3621, 3623: 3622, 3624: 3623, 3625: 3624, 3626: 3625, 3627: 3626, 3628: 3627, 3629: 3628, 3630: 3629, 3631: 3630, 3632: 3631, 3633: 3632, 3634: 3633, 3635: 3634, 3636: 3635, 3637: 3636, 3638: 3637, 3639: 3638, 3640: 3639, 3641: 3640, 3642: 3641, 3643: 3642, 3644: 3643, 3645: 3644, 3646: 3645, 3647: 3646, 3648: 3647, 3649: 3648, 3650: 3649, 3651: 3650, 3652: 3651, 3653: 3652, 3654: 3653, 3655: 3654, 3656: 3655, 3657: 3656, 3658: 3657, 3659: 3658, 3660: 3659, 3661: 3660, 3662: 3661, 3663: 3662, 3664: 3663, 3665: 3664, 3666: 3665, 3667: 3666, 3668: 3667, 3669: 3668, 3670: 3669, 3671: 3670, 3672: 3671, 3673: 3672, 3674: 3673, 3675: 3674, 3676: 3675, 3677: 3676, 3678: 3677, 3679: 3678, 3680: 3679, 3681: 3680, 3682: 3681, 3683: 3682, 3684: 3683, 3685: 3684, 3686: 3685, 3687: 3686, 3688: 3687, 3689: 3688, 3690: 3689, 3691: 3690, 3692: 3691, 3693: 3692, 3694: 3693, 3695: 3694, 3696: 3695, 3697: 3696, 3698: 3697, 3699: 3698, 3700: 3699, 3701: 3700, 3702: 3701, 3703: 3702, 3704: 3703, 3705: 3704, 3706: 3705, 3707: 3706, 3708: 3707, 3709: 3708, 3710: 3709, 3711: 3710, 3712: 3711, 3713: 3712, 3714: 3713, 3715: 3714, 3716: 3715, 3717: 3716, 3718: 3717, 3719: 3718, 3720: 3719, 3721: 3720, 3722: 3721, 3723: 3722, 3724: 3723, 3725: 3724, 3726: 3725, 3727: 3726, 3728: 3727, 3729: 3728, 3730: 3729, 3731: 3730, 3732: 3731, 3733: 3732, 3734: 3733, 3735: 3734, 3736: 3735, 3737: 3736, 3738: 3737, 3739: 3738, 3740: 3739, 3741: 3740, 3742: 3741, 3743: 3742, 3744: 3743, 3745: 3744, 3746: 3745, 3747: 3746, 3748: 3747, 3749: 3748, 3750: 3749, 3751: 3750, 3752: 3751, 3753: 3752, 3754: 3753, 3755: 3754, 3756: 3755, 3757: 3756, 3758: 3757, 3759: 3758, 3760: 3759, 3761: 3760, 3762: 3761, 3763: 3762, 3764: 3763, 3765: 3764, 3766: 3765, 3767: 3766, 3768: 3767, 3769: 3768, 3770: 3769, 3771: 3770, 3772: 3771, 3773: 3772, 3774: 3773, 3775: 3774, 3776: 3775, 3777: 3776, 3778: 3777, 3779: 3778, 3780: 3779, 3781: 3780, 3782: 3781, 3783: 3782, 3784: 3783, 3785: 3784, 3786: 3785, 3787: 3786, 3788: 3787, 3789: 3788, 3790: 3789, 3791: 3790, 3792: 3791, 3793: 3792, 3794: 3793, 3795: 3794, 3796: 3795, 3797: 3796, 3798: 3797, 3799: 3798, 3800: 3799, 3801: 3800, 3802: 3801, 3803: 3802, 3804: 3803, 3805: 3804, 3806: 3805, 3807: 3806, 3808: 3807, 3809: 3808, 3810: 3809, 3811: 3810, 3812: 3811, 3813: 3812, 3814: 3813, 3815: 3814, 3816: 3815, 3817: 3816, 3818: 3817, 3819: 3818, 3820: 3819, 3821: 3820, 3822: 3821, 3823: 3822, 3824: 3823, 3825: 3824, 3826: 3825, 3827: 3826, 3828: 3827, 3829: 3828, 3830: 3829, 3831: 3830, 3832: 3831, 3833: 3832, 3834: 3833, 3835: 3834, 3836: 3835, 3837: 3836, 3838: 3837, 3839: 3838, 3840: 3839, 3841: 3840, 3842: 3841, 3843: 3842, 3844: 3843, 3845: 3844, 3846: 3845, 3847: 3846, 3848: 3847, 3849: 3848, 3850: 3849, 3851: 3850, 3852: 3851, 3853: 3852, 3854: 3853, 3855: 3854, 3856: 3855, 3857: 3856, 3858: 3857, 3859: 3858, 3860: 3859, 3861: 3860, 3862: 3861, 3863: 3862, 3864: 3863, 3865: 3864, 3866: 3865, 3867: 3866, 3868: 3867, 3869: 3868, 3870: 3869, 3871: 3870, 3872: 3871, 3873: 3872, 3874: 3873, 3875: 3874, 3876: 3875, 3877: 3876, 3878: 3877, 3879: 3878, 3880: 3879, 3881: 3880, 3882: 3881, 3883: 3882, 3884: 3883, 3885: 3884, 3886: 3885, 3887: 3886, 3888: 3887, 3889: 3888, 3890: 3889, 3891: 3890, 3892: 3891, 3893: 3892, 3894: 3893, 3895: 3894, 3896: 3895, 3897: 3896, 3898: 3897, 3899: 3898, 3900: 3899, 3901: 3900, 3902: 3901, 3903: 3902, 3904: 3903, 3905: 3904, 3906: 3905, 3907: 3906, 3908: 3907, 3909: 3908, 3910: 3909, 3911: 3910, 3912: 3911, 3913: 3912, 3914: 3913, 3915: 3914, 3916: 3915, 3917: 3916, 3918: 3917, 3919: 3918, 3920: 3919, 3921: 3920, 3922: 3921, 3923: 3922, 3924: 3923, 3925: 3924, 3926: 3925, 3927: 3926, 3928: 3927, 3929: 3928, 3930: 3929, 3931: 3930, 3932: 3931, 3933: 3932, 3934: 3933, 3935: 3934, 3936: 3935, 3937: 3936, 3938: 3937, 3939: 3938, 3940: 3939, 3941: 3940, 3942: 3941, 3943: 3942, 3944: 3943, 3945: 3944, 3946: 3945, 3947: 3946, 3948: 3947, 3949: 3948, 3950: 3949, 3951: 3950, 3952: 3951, 3953: 3952, 3954: 3953, 3955: 3954, 3956: 3955, 3957: 3956, 3958: 3957, 3959: 3958, 3960: 3959, 3961: 3960, 3962: 3961, 3963: 3962, 3964: 3963, 3965: 3964, 3966: 3965, 3967: 3966, 3968: 3967, 3969: 3968, 3970: 3969, 3971: 3970, 3972: 3971, 3973: 3972, 3974: 3973, 3975: 3974, 3976: 3975, 3977: 3976, 3978: 3977, 3979: 3978, 3980: 3979, 3981: 3980, 3982: 3981, 3983: 3982, 3984: 3983, 3985: 3984, 3986: 3985, 3987: 3986, 3988: 3987, 3989: 3988, 3990: 3989, 3991: 3990, 3992: 3991, 3993: 3992, 3994: 3993, 3995: 3994, 3996: 3995, 3997: 3996, 3998: 3997, 3999: 3998, 4000: 3999, 4001: 4000, 4002: 4001, 4003: 4002, 4004: 4003, 4005: 4004, 4006: 4005, 4007: 4006, 4008: 4007, 4009: 4008, 4010: 4009, 4011: 4010, 4012: 4011, 4013: 4012, 4014: 4013, 4015: 4014, 4016: 4015, 4017: 4016, 4018: 4017, 4019: 4018, 4020: 4019, 4021: 4020, 4022: 4021, 4023: 4022, 4024: 4023, 4025: 4024, 4026: 4025, 4027: 4026, 4028: 4027, 4029: 4028, 4030: 4029, 4031: 4030, 4032: 4031, 4033: 4032, 4034: 4033, 4035: 4034, 4036: 4035, 4037: 4036, 4038: 4037, 4039: 4038, 4040: 4039, 4041: 4040, 4042: 4041, 4043: 4042, 4044: 4043, 4045: 4044, 4046: 4045, 4047: 4046, 4048: 4047, 4049: 4048, 4050: 4049, 4051: 4050, 4052: 4051, 4053: 4052, 4054: 4053, 4055: 4054, 4056: 4055, 4057: 4056, 4058: 4057, 4059: 4058, 4060: 4059, 4061: 4060, 4062: 4061, 4063: 4062, 4064: 4063, 4065: 4064, 4066: 4065, 4067: 4066, 4068: 4067, 4069: 4068, 4070: 4069, 4071: 4070, 4072: 4071, 4073: 4072, 4074: 4073, 4075: 4074, 4076: 4075, 4077: 4076, 4078: 4077, 4079: 4078, 4080: 4079, 4081: 4080, 4082: 4081, 4083: 4082, 4084: 4083, 4085: 4084, 4086: 4085, 4087: 4086, 4088: 4087, 4089: 4088, 4090: 4089, 4091: 4090, 4092: 4091, 4093: 4092, 4094: 4093, 4095: 4094, 4096: 4095, 4097: 4096, 4098: 4097, 4099: 4098, 4100: 4099, 4101: 4100, 4102: 4101, 4103: 4102, 4104: 4103, 4105: 4104, 4106: 4105, 4107: 4106, 4108: 4107, 4109: 4108, 4110: 4109, 4111: 4110, 4112: 4111, 4113: 4112, 4114: 4113, 4115: 4114, 4116: 4115, 4117: 4116, 4118: 4117, 4119: 4118, 4120: 4119, 4121: 4120, 4122: 4121, 4123: 4122, 4124: 4123, 4125: 4124, 4126: 4125, 4127: 4126, 4128: 4127, 4129: 4128, 4130: 4129, 4131: 4130, 4132: 4131, 4133: 4132, 4134: 4133, 4135: 4134, 4136: 4135, 4137: 4136, 4138: 4137, 4139: 4138, 4140: 4139, 4141: 4140, 4142: 4141, 4143: 4142, 4144: 4143, 4145: 4144, 4146: 4145, 4147: 4146, 4148: 4147, 4149: 4148, 4150: 4149, 4151: 4150, 4152: 4151, 4153: 4152, 4154: 4153, 4155: 4154, 4156: 4155, 4157: 4156, 4158: 4157, 4159: 4158, 4160: 4159, 4161: 4160, 4162: 4161, 4163: 4162, 4164: 4163, 4165: 4164, 4166: 4165, 4167: 4166, 4168: 4167, 4169: 4168, 4170: 4169, 4171: 4170, 4172: 4171, 4173: 4172, 4174: 4173, 4175: 4174, 4176: 4175, 4177: 4176, 4178: 4177, 4179: 4178, 4180: 4179, 4181: 4180, 4182: 4181, 4183: 4182, 4184: 4183, 4185: 4184, 4186: 4185, 4187: 4186, 4188: 4187, 4189: 4188, 4190: 4189, 4191: 4190, 4192: 4191, 4193: 4192, 4194: 4193, 4195: 4194, 4196: 4195, 4197: 4196, 4198: 4197, 4199: 4198, 4200: 4199, 4201: 4200, 4202: 4201, 4203: 4202, 4204: 4203, 4205: 4204, 4206: 4205, 4207: 4206, 4208: 4207, 4209: 4208, 4210: 4209, 4211: 4210, 4212: 4211, 4213: 4212, 4214: 4213, 4215: 4214, 4216: 4215, 4217: 4216, 4218: 4217, 4219: 4218, 4220: 4219, 4221: 4220, 4222: 4221, 4223: 4222, 4224: 4223, 4225: 4224, 4226: 4225, 4227: 4226, 4228: 4227, 4229: 4228, 4230: 4229, 4231: 4230, 4232: 4231, 4233: 4232, 4234: 4233, 4235: 4234, 4236: 4235, 4237: 4236, 4238: 4237, 4239: 4238, 4240: 4239, 4241: 4240, 4242: 4241, 4243: 4242, 4244: 4243, 4245: 4244, 4246: 4245, 4247: 4246, 4248: 4247, 4249: 4248, 4250: 4249, 4251: 4250, 4252: 4251, 4253: 4252, 4254: 4253, 4255: 4254, 4256: 4255, 4257: 4256, 4258: 4257, 4259: 4258, 4260: 4259, 4261: 4260, 4262: 4261, 4263: 4262, 4264: 4263, 4265: 4264, 4266: 4265, 4267: 4266, 4268: 4267, 4269: 4268, 4270: 4269, 4271: 4270, 4272: 4271, 4273: 4272, 4274: 4273, 4275: 4274, 4276: 4275, 4277: 4276, 4278: 4277, 4279: 4278, 4280: 4279, 4281: 4280, 4282: 4281, 4283: 4282, 4284: 4283, 4285: 4284, 4286: 4285, 4287: 4286, 4288: 4287, 4289: 4288, 4290: 4289, 4291: 4290, 4292: 4291, 4293: 4292, 4294: 4293, 4295: 4294, 4296: 4295, 4297: 4296, 4298: 4297, 4299: 4298, 4300: 4299, 4301: 4300, 4302: 4301, 4303: 4302, 4304: 4303, 4305: 4304, 4306: 4305, 4307: 4306, 4308: 4307, 4309: 4308, 4310: 4309, 4311: 4310, 4312: 4311, 4313: 4312, 4314: 4313, 4315: 4314, 4316: 4315, 4317: 4316, 4318: 4317, 4319: 4318, 4320: 4319, 4321: 4320, 4322: 4321, 4323: 4322, 4324: 4323, 4325: 4324, 4326: 4325, 4327: 4326, 4328: 4327, 4329: 4328, 4330: 4329, 4331: 4330, 4332: 4331, 4333: 4332, 4334: 4333, 4335: 4334, 4336: 4335, 4337: 4336, 4338: 4337, 4339: 4338, 4340: 4339, 4341: 4340, 4342: 4341, 4343: 4342, 4344: 4343, 4345: 4344, 4346: 4345, 4347: 4346, 4348: 4347, 4349: 4348, 4350: 4349, 4351: 4350, 4352: 4351, 4353: 4352, 4354: 4353, 4355: 4354, 4356: 4355, 4357: 4356, 4358: 4357, 4359: 4358, 4360: 4359, 4361: 4360, 4362: 4361, 4363: 4362, 4364: 4363, 4365: 4364, 4366: 4365, 4367: 4366, 4368: 4367, 4369: 4368, 4370: 4369, 4371: 4370, 4372: 4371, 4373: 4372, 4374: 4373, 4375: 4374, 4376: 4375, 4377: 4376, 4378: 4377, 4379: 4378, 4380: 4379, 4381: 4380, 4382: 4381, 4383: 4382, 4384: 4383, 4385: 4384, 4386: 4385, 4387: 4386, 4388: 4387, 4389: 4388, 4390: 4389, 4391: 4390, 4392: 4391, 4393: 4392, 4394: 4393, 4395: 4394, 4396: 4395, 4397: 4396, 4398: 4397, 4399: 4398, 4400: 4399, 4401: 4400, 4402: 4401, 4403: 4402, 4404: 4403, 4405: 4404, 4406: 4405, 4407: 4406, 4408: 4407, 4409: 4408, 4410: 4409, 4411: 4410, 4412: 4411, 4413: 4412, 4414: 4413, 4415: 4414, 4416: 4415, 4417: 4416, 4418: 4417, 4419: 4418, 4420: 4419, 4421: 4420, 4422: 4421, 4423: 4422, 4424: 4423, 4425: 4424, 4426: 4425, 4427: 4426, 4428: 4427, 4429: 4428, 4430: 4429, 4431: 4430, 4432: 4431, 4433: 4432, 4434: 4433, 4435: 4434, 4436: 4435, 4437: 4436, 4438: 4437, 4439: 4438, 4440: 4439, 4441: 4440, 4442: 4441, 4443: 4442, 4444: 4443, 4445: 4444, 4446: 4445, 4447: 4446, 4448: 4447, 4449: 4448, 4450: 4449, 4451: 4450, 4452: 4451, 4453: 4452, 4454: 4453, 4455: 4454, 4456: 4455, 4457: 4456, 4458: 4457, 4459: 4458, 4460: 4459, 4461: 4460, 4462: 4461, 4463: 4462, 4464: 4463, 4465: 4464, 4466: 4465, 4467: 4466, 4468: 4467, 4469: 4468, 4470: 4469, 4471: 4470, 4472: 4471, 4473: 4472, 4474: 4473, 4475: 4474, 4476: 4475, 4477: 4476, 4478: 4477, 4479: 4478, 4480: 4479, 4481: 4480, 4482: 4481, 4483: 4482, 4484: 4483, 4485: 4484, 4486: 4485, 4487: 4486, 4488: 4487, 4489: 4488, 4490: 4489, 4491: 4490, 4492: 4491, 4493: 4492, 4494: 4493, 4495: 4494, 4496: 4495, 4497: 4496, 4498: 4497, 4499: 4498, 4500: 4499, 4501: 4500, 4502: 4501, 4503: 4502, 4504: 4503, 4505: 4504, 4506: 4505, 4507: 4506, 4508: 4507, 4509: 4508, 4510: 4509, 4511: 4510, 4512: 4511, 4513: 4512, 4514: 4513, 4515: 4514, 4516: 4515, 4517: 4516, 4518: 4517, 4519: 4518, 4520: 4519, 4521: 4520, 4522: 4521, 4523: 4522, 4524: 4523, 4525: 4524, 4526: 4525, 4527: 4526, 4528: 4527, 4529: 4528, 4530: 4529, 4531: 4530, 4532: 4531, 4533: 4532, 4534: 4533, 4535: 4534, 4536: 4535, 4537: 4536, 4538: 4537, 4539: 4538, 4540: 4539, 4541: 4540, 4542: 4541, 4543: 4542, 4544: 4543, 4545: 4544, 4546: 4545, 4547: 4546, 4548: 4547, 4549: 4548, 4550: 4549, 4551: 4550, 4552: 4551, 4553: 4552, 4554: 4553, 4555: 4554, 4556: 4555, 4557: 4556, 4558: 4557, 4559: 4558, 4560: 4559, 4561: 4560, 4562: 4561, 4563: 4562, 4564: 4563, 4565: 4564, 4566: 4565, 4567: 4566, 4568: 4567, 4569: 4568, 4570: 4569, 4571: 4570, 4572: 4571, 4573: 4572, 4574: 4573, 4575: 4574, 4576: 4575, 4577: 4576, 4578: 4577, 4579: 4578, 4580: 4579, 4581: 4580, 4582: 4581, 4583: 4582, 4584: 4583, 4585: 4584, 4586: 4585, 4587: 4586, 4588: 4587, 4589: 4588, 4590: 4589, 4591: 4590, 4592: 4591, 4593: 4592, 4594: 4593, 4595: 4594, 4596: 4595, 4597: 4596, 4598: 4597, 4599: 4598, 4600: 4599, 4601: 4600, 4602: 4601, 4603: 4602, 4604: 4603, 4605: 4604, 4606: 4605, 4607: 4606, 4608: 4607, 4609: 4608, 4610: 4609, 4611: 4610, 4612: 4611, 4613: 4612, 4614: 4613, 4615: 4614, 4616: 4615, 4617: 4616, 4618: 4617, 4619: 4618, 4620: 4619, 4621: 4620, 4622: 4621, 4623: 4622, 4624: 4623, 4625: 4624, 4626: 4625, 4627: 4626, 4628: 4627, 4629: 4628, 4630: 4629, 4631: 4630, 4632: 4631, 4633: 4632, 4634: 4633, 4635: 4634, 4636: 4635, 4637: 4636, 4638: 4637, 4639: 4638, 4640: 4639, 4641: 4640, 4642: 4641, 4643: 4642, 4644: 4643, 4645: 4644, 4646: 4645, 4647: 4646, 4648: 4647, 4649: 4648, 4650: 4649, 4651: 4650, 4652: 4651, 4653: 4652, 4654: 4653, 4655: 4654, 4656: 4655, 4657: 4656, 4658: 4657, 4659: 4658, 4660: 4659, 4661: 4660, 4662: 4661, 4663: 4662, 4664: 4663, 4665: 4664, 4666: 4665, 4667: 4666, 4668: 4667, 4669: 4668, 4670: 4669, 4671: 4670, 4672: 4671, 4673: 4672, 4674: 4673, 4675: 4674, 4676: 4675, 4677: 4676, 4678: 4677, 4679: 4678, 4680: 4679, 4681: 4680, 4682: 4681, 4683: 4682, 4684: 4683, 4685: 4684, 4686: 4685, 4687: 4686, 4688: 4687, 4689: 4688, 4690: 4689, 4691: 4690, 4692: 4691, 4693: 4692, 4694: 4693, 4695: 4694, 4696: 4695, 4697: 4696, 4698: 4697, 4699: 4698, 4700: 4699, 4701: 4700, 4702: 4701, 4703: 4702, 4704: 4703, 4705: 4704, 4706: 4705, 4707: 4706, 4708: 4707, 4709: 4708, 4710: 4709, 4711: 4710, 4712: 4711, 4713: 4712, 4714: 4713, 4715: 4714, 4716: 4715, 4717: 4716, 4718: 4717, 4719: 4718, 4720: 4719, 4721: 4720, 4722: 4721, 4723: 4722, 4724: 4723, 4725: 4724, 4726: 4725, 4727: 4726, 4728: 4727, 4729: 4728, 4730: 4729, 4731: 4730, 4732: 4731, 4733: 4732, 4734: 4733, 4735: 4734, 4736: 4735, 4737: 4736, 4738: 4737, 4739: 4738, 4740: 4739, 4741: 4740, 4742: 4741, 4743: 4742, 4744: 4743, 4745: 4744, 4746: 4745, 4747: 4746, 4748: 4747, 4749: 4748, 4750: 4749, 4751: 4750, 4752: 4751, 4753: 4752, 4754: 4753, 4755: 4754, 4756: 4755, 4757: 4756, 4758: 4757, 4759: 4758, 4760: 4759, 4761: 4760, 4762: 4761, 4763: 4762, 4764: 4763, 4765: 4764, 4766: 4765, 4767: 4766, 4768: 4767, 4769: 4768, 4770: 4769, 4771: 4770, 4772: 4771, 4773: 4772, 4774: 4773, 4775: 4774, 4776: 4775, 4777: 4776, 4778: 4777, 4779: 4778, 4780: 4779, 4781: 4780, 4782: 4781, 4783: 4782, 4784: 4783, 4785: 4784, 4786: 4785, 4787: 4786, 4788: 4787, 4789: 4788, 4790: 4789, 4791: 4790, 4792: 4791, 4793: 4792, 4794: 4793, 4795: 4794, 4796: 4795, 4797: 4796, 4798: 4797, 4799: 4798, 4800: 4799, 4801: 4800, 4802: 4801, 4803: 4802, 4804: 4803, 4805: 4804, 4806: 4805, 4807: 4806, 4808: 4807, 4809: 4808, 4810: 4809, 4811: 4810, 4812: 4811, 4813: 4812, 4814: 4813, 4815: 4814, 4816: 4815, 4817: 4816, 4818: 4817, 4819: 4818, 4820: 4819, 4821: 4820, 4822: 4821, 4823: 4822, 4824: 4823, 4825: 4824, 4826: 4825, 4827: 4826, 4828: 4827, 4829: 4828, 4830: 4829, 4831: 4830, 4832: 4831, 4833: 4832, 4834: 4833, 4835: 4834, 4836: 4835, 4837: 4836, 4838: 4837, 4839: 4838, 4840: 4839, 4841: 4840, 4842: 4841, 4843: 4842, 4844: 4843, 4845: 4844, 4846: 4845, 4847: 4846, 4848: 4847, 4849: 4848, 4850: 4849, 4851: 4850, 4852: 4851, 4853: 4852, 4854: 4853, 4855: 4854, 4856: 4855, 4857: 4856, 4858: 4857, 4859: 4858, 4860: 4859, 4861: 4860, 4862: 4861, 4863: 4862, 4864: 4863, 4865: 4864, 4866: 4865, 4867: 4866, 4868: 4867, 4869: 4868, 4870: 4869, 4871: 4870, 4872: 4871, 4873: 4872, 4874: 4873, 4875: 4874, 4876: 4875, 4877: 4876, 4878: 4877, 4879: 4878, 4880: 4879, 4881: 4880, 4882: 4881, 4883: 4882, 4884: 4883, 4885: 4884, 4886: 4885, 4887: 4886, 4888: 4887, 4889: 4888, 4890: 4889, 4891: 4890, 4892: 4891, 4893: 4892, 4894: 4893, 4895: 4894, 4896: 4895, 4897: 4896, 4898: 4897, 4899: 4898, 4900: 4899, 4901: 4900, 4902: 4901, 4903: 4902, 4904: 4903, 4905: 4904, 4906: 4905, 4907: 4906, 4908: 4907, 4909: 4908, 4910: 4909, 4911: 4910, 4912: 4911, 4913: 4912, 4914: 4913, 4915: 4914, 4916: 4915, 4917: 4916, 4918: 4917, 4919: 4918, 4920: 4919, 4921: 4920, 4922: 4921, 4923: 4922, 4924: 4923, 4925: 4924, 4926: 4925, 4927: 4926, 4928: 4927, 4929: 4928, 4930: 4929, 4931: 4930, 4932: 4931, 4933: 4932, 4934: 4933, 4935: 4934, 4936: 4935, 4937: 4936, 4938: 4937, 4939: 4938, 4940: 4939, 4941: 4940, 4942: 4941, 4943: 4942, 4944: 4943, 4945: 4944, 4946: 4945, 4947: 4946, 4948: 4947, 4949: 4948, 4950: 4949, 4951: 4950, 4952: 4951, 4953: 4952, 4954: 4953, 4955: 4954, 4956: 4955, 4957: 4956, 4958: 4957, 4959: 4958, 4960: 4959, 4961: 4960, 4962: 4961, 4963: 4962, 4964: 4963, 4965: 4964, 4966: 4965, 4967: 4966, 4968: 4967, 4969: 4968, 4970: 4969, 4971: 4970, 4972: 4971, 4973: 4972, 4974: 4973, 4975: 4974, 4976: 4975, 4977: 4976, 4978: 4977, 4979: 4978, 4980: 4979, 4981: 4980, 4982: 4981, 4983: 4982, 4984: 4983, 4985: 4984, 4986: 4985, 4987: 4986, 4988: 4987, 4989: 4988, 4990: 4989, 4991: 4990, 4992: 4991, 4993: 4992, 4994: 4993, 4995: 4994, 4996: 4995, 4997: 4996, 4998: 4997, 4999: 4998, 5000: 4999, 5001: 5000, 5002: 5001, 5003: 5002, 5004: 5003, 5005: 5004, 5006: 5005, 5007: 5006, 5008: 5007, 5009: 5008, 5010: 5009, 5011: 5010, 5012: 5011, 5013: 5012, 5014: 5013, 5015: 5014, 5016: 5015, 5017: 5016, 5018: 5017, 5019: 5018, 5020: 5019, 5021: 5020, 5022: 5021, 5023: 5022, 5024: 5023, 5025: 5024, 5026: 5025, 5027: 5026, 5028: 5027, 5029: 5028, 5030: 5029, 5031: 5030, 5032: 5031, 5033: 5032, 5034: 5033, 5035: 5034, 5036: 5035, 5037: 5036, 5038: 5037, 5039: 5038, 5040: 5039, 5041: 5040, 5042: 5041, 5043: 5042, 5044: 5043, 5045: 5044, 5046: 5045, 5047: 5046, 5048: 5047, 5049: 5048, 5050: 5049, 5051: 5050, 5052: 5051, 5053: 5052, 5054: 5053, 5055: 5054, 5056: 5055, 5057: 5056, 5058: 5057, 5059: 5058, 5060: 5059, 5061: 5060, 5062: 5061, 5063: 5062, 5064: 5063, 5065: 5064, 5066: 5065, 5067: 5066, 5068: 5067, 5069: 5068, 5070: 5069, 5071: 5070, 5072: 5071, 5073: 5072, 5074: 5073, 5075: 5074, 5076: 5075, 5077: 5076, 5078: 5077, 5079: 5078, 5080: 5079, 5081: 5080, 5082: 5081, 5083: 5082, 5084: 5083, 5085: 5084, 5086: 5085, 5087: 5086, 5088: 5087, 5089: 5088, 5090: 5089, 5091: 5090, 5092: 5091, 5093: 5092, 5094: 5093, 5095: 5094, 5096: 5095, 5097: 5096, 5098: 5097, 5099: 5098, 5100: 5099, 5101: 5100, 5102: 5101, 5103: 5102, 5104: 5103, 5105: 5104, 5106: 5105, 5107: 5106, 5108: 5107, 5109: 5108, 5110: 5109, 5111: 5110, 5112: 5111, 5113: 5112, 5114: 5113, 5115: 5114, 5116: 5115, 5117: 5116, 5118: 5117, 5119: 5118, 5120: 5119, 5121: 5120, 5122: 5121, 5123: 5122, 5124: 5123, 5125: 5124, 5126: 5125, 5127: 5126, 5128: 5127, 5129: 5128, 5130: 5129, 5131: 5130, 5132: 5131, 5133: 5132, 5134: 5133, 5135: 5134, 5136: 5135, 5137: 5136, 5138: 5137, 5139: 5138, 5140: 5139, 5141: 5140, 5142: 5141, 5143: 5142, 5144: 5143, 5145: 5144, 5146: 5145, 5147: 5146, 5148: 5147, 5149: 5148, 5150: 5149, 5151: 5150, 5152: 5151, 5153: 5152, 5154: 5153, 5155: 5154, 5156: 5155, 5157: 5156, 5158: 5157, 5159: 5158, 5160: 5159, 5161: 5160, 5162: 5161, 5163: 5162, 5164: 5163, 5165: 5164, 5166: 5165, 5167: 5166, 5168: 5167, 5169: 5168, 5170: 5169, 5171: 5170, 5172: 5171, 5173: 5172, 5174: 5173, 5175: 5174, 5176: 5175, 5177: 5176, 5178: 5177, 5179: 5178, 5180: 5179, 5181: 5180, 5182: 5181, 5183: 5182, 5184: 5183, 5185: 5184, 5186: 5185, 5187: 5186, 5188: 5187, 5189: 5188, 5190: 5189, 5191: 5190, 5192: 5191, 5193: 5192, 5194: 5193, 5195: 5194, 5196: 5195, 5197: 5196, 5198: 5197, 5199: 5198, 5200: 5199, 5201: 5200, 5202: 5201, 5203: 5202, 5204: 5203, 5205: 5204, 5206: 5205, 5207: 5206, 5208: 5207, 5209: 5208, 5210: 5209, 5211: 5210, 5212: 5211, 5213: 5212, 5214: 5213, 5215: 5214, 5216: 5215, 5217: 5216, 5218: 5217, 5219: 5218, 5220: 5219, 5221: 5220, 5222: 5221, 5223: 5222, 5224: 5223, 5225: 5224, 5226: 5225, 5227: 5226, 5228: 5227, 5229: 5228, 5230: 5229, 5231: 5230, 5232: 5231, 5233: 5232, 5234: 5233, 5235: 5234, 5236: 5235, 5237: 5236, 5238: 5237, 5239: 5238, 5240: 5239, 5241: 5240, 5242: 5241, 5243: 5242, 5244: 5243, 5245: 5244, 5246: 5245, 5247: 5246, 5248: 5247, 5249: 5248, 5250: 5249, 5251: 5250, 5252: 5251, 5253: 5252, 5254: 5253, 5255: 5254, 5256: 5255, 5257: 5256, 5258: 5257, 5259: 5258, 5260: 5259, 5261: 5260, 5262: 5261, 5263: 5262, 5264: 5263, 5265: 5264, 5266: 5265, 5267: 5266, 5268: 5267, 5269: 5268, 5270: 5269, 5271: 5270, 5272: 5271, 5273: 5272, 5274: 5273, 5275: 5274, 5276: 5275, 5277: 5276, 5278: 5277, 5279: 5278, 5280: 5279, 5281: 5280, 5282: 5281, 5283: 5282, 5284: 5283, 5285: 5284, 5286: 5285, 5287: 5286, 5288: 5287, 5289: 5288, 5290: 5289, 5291: 5290, 5292: 5291, 5293: 5292, 5294: 5293, 5295: 5294, 5296: 5295, 5297: 5296, 5298: 5297, 5299: 5298, 5300: 5299, 5301: 5300, 5302: 5301, 5303: 5302, 5304: 5303, 5305: 5304, 5306: 5305, 5307: 5306, 5308: 5307, 5309: 5308, 5310: 5309, 5311: 5310, 5312: 5311, 5313: 5312, 5314: 5313, 5315: 5314, 5316: 5315, 5317: 5316, 5318: 5317, 5319: 5318, 5320: 5319, 5321: 5320, 5322: 5321, 5323: 5322, 5324: 5323, 5325: 5324, 5326: 5325, 5327: 5326, 5328: 5327, 5329: 5328, 5330: 5329, 5331: 5330, 5332: 5331, 5333: 5332, 5334: 5333, 5335: 5334, 5336: 5335, 5337: 5336, 5338: 5337, 5339: 5338, 5340: 5339, 5341: 5340, 5342: 5341, 5343: 5342, 5344: 5343, 5345: 5344, 5346: 5345, 5347: 5346, 5348: 5347, 5349: 5348, 5350: 5349, 5351: 5350, 5352: 5351, 5353: 5352, 5354: 5353, 5355: 5354, 5356: 5355, 5357: 5356, 5358: 5357, 5359: 5358, 5360: 5359, 5361: 5360, 5362: 5361, 5363: 5362, 5364: 5363, 5365: 5364, 5366: 5365, 5367: 5366, 5368: 5367, 5369: 5368, 5370: 5369, 5371: 5370, 5372: 5371, 5373: 5372, 5374: 5373, 5375: 5374, 5376: 5375, 5377: 5376, 5378: 5377, 5379: 5378, 5380: 5379, 5381: 5380, 5382: 5381, 5383: 5382, 5384: 5383, 5385: 5384, 5386: 5385, 5387: 5386, 5388: 5387, 5389: 5388, 5390: 5389, 5391: 5390, 5392: 5391, 5393: 5392, 5394: 5393, 5395: 5394, 5396: 5395, 5397: 5396, 5398: 5397, 5399: 5398, 5400: 5399, 5401: 5400, 5402: 5401, 5403: 5402, 5404: 5403, 5405: 5404, 5406: 5405, 5407: 5406, 5408: 5407, 5409: 5408, 5410: 5409, 5411: 5410, 5412: 5411, 5413: 5412, 5414: 5413, 5415: 5414, 5416: 5415, 5417: 5416, 5418: 5417, 5419: 5418, 5420: 5419, 5421: 5420, 5422: 5421, 5423: 5422, 5424: 5423, 5425: 5424, 5426: 5425, 5427: 5426, 5428: 5427, 5429: 5428, 5430: 5429, 5431: 5430, 5432: 5431, 5433: 5432, 5434: 5433, 5435: 5434, 5436: 5435, 5437: 5436, 5438: 5437, 5439: 5438, 5440: 5439, 5441: 5440, 5442: 5441, 5443: 5442, 5444: 5443, 5445: 5444, 5446: 5445, 5447: 5446, 5448: 5447, 5449: 5448, 5450: 5449, 5451: 5450, 5452: 5451, 5453: 5452, 5454: 5453, 5455: 5454, 5456: 5455, 5457: 5456, 5458: 5457, 5459: 5458, 5460: 5459, 5461: 5460, 5462: 5461, 5463: 5462, 5464: 5463, 5465: 5464, 5466: 5465, 5467: 5466, 5468: 5467, 5469: 5468, 5470: 5469, 5471: 5470, 5472: 5471, 5473: 5472, 5474: 5473, 5475: 5474, 5476: 5475, 5477: 5476, 5478: 5477, 5479: 5478, 5480: 5479, 5481: 5480, 5482: 5481, 5483: 5482, 5484: 5483, 5485: 5484, 5486: 5485, 5487: 5486, 5488: 5487, 5489: 5488, 5490: 5489, 5491: 5490, 5492: 5491, 5493: 5492, 5494: 5493, 5495: 5494, 5496: 5495, 5497: 5496, 5498: 5497, 5499: 5498, 5500: 5499, 5501: 5500, 5502: 5501, 5503: 5502, 5504: 5503, 5505: 5504, 5506: 5505, 5507: 5506, 5508: 5507, 5509: 5508, 5510: 5509, 5511: 5510, 5512: 5511, 5513: 5512, 5514: 5513, 5515: 5514, 5516: 5515, 5517: 5516, 5518: 5517, 5519: 5518, 5520: 5519, 5521: 5520, 5522: 5521, 5523: 5522, 5524: 5523, 5525: 5524, 5526: 5525, 5527: 5526, 5528: 5527, 5529: 5528, 5530: 5529, 5531: 5530, 5532: 5531, 5533: 5532, 5534: 5533, 5535: 5534, 5536: 5535, 5537: 5536, 5538: 5537, 5539: 5538, 5540: 5539, 5541: 5540, 5542: 5541, 5543: 5542, 5544: 5543, 5545: 5544, 5546: 5545, 5547: 5546, 5548: 5547, 5549: 5548, 5550: 5549, 5551: 5550, 5552: 5551, 5553: 5552, 5554: 5553, 5555: 5554, 5556: 5555, 5557: 5556, 5558: 5557, 5559: 5558, 5560: 5559, 5561: 5560, 5562: 5561, 5563: 5562, 5564: 5563, 5565: 5564, 5566: 5565, 5567: 5566, 5568: 5567, 5569: 5568, 5570: 5569, 5571: 5570, 5572: 5571, 5573: 5572, 5574: 5573, 5575: 5574, 5576: 5575, 5577: 5576, 5578: 5577, 5579: 5578, 5580: 5579, 5581: 5580, 5582: 5581, 5583: 5582, 5584: 5583, 5585: 5584, 5586: 5585, 5587: 5586, 5588: 5587, 5589: 5588, 5590: 5589, 5591: 5590, 5592: 5591, 5593: 5592, 5594: 5593, 5595: 5594, 5596: 5595, 5597: 5596, 5598: 5597, 5599: 5598, 5600: 5599, 5601: 5600, 5602: 5601, 5603: 5602, 5604: 5603, 5605: 5604, 5606: 5605, 5607: 5606, 5608: 5607, 5609: 5608, 5610: 5609, 5611: 5610, 5612: 5611, 5613: 5612, 5614: 5613, 5615: 5614, 5616: 5615, 5617: 5616, 5618: 5617, 5619: 5618, 5620: 5619, 5621: 5620, 5622: 5621, 5623: 5622, 5624: 5623, 5625: 5624, 5626: 5625, 5627: 5626, 5628: 5627, 5629: 5628, 5630: 5629, 5631: 5630, 5632: 5631, 5633: 5632, 5634: 5633, 5635: 5634, 5636: 5635, 5637: 5636, 5638: 5637, 5639: 5638, 5640: 5639, 5641: 5640, 5642: 5641, 5643: 5642, 5644: 5643, 5645: 5644, 5646: 5645, 5647: 5646, 5648: 5647, 5649: 5648, 5650: 5649, 5651: 5650, 5652: 5651, 5653: 5652, 5654: 5653, 5655: 5654, 5656: 5655, 5657: 5656, 5658: 5657, 5659: 5658, 5660: 5659, 5661: 5660, 5662: 5661, 5663: 5662, 5664: 5663, 5665: 5664, 5666: 5665, 5667: 5666, 5668: 5667, 5669: 5668, 5670: 5669, 5671: 5670, 5672: 5671, 5673: 5672, 5674: 5673, 5675: 5674, 5676: 5675, 5677: 5676, 5678: 5677, 5679: 5678, 5680: 5679, 5681: 5680, 5682: 5681, 5683: 5682, 5684: 5683, 5685: 5684, 5686: 5685, 5687: 5686, 5688: 5687, 5689: 5688, 5690: 5689, 5691: 5690, 5692: 5691, 5693: 5692, 5694: 5693, 5695: 5694, 5696: 5695, 5697: 5696, 5698: 5697, 5699: 5698, 5700: 5699, 5701: 5700, 5702: 5701, 5703: 5702, 5704: 5703, 5705: 5704, 5706: 5705, 5707: 5706, 5708: 5707, 5709: 5708, 5710: 5709, 5711: 5710, 5712: 5711, 5713: 5712, 5714: 5713, 5715: 5714, 5716: 5715, 5717: 5716, 5718: 5717, 5719: 5718, 5720: 5719, 5721: 5720, 5722: 5721, 5723: 5722, 5724: 5723, 5725: 5724, 5726: 5725, 5727: 5726, 5728: 5727, 5729: 5728, 5730: 5729, 5731: 5730, 5732: 5731, 5733: 5732, 5734: 5733, 5735: 5734, 5736: 5735, 5737: 5736, 5738: 5737, 5739: 5738, 5740: 5739, 5741: 5740, 5742: 5741, 5743: 5742, 5744: 5743, 5745: 5744, 5746: 5745, 5747: 5746, 5748: 5747, 5749: 5748, 5750: 5749, 5751: 5750, 5752: 5751, 5753: 5752, 5754: 5753, 5755: 5754, 5756: 5755, 5757: 5756, 5758: 5757, 5759: 5758, 5760: 5759, 5761: 5760, 5762: 5761, 5763: 5762, 5764: 5763, 5765: 5764, 5766: 5765, 5767: 5766, 5768: 5767, 5769: 5768, 5770: 5769, 5771: 5770, 5772: 5771, 5773: 5772, 5774: 5773, 5775: 5774, 5776: 5775, 5777: 5776, 5778: 5777, 5779: 5778, 5780: 5779, 5781: 5780, 5782: 5781, 5783: 5782, 5784: 5783, 5785: 5784, 5786: 5785, 5787: 5786, 5788: 5787, 5789: 5788, 5790: 5789, 5791: 5790, 5792: 5791, 5793: 5792, 5794: 5793, 5795: 5794, 5796: 5795, 5797: 5796, 5798: 5797, 5799: 5798, 5800: 5799, 5801: 5800, 5802: 5801, 5803: 5802, 5804: 5803, 5805: 5804, 5806: 5805, 5807: 5806, 5808: 5807, 5809: 5808, 5810: 5809, 5811: 5810, 5812: 5811, 5813: 5812, 5814: 5813, 5815: 5814, 5816: 5815, 5817: 5816, 5818: 5817, 5819: 5818, 5820: 5819, 5821: 5820, 5822: 5821, 5823: 5822, 5824: 5823, 5825: 5824, 5826: 5825, 5827: 5826, 5828: 5827, 5829: 5828, 5830: 5829, 5831: 5830, 5832: 5831, 5833: 5832, 5834: 5833, 5835: 5834, 5836: 5835, 5837: 5836, 5838: 5837, 5839: 5838, 5840: 5839, 5841: 5840, 5842: 5841, 5843: 5842, 5844: 5843, 5845: 5844, 5846: 5845, 5847: 5846, 5848: 5847, 5849: 5848, 5850: 5849, 5851: 5850, 5852: 5851, 5853: 5852, 5854: 5853, 5855: 5854, 5856: 5855, 5857: 5856, 5858: 5857, 5859: 5858, 5860: 5859, 5861: 5860, 5862: 5861, 5863: 5862, 5864: 5863, 5865: 5864, 5866: 5865, 5867: 5866, 5868: 5867, 5869: 5868, 5870: 5869, 5871: 5870, 5872: 5871, 5873: 5872, 5874: 5873, 5875: 5874, 5876: 5875, 5877: 5876, 5878: 5877, 5879: 5878, 5880: 5879, 5881: 5880, 5882: 5881, 5883: 5882, 5884: 5883, 5885: 5884, 5886: 5885, 5887: 5886, 5888: 5887, 5889: 5888, 5890: 5889, 5891: 5890, 5892: 5891, 5893: 5892, 5894: 5893, 5895: 5894, 5896: 5895, 5897: 5896, 5898: 5897, 5899: 5898, 5900: 5899, 5901: 5900, 5902: 5901, 5903: 5902, 5904: 5903, 5905: 5904, 5906: 5905, 5907: 5906, 5908: 5907, 5909: 5908, 5910: 5909, 5911: 5910, 5912: 5911, 5913: 5912, 5914: 5913, 5915: 5914, 5916: 5915, 5917: 5916, 5918: 5917, 5919: 5918, 5920: 5919, 5921: 5920, 5922: 5921, 5923: 5922, 5924: 5923, 5925: 5924, 5926: 5925, 5927: 5926, 5928: 5927, 5929: 5928, 5930: 5929, 5931: 5930, 5932: 5931, 5933: 5932, 5934: 5933, 5935: 5934, 5936: 5935, 5937: 5936, 5938: 5937, 5939: 5938, 5940: 5939, 5941: 5940, 5942: 5941, 5943: 5942, 5944: 5943, 5945: 5944, 5946: 5945, 5947: 5946, 5948: 5947, 5949: 5948, 5950: 5949, 5951: 5950, 5952: 5951, 5953: 5952, 5954: 5953, 5955: 5954, 5956: 5955, 5957: 5956, 5958: 5957, 5959: 5958, 5960: 5959, 5961: 5960, 5962: 5961, 5963: 5962, 5964: 5963, 5965: 5964, 5966: 5965, 5967: 5966, 5968: 5967, 5969: 5968, 5970: 5969, 5971: 5970, 5972: 5971, 5973: 5972, 5974: 5973, 5975: 5974, 5976: 5975, 5977: 5976, 5978: 5977, 5979: 5978, 5980: 5979, 5981: 5980, 5982: 5981, 5983: 5982, 5984: 5983, 5985: 5984, 5986: 5985, 5987: 5986, 5988: 5987, 5989: 5988, 5990: 5989, 5991: 5990, 5992: 5991, 5993: 5992, 5994: 5993, 5995: 5994, 5996: 5995, 5997: 5996, 5998: 5997, 5999: 5998, 6000: 5999, 6001: 6000, 6002: 6001, 6003: 6002, 6004: 6003, 6005: 6004, 6006: 6005, 6007: 6006, 6008: 6007, 6009: 6008, 6010: 6009, 6011: 6010, 6012: 6011, 6013: 6012, 6014: 6013, 6015: 6014, 6016: 6015, 6017: 6016, 6018: 6017, 6019: 6018, 6020: 6019, 6021: 6020, 6022: 6021, 6023: 6022, 6024: 6023, 6025: 6024, 6026: 6025, 6027: 6026, 6028: 6027, 6029: 6028, 6030: 6029, 6031: 6030, 6032: 6031, 6033: 6032, 6034: 6033, 6035: 6034, 6036: 6035, 6037: 6036, 6038: 6037, 6039: 6038, 6040: 6039}} {'user_id': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 30: 31, 31: 32, 32: 33, 33: 34, 34: 35, 35: 36, 36: 37, 37: 38, 38: 39, 39: 40, 40: 41, 41: 42, 42: 43, 43: 44, 44: 45, 45: 46, 46: 47, 47: 48, 48: 49, 49: 50, 50: 51, 51: 52, 52: 53, 53: 54, 54: 55, 55: 56, 56: 57, 57: 58, 58: 59, 59: 60, 60: 61, 61: 62, 62: 63, 63: 64, 64: 65, 65: 66, 66: 67, 67: 68, 68: 69, 69: 70, 70: 71, 71: 72, 72: 73, 73: 74, 74: 75, 75: 76, 76: 77, 77: 78, 78: 79, 79: 80, 80: 81, 81: 82, 82: 83, 83: 84, 84: 85, 85: 86, 86: 87, 87: 88, 88: 89, 89: 90, 90: 91, 91: 92, 92: 93, 93: 94, 94: 95, 95: 96, 96: 97, 97: 98, 98: 99, 99: 100, 100: 101, 101: 102, 102: 103, 103: 104, 104: 105, 105: 106, 106: 107, 107: 108, 108: 109, 109: 110, 110: 111, 111: 112, 112: 113, 113: 114, 114: 115, 115: 116, 116: 117, 117: 118, 118: 119, 119: 120, 120: 121, 121: 122, 122: 123, 123: 124, 124: 125, 125: 126, 126: 127, 127: 128, 128: 129, 129: 130, 130: 131, 131: 132, 132: 133, 133: 134, 134: 135, 135: 136, 136: 137, 137: 138, 138: 139, 139: 140, 140: 141, 141: 142, 142: 143, 143: 144, 144: 145, 145: 146, 146: 147, 147: 148, 148: 149, 149: 150, 150: 151, 151: 152, 152: 153, 153: 154, 154: 155, 155: 156, 156: 157, 157: 158, 158: 159, 159: 160, 160: 161, 161: 162, 162: 163, 163: 164, 164: 165, 165: 166, 166: 167, 167: 168, 168: 169, 169: 170, 170: 171, 171: 172, 172: 173, 173: 174, 174: 175, 175: 176, 176: 177, 177: 178, 178: 179, 179: 180, 180: 181, 181: 182, 182: 183, 183: 184, 184: 185, 185: 186, 186: 187, 187: 188, 188: 189, 189: 190, 190: 191, 191: 192, 192: 193, 193: 194, 194: 195, 195: 196, 196: 197, 197: 198, 198: 199, 199: 200, 200: 201, 201: 202, 202: 203, 203: 204, 204: 205, 205: 206, 206: 207, 207: 208, 208: 209, 209: 210, 210: 211, 211: 212, 212: 213, 213: 214, 214: 215, 215: 216, 216: 217, 217: 218, 218: 219, 219: 220, 220: 221, 221: 222, 222: 223, 223: 224, 224: 225, 225: 226, 226: 227, 227: 228, 228: 229, 229: 230, 230: 231, 231: 232, 232: 233, 233: 234, 234: 235, 235: 236, 236: 237, 237: 238, 238: 239, 239: 240, 240: 241, 241: 242, 242: 243, 243: 244, 244: 245, 245: 246, 246: 247, 247: 248, 248: 249, 249: 250, 250: 251, 251: 252, 252: 253, 253: 254, 254: 255, 255: 256, 256: 257, 257: 258, 258: 259, 259: 260, 260: 261, 261: 262, 262: 263, 263: 264, 264: 265, 265: 266, 266: 267, 267: 268, 268: 269, 269: 270, 270: 271, 271: 272, 272: 273, 273: 274, 274: 275, 275: 276, 276: 277, 277: 278, 278: 279, 279: 280, 280: 281, 281: 282, 282: 283, 283: 284, 284: 285, 285: 286, 286: 287, 287: 288, 288: 289, 289: 290, 290: 291, 291: 292, 292: 293, 293: 294, 294: 295, 295: 296, 296: 297, 297: 298, 298: 299, 299: 300, 300: 301, 301: 302, 302: 303, 303: 304, 304: 305, 305: 306, 306: 307, 307: 308, 308: 309, 309: 310, 310: 311, 311: 312, 312: 313, 313: 314, 314: 315, 315: 316, 316: 317, 317: 318, 318: 319, 319: 320, 320: 321, 321: 322, 322: 323, 323: 324, 324: 325, 325: 326, 326: 327, 327: 328, 328: 329, 329: 330, 330: 331, 331: 332, 332: 333, 333: 334, 334: 335, 335: 336, 336: 337, 337: 338, 338: 339, 339: 340, 340: 341, 341: 342, 342: 343, 343: 344, 344: 345, 345: 346, 346: 347, 347: 348, 348: 349, 349: 350, 350: 351, 351: 352, 352: 353, 353: 354, 354: 355, 355: 356, 356: 357, 357: 358, 358: 359, 359: 360, 360: 361, 361: 362, 362: 363, 363: 364, 364: 365, 365: 366, 366: 367, 367: 368, 368: 369, 369: 370, 370: 371, 371: 372, 372: 373, 373: 374, 374: 375, 375: 376, 376: 377, 377: 378, 378: 379, 379: 380, 380: 381, 381: 382, 382: 383, 383: 384, 384: 385, 385: 386, 386: 387, 387: 388, 388: 389, 389: 390, 390: 391, 391: 392, 392: 393, 393: 394, 394: 395, 395: 396, 396: 397, 397: 398, 398: 399, 399: 400, 400: 401, 401: 402, 402: 403, 403: 404, 404: 405, 405: 406, 406: 407, 407: 408, 408: 409, 409: 410, 410: 411, 411: 412, 412: 413, 413: 414, 414: 415, 415: 416, 416: 417, 417: 418, 418: 419, 419: 420, 420: 421, 421: 422, 422: 423, 423: 424, 424: 425, 425: 426, 426: 427, 427: 428, 428: 429, 429: 430, 430: 431, 431: 432, 432: 433, 433: 434, 434: 435, 435: 436, 436: 437, 437: 438, 438: 439, 439: 440, 440: 441, 441: 442, 442: 443, 443: 444, 444: 445, 445: 446, 446: 447, 447: 448, 448: 449, 449: 450, 450: 451, 451: 452, 452: 453, 453: 454, 454: 455, 455: 456, 456: 457, 457: 458, 458: 459, 459: 460, 460: 461, 461: 462, 462: 463, 463: 464, 464: 465, 465: 466, 466: 467, 467: 468, 468: 469, 469: 470, 470: 471, 471: 472, 472: 473, 473: 474, 474: 475, 475: 476, 476: 477, 477: 478, 478: 479, 479: 480, 480: 481, 481: 482, 482: 483, 483: 484, 484: 485, 485: 486, 486: 487, 487: 488, 488: 489, 489: 490, 490: 491, 491: 492, 492: 493, 493: 494, 494: 495, 495: 496, 496: 497, 497: 498, 498: 499, 499: 500, 500: 501, 501: 502, 502: 503, 503: 504, 504: 505, 505: 506, 506: 507, 507: 508, 508: 509, 509: 510, 510: 511, 511: 512, 512: 513, 513: 514, 514: 515, 515: 516, 516: 517, 517: 518, 518: 519, 519: 520, 520: 521, 521: 522, 522: 523, 523: 524, 524: 525, 525: 526, 526: 527, 527: 528, 528: 529, 529: 530, 530: 531, 531: 532, 532: 533, 533: 534, 534: 535, 535: 536, 536: 537, 537: 538, 538: 539, 539: 540, 540: 541, 541: 542, 542: 543, 543: 544, 544: 545, 545: 546, 546: 547, 547: 548, 548: 549, 549: 550, 550: 551, 551: 552, 552: 553, 553: 554, 554: 555, 555: 556, 556: 557, 557: 558, 558: 559, 559: 560, 560: 561, 561: 562, 562: 563, 563: 564, 564: 565, 565: 566, 566: 567, 567: 568, 568: 569, 569: 570, 570: 571, 571: 572, 572: 573, 573: 574, 574: 575, 575: 576, 576: 577, 577: 578, 578: 579, 579: 580, 580: 581, 581: 582, 582: 583, 583: 584, 584: 585, 585: 586, 586: 587, 587: 588, 588: 589, 589: 590, 590: 591, 591: 592, 592: 593, 593: 594, 594: 595, 595: 596, 596: 597, 597: 598, 598: 599, 599: 600, 600: 601, 601: 602, 602: 603, 603: 604, 604: 605, 605: 606, 606: 607, 607: 608, 608: 609, 609: 610, 610: 611, 611: 612, 612: 613, 613: 614, 614: 615, 615: 616, 616: 617, 617: 618, 618: 619, 619: 620, 620: 621, 621: 622, 622: 623, 623: 624, 624: 625, 625: 626, 626: 627, 627: 628, 628: 629, 629: 630, 630: 631, 631: 632, 632: 633, 633: 634, 634: 635, 635: 636, 636: 637, 637: 638, 638: 639, 639: 640, 640: 641, 641: 642, 642: 643, 643: 644, 644: 645, 645: 646, 646: 647, 647: 648, 648: 649, 649: 650, 650: 651, 651: 652, 652: 653, 653: 654, 654: 655, 655: 656, 656: 657, 657: 658, 658: 659, 659: 660, 660: 661, 661: 662, 662: 663, 663: 664, 664: 665, 665: 666, 666: 667, 667: 668, 668: 669, 669: 670, 670: 671, 671: 672, 672: 673, 673: 674, 674: 675, 675: 676, 676: 677, 677: 678, 678: 679, 679: 680, 680: 681, 681: 682, 682: 683, 683: 684, 684: 685, 685: 686, 686: 687, 687: 688, 688: 689, 689: 690, 690: 691, 691: 692, 692: 693, 693: 694, 694: 695, 695: 696, 696: 697, 697: 698, 698: 699, 699: 700, 700: 701, 701: 702, 702: 703, 703: 704, 704: 705, 705: 706, 706: 707, 707: 708, 708: 709, 709: 710, 710: 711, 711: 712, 712: 713, 713: 714, 714: 715, 715: 716, 716: 717, 717: 718, 718: 719, 719: 720, 720: 721, 721: 722, 722: 723, 723: 724, 724: 725, 725: 726, 726: 727, 727: 728, 728: 729, 729: 730, 730: 731, 731: 732, 732: 733, 733: 734, 734: 735, 735: 736, 736: 737, 737: 738, 738: 739, 739: 740, 740: 741, 741: 742, 742: 743, 743: 744, 744: 745, 745: 746, 746: 747, 747: 748, 748: 749, 749: 750, 750: 751, 751: 752, 752: 753, 753: 754, 754: 755, 755: 756, 756: 757, 757: 758, 758: 759, 759: 760, 760: 761, 761: 762, 762: 763, 763: 764, 764: 765, 765: 766, 766: 767, 767: 768, 768: 769, 769: 770, 770: 771, 771: 772, 772: 773, 773: 774, 774: 775, 775: 776, 776: 777, 777: 778, 778: 779, 779: 780, 780: 781, 781: 782, 782: 783, 783: 784, 784: 785, 785: 786, 786: 787, 787: 788, 788: 789, 789: 790, 790: 791, 791: 792, 792: 793, 793: 794, 794: 795, 795: 796, 796: 797, 797: 798, 798: 799, 799: 800, 800: 801, 801: 802, 802: 803, 803: 804, 804: 805, 805: 806, 806: 807, 807: 808, 808: 809, 809: 810, 810: 811, 811: 812, 812: 813, 813: 814, 814: 815, 815: 816, 816: 817, 817: 818, 818: 819, 819: 820, 820: 821, 821: 822, 822: 823, 823: 824, 824: 825, 825: 826, 826: 827, 827: 828, 828: 829, 829: 830, 830: 831, 831: 832, 832: 833, 833: 834, 834: 835, 835: 836, 836: 837, 837: 838, 838: 839, 839: 840, 840: 841, 841: 842, 842: 843, 843: 844, 844: 845, 845: 846, 846: 847, 847: 848, 848: 849, 849: 850, 850: 851, 851: 852, 852: 853, 853: 854, 854: 855, 855: 856, 856: 857, 857: 858, 858: 859, 859: 860, 860: 861, 861: 862, 862: 863, 863: 864, 864: 865, 865: 866, 866: 867, 867: 868, 868: 869, 869: 870, 870: 871, 871: 872, 872: 873, 873: 874, 874: 875, 875: 876, 876: 877, 877: 878, 878: 879, 879: 880, 880: 881, 881: 882, 882: 883, 883: 884, 884: 885, 885: 886, 886: 887, 887: 888, 888: 889, 889: 890, 890: 891, 891: 892, 892: 893, 893: 894, 894: 895, 895: 896, 896: 897, 897: 898, 898: 899, 899: 900, 900: 901, 901: 902, 902: 903, 903: 904, 904: 905, 905: 906, 906: 907, 907: 908, 908: 909, 909: 910, 910: 911, 911: 912, 912: 913, 913: 914, 914: 915, 915: 916, 916: 917, 917: 918, 918: 919, 919: 920, 920: 921, 921: 922, 922: 923, 923: 924, 924: 925, 925: 926, 926: 927, 927: 928, 928: 929, 929: 930, 930: 931, 931: 932, 932: 933, 933: 934, 934: 935, 935: 936, 936: 937, 937: 938, 938: 939, 939: 940, 940: 941, 941: 942, 942: 943, 943: 944, 944: 945, 945: 946, 946: 947, 947: 948, 948: 949, 949: 950, 950: 951, 951: 952, 952: 953, 953: 954, 954: 955, 955: 956, 956: 957, 957: 958, 958: 959, 959: 960, 960: 961, 961: 962, 962: 963, 963: 964, 964: 965, 965: 966, 966: 967, 967: 968, 968: 969, 969: 970, 970: 971, 971: 972, 972: 973, 973: 974, 974: 975, 975: 976, 976: 977, 977: 978, 978: 979, 979: 980, 980: 981, 981: 982, 982: 983, 983: 984, 984: 985, 985: 986, 986: 987, 987: 988, 988: 989, 989: 990, 990: 991, 991: 992, 992: 993, 993: 994, 994: 995, 995: 996, 996: 997, 997: 998, 998: 999, 999: 1000, 1000: 1001, 1001: 1002, 1002: 1003, 1003: 1004, 1004: 1005, 1005: 1006, 1006: 1007, 1007: 1008, 1008: 1009, 1009: 1010, 1010: 1011, 1011: 1012, 1012: 1013, 1013: 1014, 1014: 1015, 1015: 1016, 1016: 1017, 1017: 1018, 1018: 1019, 1019: 1020, 1020: 1021, 1021: 1022, 1022: 1023, 1023: 1024, 1024: 1025, 1025: 1026, 1026: 1027, 1027: 1028, 1028: 1029, 1029: 1030, 1030: 1031, 1031: 1032, 1032: 1033, 1033: 1034, 1034: 1035, 1035: 1036, 1036: 1037, 1037: 1038, 1038: 1039, 1039: 1040, 1040: 1041, 1041: 1042, 1042: 1043, 1043: 1044, 1044: 1045, 1045: 1046, 1046: 1047, 1047: 1048, 1048: 1049, 1049: 1050, 1050: 1051, 1051: 1052, 1052: 1053, 1053: 1054, 1054: 1055, 1055: 1056, 1056: 1057, 1057: 1058, 1058: 1059, 1059: 1060, 1060: 1061, 1061: 1062, 1062: 1063, 1063: 1064, 1064: 1065, 1065: 1066, 1066: 1067, 1067: 1068, 1068: 1069, 1069: 1070, 1070: 1071, 1071: 1072, 1072: 1073, 1073: 1074, 1074: 1075, 1075: 1076, 1076: 1077, 1077: 1078, 1078: 1079, 1079: 1080, 1080: 1081, 1081: 1082, 1082: 1083, 1083: 1084, 1084: 1085, 1085: 1086, 1086: 1087, 1087: 1088, 1088: 1089, 1089: 1090, 1090: 1091, 1091: 1092, 1092: 1093, 1093: 1094, 1094: 1095, 1095: 1096, 1096: 1097, 1097: 1098, 1098: 1099, 1099: 1100, 1100: 1101, 1101: 1102, 1102: 1103, 1103: 1104, 1104: 1105, 1105: 1106, 1106: 1107, 1107: 1108, 1108: 1109, 1109: 1110, 1110: 1111, 1111: 1112, 1112: 1113, 1113: 1114, 1114: 1115, 1115: 1116, 1116: 1117, 1117: 1118, 1118: 1119, 1119: 1120, 1120: 1121, 1121: 1122, 1122: 1123, 1123: 1124, 1124: 1125, 1125: 1126, 1126: 1127, 1127: 1128, 1128: 1129, 1129: 1130, 1130: 1131, 1131: 1132, 1132: 1133, 1133: 1134, 1134: 1135, 1135: 1136, 1136: 1137, 1137: 1138, 1138: 1139, 1139: 1140, 1140: 1141, 1141: 1142, 1142: 1143, 1143: 1144, 1144: 1145, 1145: 1146, 1146: 1147, 1147: 1148, 1148: 1149, 1149: 1150, 1150: 1151, 1151: 1152, 1152: 1153, 1153: 1154, 1154: 1155, 1155: 1156, 1156: 1157, 1157: 1158, 1158: 1159, 1159: 1160, 1160: 1161, 1161: 1162, 1162: 1163, 1163: 1164, 1164: 1165, 1165: 1166, 1166: 1167, 1167: 1168, 1168: 1169, 1169: 1170, 1170: 1171, 1171: 1172, 1172: 1173, 1173: 1174, 1174: 1175, 1175: 1176, 1176: 1177, 1177: 1178, 1178: 1179, 1179: 1180, 1180: 1181, 1181: 1182, 1182: 1183, 1183: 1184, 1184: 1185, 1185: 1186, 1186: 1187, 1187: 1188, 1188: 1189, 1189: 1190, 1190: 1191, 1191: 1192, 1192: 1193, 1193: 1194, 1194: 1195, 1195: 1196, 1196: 1197, 1197: 1198, 1198: 1199, 1199: 1200, 1200: 1201, 1201: 1202, 1202: 1203, 1203: 1204, 1204: 1205, 1205: 1206, 1206: 1207, 1207: 1208, 1208: 1209, 1209: 1210, 1210: 1211, 1211: 1212, 1212: 1213, 1213: 1214, 1214: 1215, 1215: 1216, 1216: 1217, 1217: 1218, 1218: 1219, 1219: 1220, 1220: 1221, 1221: 1222, 1222: 1223, 1223: 1224, 1224: 1225, 1225: 1226, 1226: 1227, 1227: 1228, 1228: 1229, 1229: 1230, 1230: 1231, 1231: 1232, 1232: 1233, 1233: 1234, 1234: 1235, 1235: 1236, 1236: 1237, 1237: 1238, 1238: 1239, 1239: 1240, 1240: 1241, 1241: 1242, 1242: 1243, 1243: 1244, 1244: 1245, 1245: 1246, 1246: 1247, 1247: 1248, 1248: 1249, 1249: 1250, 1250: 1251, 1251: 1252, 1252: 1253, 1253: 1254, 1254: 1255, 1255: 1256, 1256: 1257, 1257: 1258, 1258: 1259, 1259: 1260, 1260: 1261, 1261: 1262, 1262: 1263, 1263: 1264, 1264: 1265, 1265: 1266, 1266: 1267, 1267: 1268, 1268: 1269, 1269: 1270, 1270: 1271, 1271: 1272, 1272: 1273, 1273: 1274, 1274: 1275, 1275: 1276, 1276: 1277, 1277: 1278, 1278: 1279, 1279: 1280, 1280: 1281, 1281: 1282, 1282: 1283, 1283: 1284, 1284: 1285, 1285: 1286, 1286: 1287, 1287: 1288, 1288: 1289, 1289: 1290, 1290: 1291, 1291: 1292, 1292: 1293, 1293: 1294, 1294: 1295, 1295: 1296, 1296: 1297, 1297: 1298, 1298: 1299, 1299: 1300, 1300: 1301, 1301: 1302, 1302: 1303, 1303: 1304, 1304: 1305, 1305: 1306, 1306: 1307, 1307: 1308, 1308: 1309, 1309: 1310, 1310: 1311, 1311: 1312, 1312: 1313, 1313: 1314, 1314: 1315, 1315: 1316, 1316: 1317, 1317: 1318, 1318: 1319, 1319: 1320, 1320: 1321, 1321: 1322, 1322: 1323, 1323: 1324, 1324: 1325, 1325: 1326, 1326: 1327, 1327: 1328, 1328: 1329, 1329: 1330, 1330: 1331, 1331: 1332, 1332: 1333, 1333: 1334, 1334: 1335, 1335: 1336, 1336: 1337, 1337: 1338, 1338: 1339, 1339: 1340, 1340: 1341, 1341: 1342, 1342: 1343, 1343: 1344, 1344: 1345, 1345: 1346, 1346: 1347, 1347: 1348, 1348: 1349, 1349: 1350, 1350: 1351, 1351: 1352, 1352: 1353, 1353: 1354, 1354: 1355, 1355: 1356, 1356: 1357, 1357: 1358, 1358: 1359, 1359: 1360, 1360: 1361, 1361: 1362, 1362: 1363, 1363: 1364, 1364: 1365, 1365: 1366, 1366: 1367, 1367: 1368, 1368: 1369, 1369: 1370, 1370: 1371, 1371: 1372, 1372: 1373, 1373: 1374, 1374: 1375, 1375: 1376, 1376: 1377, 1377: 1378, 1378: 1379, 1379: 1380, 1380: 1381, 1381: 1382, 1382: 1383, 1383: 1384, 1384: 1385, 1385: 1386, 1386: 1387, 1387: 1388, 1388: 1389, 1389: 1390, 1390: 1391, 1391: 1392, 1392: 1393, 1393: 1394, 1394: 1395, 1395: 1396, 1396: 1397, 1397: 1398, 1398: 1399, 1399: 1400, 1400: 1401, 1401: 1402, 1402: 1403, 1403: 1404, 1404: 1405, 1405: 1406, 1406: 1407, 1407: 1408, 1408: 1409, 1409: 1410, 1410: 1411, 1411: 1412, 1412: 1413, 1413: 1414, 1414: 1415, 1415: 1416, 1416: 1417, 1417: 1418, 1418: 1419, 1419: 1420, 1420: 1421, 1421: 1422, 1422: 1423, 1423: 1424, 1424: 1425, 1425: 1426, 1426: 1427, 1427: 1428, 1428: 1429, 1429: 1430, 1430: 1431, 1431: 1432, 1432: 1433, 1433: 1434, 1434: 1435, 1435: 1436, 1436: 1437, 1437: 1438, 1438: 1439, 1439: 1440, 1440: 1441, 1441: 1442, 1442: 1443, 1443: 1444, 1444: 1445, 1445: 1446, 1446: 1447, 1447: 1448, 1448: 1449, 1449: 1450, 1450: 1451, 1451: 1452, 1452: 1453, 1453: 1454, 1454: 1455, 1455: 1456, 1456: 1457, 1457: 1458, 1458: 1459, 1459: 1460, 1460: 1461, 1461: 1462, 1462: 1463, 1463: 1464, 1464: 1465, 1465: 1466, 1466: 1467, 1467: 1468, 1468: 1469, 1469: 1470, 1470: 1471, 1471: 1472, 1472: 1473, 1473: 1474, 1474: 1475, 1475: 1476, 1476: 1477, 1477: 1478, 1478: 1479, 1479: 1480, 1480: 1481, 1481: 1482, 1482: 1483, 1483: 1484, 1484: 1485, 1485: 1486, 1486: 1487, 1487: 1488, 1488: 1489, 1489: 1490, 1490: 1491, 1491: 1492, 1492: 1493, 1493: 1494, 1494: 1495, 1495: 1496, 1496: 1497, 1497: 1498, 1498: 1499, 1499: 1500, 1500: 1501, 1501: 1502, 1502: 1503, 1503: 1504, 1504: 1505, 1505: 1506, 1506: 1507, 1507: 1508, 1508: 1509, 1509: 1510, 1510: 1511, 1511: 1512, 1512: 1513, 1513: 1514, 1514: 1515, 1515: 1516, 1516: 1517, 1517: 1518, 1518: 1519, 1519: 1520, 1520: 1521, 1521: 1522, 1522: 1523, 1523: 1524, 1524: 1525, 1525: 1526, 1526: 1527, 1527: 1528, 1528: 1529, 1529: 1530, 1530: 1531, 1531: 1532, 1532: 1533, 1533: 1534, 1534: 1535, 1535: 1536, 1536: 1537, 1537: 1538, 1538: 1539, 1539: 1540, 1540: 1541, 1541: 1542, 1542: 1543, 1543: 1544, 1544: 1545, 1545: 1546, 1546: 1547, 1547: 1548, 1548: 1549, 1549: 1550, 1550: 1551, 1551: 1552, 1552: 1553, 1553: 1554, 1554: 1555, 1555: 1556, 1556: 1557, 1557: 1558, 1558: 1559, 1559: 1560, 1560: 1561, 1561: 1562, 1562: 1563, 1563: 1564, 1564: 1565, 1565: 1566, 1566: 1567, 1567: 1568, 1568: 1569, 1569: 1570, 1570: 1571, 1571: 1572, 1572: 1573, 1573: 1574, 1574: 1575, 1575: 1576, 1576: 1577, 1577: 1578, 1578: 1579, 1579: 1580, 1580: 1581, 1581: 1582, 1582: 1583, 1583: 1584, 1584: 1585, 1585: 1586, 1586: 1587, 1587: 1588, 1588: 1589, 1589: 1590, 1590: 1591, 1591: 1592, 1592: 1593, 1593: 1594, 1594: 1595, 1595: 1596, 1596: 1597, 1597: 1598, 1598: 1599, 1599: 1600, 1600: 1601, 1601: 1602, 1602: 1603, 1603: 1604, 1604: 1605, 1605: 1606, 1606: 1607, 1607: 1608, 1608: 1609, 1609: 1610, 1610: 1611, 1611: 1612, 1612: 1613, 1613: 1614, 1614: 1615, 1615: 1616, 1616: 1617, 1617: 1618, 1618: 1619, 1619: 1620, 1620: 1621, 1621: 1622, 1622: 1623, 1623: 1624, 1624: 1625, 1625: 1626, 1626: 1627, 1627: 1628, 1628: 1629, 1629: 1630, 1630: 1631, 1631: 1632, 1632: 1633, 1633: 1634, 1634: 1635, 1635: 1636, 1636: 1637, 1637: 1638, 1638: 1639, 1639: 1640, 1640: 1641, 1641: 1642, 1642: 1643, 1643: 1644, 1644: 1645, 1645: 1646, 1646: 1647, 1647: 1648, 1648: 1649, 1649: 1650, 1650: 1651, 1651: 1652, 1652: 1653, 1653: 1654, 1654: 1655, 1655: 1656, 1656: 1657, 1657: 1658, 1658: 1659, 1659: 1660, 1660: 1661, 1661: 1662, 1662: 1663, 1663: 1664, 1664: 1665, 1665: 1666, 1666: 1667, 1667: 1668, 1668: 1669, 1669: 1670, 1670: 1671, 1671: 1672, 1672: 1673, 1673: 1674, 1674: 1675, 1675: 1676, 1676: 1677, 1677: 1678, 1678: 1679, 1679: 1680, 1680: 1681, 1681: 1682, 1682: 1683, 1683: 1684, 1684: 1685, 1685: 1686, 1686: 1687, 1687: 1688, 1688: 1689, 1689: 1690, 1690: 1691, 1691: 1692, 1692: 1693, 1693: 1694, 1694: 1695, 1695: 1696, 1696: 1697, 1697: 1698, 1698: 1699, 1699: 1700, 1700: 1701, 1701: 1702, 1702: 1703, 1703: 1704, 1704: 1705, 1705: 1706, 1706: 1707, 1707: 1708, 1708: 1709, 1709: 1710, 1710: 1711, 1711: 1712, 1712: 1713, 1713: 1714, 1714: 1715, 1715: 1716, 1716: 1717, 1717: 1718, 1718: 1719, 1719: 1720, 1720: 1721, 1721: 1722, 1722: 1723, 1723: 1724, 1724: 1725, 1725: 1726, 1726: 1727, 1727: 1728, 1728: 1729, 1729: 1730, 1730: 1731, 1731: 1732, 1732: 1733, 1733: 1734, 1734: 1735, 1735: 1736, 1736: 1737, 1737: 1738, 1738: 1739, 1739: 1740, 1740: 1741, 1741: 1742, 1742: 1743, 1743: 1744, 1744: 1745, 1745: 1746, 1746: 1747, 1747: 1748, 1748: 1749, 1749: 1750, 1750: 1751, 1751: 1752, 1752: 1753, 1753: 1754, 1754: 1755, 1755: 1756, 1756: 1757, 1757: 1758, 1758: 1759, 1759: 1760, 1760: 1761, 1761: 1762, 1762: 1763, 1763: 1764, 1764: 1765, 1765: 1766, 1766: 1767, 1767: 1768, 1768: 1769, 1769: 1770, 1770: 1771, 1771: 1772, 1772: 1773, 1773: 1774, 1774: 1775, 1775: 1776, 1776: 1777, 1777: 1778, 1778: 1779, 1779: 1780, 1780: 1781, 1781: 1782, 1782: 1783, 1783: 1784, 1784: 1785, 1785: 1786, 1786: 1787, 1787: 1788, 1788: 1789, 1789: 1790, 1790: 1791, 1791: 1792, 1792: 1793, 1793: 1794, 1794: 1795, 1795: 1796, 1796: 1797, 1797: 1798, 1798: 1799, 1799: 1800, 1800: 1801, 1801: 1802, 1802: 1803, 1803: 1804, 1804: 1805, 1805: 1806, 1806: 1807, 1807: 1808, 1808: 1809, 1809: 1810, 1810: 1811, 1811: 1812, 1812: 1813, 1813: 1814, 1814: 1815, 1815: 1816, 1816: 1817, 1817: 1818, 1818: 1819, 1819: 1820, 1820: 1821, 1821: 1822, 1822: 1823, 1823: 1824, 1824: 1825, 1825: 1826, 1826: 1827, 1827: 1828, 1828: 1829, 1829: 1830, 1830: 1831, 1831: 1832, 1832: 1833, 1833: 1834, 1834: 1835, 1835: 1836, 1836: 1837, 1837: 1838, 1838: 1839, 1839: 1840, 1840: 1841, 1841: 1842, 1842: 1843, 1843: 1844, 1844: 1845, 1845: 1846, 1846: 1847, 1847: 1848, 1848: 1849, 1849: 1850, 1850: 1851, 1851: 1852, 1852: 1853, 1853: 1854, 1854: 1855, 1855: 1856, 1856: 1857, 1857: 1858, 1858: 1859, 1859: 1860, 1860: 1861, 1861: 1862, 1862: 1863, 1863: 1864, 1864: 1865, 1865: 1866, 1866: 1867, 1867: 1868, 1868: 1869, 1869: 1870, 1870: 1871, 1871: 1872, 1872: 1873, 1873: 1874, 1874: 1875, 1875: 1876, 1876: 1877, 1877: 1878, 1878: 1879, 1879: 1880, 1880: 1881, 1881: 1882, 1882: 1883, 1883: 1884, 1884: 1885, 1885: 1886, 1886: 1887, 1887: 1888, 1888: 1889, 1889: 1890, 1890: 1891, 1891: 1892, 1892: 1893, 1893: 1894, 1894: 1895, 1895: 1896, 1896: 1897, 1897: 1898, 1898: 1899, 1899: 1900, 1900: 1901, 1901: 1902, 1902: 1903, 1903: 1904, 1904: 1905, 1905: 1906, 1906: 1907, 1907: 1908, 1908: 1909, 1909: 1910, 1910: 1911, 1911: 1912, 1912: 1913, 1913: 1914, 1914: 1915, 1915: 1916, 1916: 1917, 1917: 1918, 1918: 1919, 1919: 1920, 1920: 1921, 1921: 1922, 1922: 1923, 1923: 1924, 1924: 1925, 1925: 1926, 1926: 1927, 1927: 1928, 1928: 1929, 1929: 1930, 1930: 1931, 1931: 1932, 1932: 1933, 1933: 1934, 1934: 1935, 1935: 1936, 1936: 1937, 1937: 1938, 1938: 1939, 1939: 1940, 1940: 1941, 1941: 1942, 1942: 1943, 1943: 1944, 1944: 1945, 1945: 1946, 1946: 1947, 1947: 1948, 1948: 1949, 1949: 1950, 1950: 1951, 1951: 1952, 1952: 1953, 1953: 1954, 1954: 1955, 1955: 1956, 1956: 1957, 1957: 1958, 1958: 1959, 1959: 1960, 1960: 1961, 1961: 1962, 1962: 1963, 1963: 1964, 1964: 1965, 1965: 1966, 1966: 1967, 1967: 1968, 1968: 1969, 1969: 1970, 1970: 1971, 1971: 1972, 1972: 1973, 1973: 1974, 1974: 1975, 1975: 1976, 1976: 1977, 1977: 1978, 1978: 1979, 1979: 1980, 1980: 1981, 1981: 1982, 1982: 1983, 1983: 1984, 1984: 1985, 1985: 1986, 1986: 1987, 1987: 1988, 1988: 1989, 1989: 1990, 1990: 1991, 1991: 1992, 1992: 1993, 1993: 1994, 1994: 1995, 1995: 1996, 1996: 1997, 1997: 1998, 1998: 1999, 1999: 2000, 2000: 2001, 2001: 2002, 2002: 2003, 2003: 2004, 2004: 2005, 2005: 2006, 2006: 2007, 2007: 2008, 2008: 2009, 2009: 2010, 2010: 2011, 2011: 2012, 2012: 2013, 2013: 2014, 2014: 2015, 2015: 2016, 2016: 2017, 2017: 2018, 2018: 2019, 2019: 2020, 2020: 2021, 2021: 2022, 2022: 2023, 2023: 2024, 2024: 2025, 2025: 2026, 2026: 2027, 2027: 2028, 2028: 2029, 2029: 2030, 2030: 2031, 2031: 2032, 2032: 2033, 2033: 2034, 2034: 2035, 2035: 2036, 2036: 2037, 2037: 2038, 2038: 2039, 2039: 2040, 2040: 2041, 2041: 2042, 2042: 2043, 2043: 2044, 2044: 2045, 2045: 2046, 2046: 2047, 2047: 2048, 2048: 2049, 2049: 2050, 2050: 2051, 2051: 2052, 2052: 2053, 2053: 2054, 2054: 2055, 2055: 2056, 2056: 2057, 2057: 2058, 2058: 2059, 2059: 2060, 2060: 2061, 2061: 2062, 2062: 2063, 2063: 2064, 2064: 2065, 2065: 2066, 2066: 2067, 2067: 2068, 2068: 2069, 2069: 2070, 2070: 2071, 2071: 2072, 2072: 2073, 2073: 2074, 2074: 2075, 2075: 2076, 2076: 2077, 2077: 2078, 2078: 2079, 2079: 2080, 2080: 2081, 2081: 2082, 2082: 2083, 2083: 2084, 2084: 2085, 2085: 2086, 2086: 2087, 2087: 2088, 2088: 2089, 2089: 2090, 2090: 2091, 2091: 2092, 2092: 2093, 2093: 2094, 2094: 2095, 2095: 2096, 2096: 2097, 2097: 2098, 2098: 2099, 2099: 2100, 2100: 2101, 2101: 2102, 2102: 2103, 2103: 2104, 2104: 2105, 2105: 2106, 2106: 2107, 2107: 2108, 2108: 2109, 2109: 2110, 2110: 2111, 2111: 2112, 2112: 2113, 2113: 2114, 2114: 2115, 2115: 2116, 2116: 2117, 2117: 2118, 2118: 2119, 2119: 2120, 2120: 2121, 2121: 2122, 2122: 2123, 2123: 2124, 2124: 2125, 2125: 2126, 2126: 2127, 2127: 2128, 2128: 2129, 2129: 2130, 2130: 2131, 2131: 2132, 2132: 2133, 2133: 2134, 2134: 2135, 2135: 2136, 2136: 2137, 2137: 2138, 2138: 2139, 2139: 2140, 2140: 2141, 2141: 2142, 2142: 2143, 2143: 2144, 2144: 2145, 2145: 2146, 2146: 2147, 2147: 2148, 2148: 2149, 2149: 2150, 2150: 2151, 2151: 2152, 2152: 2153, 2153: 2154, 2154: 2155, 2155: 2156, 2156: 2157, 2157: 2158, 2158: 2159, 2159: 2160, 2160: 2161, 2161: 2162, 2162: 2163, 2163: 2164, 2164: 2165, 2165: 2166, 2166: 2167, 2167: 2168, 2168: 2169, 2169: 2170, 2170: 2171, 2171: 2172, 2172: 2173, 2173: 2174, 2174: 2175, 2175: 2176, 2176: 2177, 2177: 2178, 2178: 2179, 2179: 2180, 2180: 2181, 2181: 2182, 2182: 2183, 2183: 2184, 2184: 2185, 2185: 2186, 2186: 2187, 2187: 2188, 2188: 2189, 2189: 2190, 2190: 2191, 2191: 2192, 2192: 2193, 2193: 2194, 2194: 2195, 2195: 2196, 2196: 2197, 2197: 2198, 2198: 2199, 2199: 2200, 2200: 2201, 2201: 2202, 2202: 2203, 2203: 2204, 2204: 2205, 2205: 2206, 2206: 2207, 2207: 2208, 2208: 2209, 2209: 2210, 2210: 2211, 2211: 2212, 2212: 2213, 2213: 2214, 2214: 2215, 2215: 2216, 2216: 2217, 2217: 2218, 2218: 2219, 2219: 2220, 2220: 2221, 2221: 2222, 2222: 2223, 2223: 2224, 2224: 2225, 2225: 2226, 2226: 2227, 2227: 2228, 2228: 2229, 2229: 2230, 2230: 2231, 2231: 2232, 2232: 2233, 2233: 2234, 2234: 2235, 2235: 2236, 2236: 2237, 2237: 2238, 2238: 2239, 2239: 2240, 2240: 2241, 2241: 2242, 2242: 2243, 2243: 2244, 2244: 2245, 2245: 2246, 2246: 2247, 2247: 2248, 2248: 2249, 2249: 2250, 2250: 2251, 2251: 2252, 2252: 2253, 2253: 2254, 2254: 2255, 2255: 2256, 2256: 2257, 2257: 2258, 2258: 2259, 2259: 2260, 2260: 2261, 2261: 2262, 2262: 2263, 2263: 2264, 2264: 2265, 2265: 2266, 2266: 2267, 2267: 2268, 2268: 2269, 2269: 2270, 2270: 2271, 2271: 2272, 2272: 2273, 2273: 2274, 2274: 2275, 2275: 2276, 2276: 2277, 2277: 2278, 2278: 2279, 2279: 2280, 2280: 2281, 2281: 2282, 2282: 2283, 2283: 2284, 2284: 2285, 2285: 2286, 2286: 2287, 2287: 2288, 2288: 2289, 2289: 2290, 2290: 2291, 2291: 2292, 2292: 2293, 2293: 2294, 2294: 2295, 2295: 2296, 2296: 2297, 2297: 2298, 2298: 2299, 2299: 2300, 2300: 2301, 2301: 2302, 2302: 2303, 2303: 2304, 2304: 2305, 2305: 2306, 2306: 2307, 2307: 2308, 2308: 2309, 2309: 2310, 2310: 2311, 2311: 2312, 2312: 2313, 2313: 2314, 2314: 2315, 2315: 2316, 2316: 2317, 2317: 2318, 2318: 2319, 2319: 2320, 2320: 2321, 2321: 2322, 2322: 2323, 2323: 2324, 2324: 2325, 2325: 2326, 2326: 2327, 2327: 2328, 2328: 2329, 2329: 2330, 2330: 2331, 2331: 2332, 2332: 2333, 2333: 2334, 2334: 2335, 2335: 2336, 2336: 2337, 2337: 2338, 2338: 2339, 2339: 2340, 2340: 2341, 2341: 2342, 2342: 2343, 2343: 2344, 2344: 2345, 2345: 2346, 2346: 2347, 2347: 2348, 2348: 2349, 2349: 2350, 2350: 2351, 2351: 2352, 2352: 2353, 2353: 2354, 2354: 2355, 2355: 2356, 2356: 2357, 2357: 2358, 2358: 2359, 2359: 2360, 2360: 2361, 2361: 2362, 2362: 2363, 2363: 2364, 2364: 2365, 2365: 2366, 2366: 2367, 2367: 2368, 2368: 2369, 2369: 2370, 2370: 2371, 2371: 2372, 2372: 2373, 2373: 2374, 2374: 2375, 2375: 2376, 2376: 2377, 2377: 2378, 2378: 2379, 2379: 2380, 2380: 2381, 2381: 2382, 2382: 2383, 2383: 2384, 2384: 2385, 2385: 2386, 2386: 2387, 2387: 2388, 2388: 2389, 2389: 2390, 2390: 2391, 2391: 2392, 2392: 2393, 2393: 2394, 2394: 2395, 2395: 2396, 2396: 2397, 2397: 2398, 2398: 2399, 2399: 2400, 2400: 2401, 2401: 2402, 2402: 2403, 2403: 2404, 2404: 2405, 2405: 2406, 2406: 2407, 2407: 2408, 2408: 2409, 2409: 2410, 2410: 2411, 2411: 2412, 2412: 2413, 2413: 2414, 2414: 2415, 2415: 2416, 2416: 2417, 2417: 2418, 2418: 2419, 2419: 2420, 2420: 2421, 2421: 2422, 2422: 2423, 2423: 2424, 2424: 2425, 2425: 2426, 2426: 2427, 2427: 2428, 2428: 2429, 2429: 2430, 2430: 2431, 2431: 2432, 2432: 2433, 2433: 2434, 2434: 2435, 2435: 2436, 2436: 2437, 2437: 2438, 2438: 2439, 2439: 2440, 2440: 2441, 2441: 2442, 2442: 2443, 2443: 2444, 2444: 2445, 2445: 2446, 2446: 2447, 2447: 2448, 2448: 2449, 2449: 2450, 2450: 2451, 2451: 2452, 2452: 2453, 2453: 2454, 2454: 2455, 2455: 2456, 2456: 2457, 2457: 2458, 2458: 2459, 2459: 2460, 2460: 2461, 2461: 2462, 2462: 2463, 2463: 2464, 2464: 2465, 2465: 2466, 2466: 2467, 2467: 2468, 2468: 2469, 2469: 2470, 2470: 2471, 2471: 2472, 2472: 2473, 2473: 2474, 2474: 2475, 2475: 2476, 2476: 2477, 2477: 2478, 2478: 2479, 2479: 2480, 2480: 2481, 2481: 2482, 2482: 2483, 2483: 2484, 2484: 2485, 2485: 2486, 2486: 2487, 2487: 2488, 2488: 2489, 2489: 2490, 2490: 2491, 2491: 2492, 2492: 2493, 2493: 2494, 2494: 2495, 2495: 2496, 2496: 2497, 2497: 2498, 2498: 2499, 2499: 2500, 2500: 2501, 2501: 2502, 2502: 2503, 2503: 2504, 2504: 2505, 2505: 2506, 2506: 2507, 2507: 2508, 2508: 2509, 2509: 2510, 2510: 2511, 2511: 2512, 2512: 2513, 2513: 2514, 2514: 2515, 2515: 2516, 2516: 2517, 2517: 2518, 2518: 2519, 2519: 2520, 2520: 2521, 2521: 2522, 2522: 2523, 2523: 2524, 2524: 2525, 2525: 2526, 2526: 2527, 2527: 2528, 2528: 2529, 2529: 2530, 2530: 2531, 2531: 2532, 2532: 2533, 2533: 2534, 2534: 2535, 2535: 2536, 2536: 2537, 2537: 2538, 2538: 2539, 2539: 2540, 2540: 2541, 2541: 2542, 2542: 2543, 2543: 2544, 2544: 2545, 2545: 2546, 2546: 2547, 2547: 2548, 2548: 2549, 2549: 2550, 2550: 2551, 2551: 2552, 2552: 2553, 2553: 2554, 2554: 2555, 2555: 2556, 2556: 2557, 2557: 2558, 2558: 2559, 2559: 2560, 2560: 2561, 2561: 2562, 2562: 2563, 2563: 2564, 2564: 2565, 2565: 2566, 2566: 2567, 2567: 2568, 2568: 2569, 2569: 2570, 2570: 2571, 2571: 2572, 2572: 2573, 2573: 2574, 2574: 2575, 2575: 2576, 2576: 2577, 2577: 2578, 2578: 2579, 2579: 2580, 2580: 2581, 2581: 2582, 2582: 2583, 2583: 2584, 2584: 2585, 2585: 2586, 2586: 2587, 2587: 2588, 2588: 2589, 2589: 2590, 2590: 2591, 2591: 2592, 2592: 2593, 2593: 2594, 2594: 2595, 2595: 2596, 2596: 2597, 2597: 2598, 2598: 2599, 2599: 2600, 2600: 2601, 2601: 2602, 2602: 2603, 2603: 2604, 2604: 2605, 2605: 2606, 2606: 2607, 2607: 2608, 2608: 2609, 2609: 2610, 2610: 2611, 2611: 2612, 2612: 2613, 2613: 2614, 2614: 2615, 2615: 2616, 2616: 2617, 2617: 2618, 2618: 2619, 2619: 2620, 2620: 2621, 2621: 2622, 2622: 2623, 2623: 2624, 2624: 2625, 2625: 2626, 2626: 2627, 2627: 2628, 2628: 2629, 2629: 2630, 2630: 2631, 2631: 2632, 2632: 2633, 2633: 2634, 2634: 2635, 2635: 2636, 2636: 2637, 2637: 2638, 2638: 2639, 2639: 2640, 2640: 2641, 2641: 2642, 2642: 2643, 2643: 2644, 2644: 2645, 2645: 2646, 2646: 2647, 2647: 2648, 2648: 2649, 2649: 2650, 2650: 2651, 2651: 2652, 2652: 2653, 2653: 2654, 2654: 2655, 2655: 2656, 2656: 2657, 2657: 2658, 2658: 2659, 2659: 2660, 2660: 2661, 2661: 2662, 2662: 2663, 2663: 2664, 2664: 2665, 2665: 2666, 2666: 2667, 2667: 2668, 2668: 2669, 2669: 2670, 2670: 2671, 2671: 2672, 2672: 2673, 2673: 2674, 2674: 2675, 2675: 2676, 2676: 2677, 2677: 2678, 2678: 2679, 2679: 2680, 2680: 2681, 2681: 2682, 2682: 2683, 2683: 2684, 2684: 2685, 2685: 2686, 2686: 2687, 2687: 2688, 2688: 2689, 2689: 2690, 2690: 2691, 2691: 2692, 2692: 2693, 2693: 2694, 2694: 2695, 2695: 2696, 2696: 2697, 2697: 2698, 2698: 2699, 2699: 2700, 2700: 2701, 2701: 2702, 2702: 2703, 2703: 2704, 2704: 2705, 2705: 2706, 2706: 2707, 2707: 2708, 2708: 2709, 2709: 2710, 2710: 2711, 2711: 2712, 2712: 2713, 2713: 2714, 2714: 2715, 2715: 2716, 2716: 2717, 2717: 2718, 2718: 2719, 2719: 2720, 2720: 2721, 2721: 2722, 2722: 2723, 2723: 2724, 2724: 2725, 2725: 2726, 2726: 2727, 2727: 2728, 2728: 2729, 2729: 2730, 2730: 2731, 2731: 2732, 2732: 2733, 2733: 2734, 2734: 2735, 2735: 2736, 2736: 2737, 2737: 2738, 2738: 2739, 2739: 2740, 2740: 2741, 2741: 2742, 2742: 2743, 2743: 2744, 2744: 2745, 2745: 2746, 2746: 2747, 2747: 2748, 2748: 2749, 2749: 2750, 2750: 2751, 2751: 2752, 2752: 2753, 2753: 2754, 2754: 2755, 2755: 2756, 2756: 2757, 2757: 2758, 2758: 2759, 2759: 2760, 2760: 2761, 2761: 2762, 2762: 2763, 2763: 2764, 2764: 2765, 2765: 2766, 2766: 2767, 2767: 2768, 2768: 2769, 2769: 2770, 2770: 2771, 2771: 2772, 2772: 2773, 2773: 2774, 2774: 2775, 2775: 2776, 2776: 2777, 2777: 2778, 2778: 2779, 2779: 2780, 2780: 2781, 2781: 2782, 2782: 2783, 2783: 2784, 2784: 2785, 2785: 2786, 2786: 2787, 2787: 2788, 2788: 2789, 2789: 2790, 2790: 2791, 2791: 2792, 2792: 2793, 2793: 2794, 2794: 2795, 2795: 2796, 2796: 2797, 2797: 2798, 2798: 2799, 2799: 2800, 2800: 2801, 2801: 2802, 2802: 2803, 2803: 2804, 2804: 2805, 2805: 2806, 2806: 2807, 2807: 2808, 2808: 2809, 2809: 2810, 2810: 2811, 2811: 2812, 2812: 2813, 2813: 2814, 2814: 2815, 2815: 2816, 2816: 2817, 2817: 2818, 2818: 2819, 2819: 2820, 2820: 2821, 2821: 2822, 2822: 2823, 2823: 2824, 2824: 2825, 2825: 2826, 2826: 2827, 2827: 2828, 2828: 2829, 2829: 2830, 2830: 2831, 2831: 2832, 2832: 2833, 2833: 2834, 2834: 2835, 2835: 2836, 2836: 2837, 2837: 2838, 2838: 2839, 2839: 2840, 2840: 2841, 2841: 2842, 2842: 2843, 2843: 2844, 2844: 2845, 2845: 2846, 2846: 2847, 2847: 2848, 2848: 2849, 2849: 2850, 2850: 2851, 2851: 2852, 2852: 2853, 2853: 2854, 2854: 2855, 2855: 2856, 2856: 2857, 2857: 2858, 2858: 2859, 2859: 2860, 2860: 2861, 2861: 2862, 2862: 2863, 2863: 2864, 2864: 2865, 2865: 2866, 2866: 2867, 2867: 2868, 2868: 2869, 2869: 2870, 2870: 2871, 2871: 2872, 2872: 2873, 2873: 2874, 2874: 2875, 2875: 2876, 2876: 2877, 2877: 2878, 2878: 2879, 2879: 2880, 2880: 2881, 2881: 2882, 2882: 2883, 2883: 2884, 2884: 2885, 2885: 2886, 2886: 2887, 2887: 2888, 2888: 2889, 2889: 2890, 2890: 2891, 2891: 2892, 2892: 2893, 2893: 2894, 2894: 2895, 2895: 2896, 2896: 2897, 2897: 2898, 2898: 2899, 2899: 2900, 2900: 2901, 2901: 2902, 2902: 2903, 2903: 2904, 2904: 2905, 2905: 2906, 2906: 2907, 2907: 2908, 2908: 2909, 2909: 2910, 2910: 2911, 2911: 2912, 2912: 2913, 2913: 2914, 2914: 2915, 2915: 2916, 2916: 2917, 2917: 2918, 2918: 2919, 2919: 2920, 2920: 2921, 2921: 2922, 2922: 2923, 2923: 2924, 2924: 2925, 2925: 2926, 2926: 2927, 2927: 2928, 2928: 2929, 2929: 2930, 2930: 2931, 2931: 2932, 2932: 2933, 2933: 2934, 2934: 2935, 2935: 2936, 2936: 2937, 2937: 2938, 2938: 2939, 2939: 2940, 2940: 2941, 2941: 2942, 2942: 2943, 2943: 2944, 2944: 2945, 2945: 2946, 2946: 2947, 2947: 2948, 2948: 2949, 2949: 2950, 2950: 2951, 2951: 2952, 2952: 2953, 2953: 2954, 2954: 2955, 2955: 2956, 2956: 2957, 2957: 2958, 2958: 2959, 2959: 2960, 2960: 2961, 2961: 2962, 2962: 2963, 2963: 2964, 2964: 2965, 2965: 2966, 2966: 2967, 2967: 2968, 2968: 2969, 2969: 2970, 2970: 2971, 2971: 2972, 2972: 2973, 2973: 2974, 2974: 2975, 2975: 2976, 2976: 2977, 2977: 2978, 2978: 2979, 2979: 2980, 2980: 2981, 2981: 2982, 2982: 2983, 2983: 2984, 2984: 2985, 2985: 2986, 2986: 2987, 2987: 2988, 2988: 2989, 2989: 2990, 2990: 2991, 2991: 2992, 2992: 2993, 2993: 2994, 2994: 2995, 2995: 2996, 2996: 2997, 2997: 2998, 2998: 2999, 2999: 3000, 3000: 3001, 3001: 3002, 3002: 3003, 3003: 3004, 3004: 3005, 3005: 3006, 3006: 3007, 3007: 3008, 3008: 3009, 3009: 3010, 3010: 3011, 3011: 3012, 3012: 3013, 3013: 3014, 3014: 3015, 3015: 3016, 3016: 3017, 3017: 3018, 3018: 3019, 3019: 3020, 3020: 3021, 3021: 3022, 3022: 3023, 3023: 3024, 3024: 3025, 3025: 3026, 3026: 3027, 3027: 3028, 3028: 3029, 3029: 3030, 3030: 3031, 3031: 3032, 3032: 3033, 3033: 3034, 3034: 3035, 3035: 3036, 3036: 3037, 3037: 3038, 3038: 3039, 3039: 3040, 3040: 3041, 3041: 3042, 3042: 3043, 3043: 3044, 3044: 3045, 3045: 3046, 3046: 3047, 3047: 3048, 3048: 3049, 3049: 3050, 3050: 3051, 3051: 3052, 3052: 3053, 3053: 3054, 3054: 3055, 3055: 3056, 3056: 3057, 3057: 3058, 3058: 3059, 3059: 3060, 3060: 3061, 3061: 3062, 3062: 3063, 3063: 3064, 3064: 3065, 3065: 3066, 3066: 3067, 3067: 3068, 3068: 3069, 3069: 3070, 3070: 3071, 3071: 3072, 3072: 3073, 3073: 3074, 3074: 3075, 3075: 3076, 3076: 3077, 3077: 3078, 3078: 3079, 3079: 3080, 3080: 3081, 3081: 3082, 3082: 3083, 3083: 3084, 3084: 3085, 3085: 3086, 3086: 3087, 3087: 3088, 3088: 3089, 3089: 3090, 3090: 3091, 3091: 3092, 3092: 3093, 3093: 3094, 3094: 3095, 3095: 3096, 3096: 3097, 3097: 3098, 3098: 3099, 3099: 3100, 3100: 3101, 3101: 3102, 3102: 3103, 3103: 3104, 3104: 3105, 3105: 3106, 3106: 3107, 3107: 3108, 3108: 3109, 3109: 3110, 3110: 3111, 3111: 3112, 3112: 3113, 3113: 3114, 3114: 3115, 3115: 3116, 3116: 3117, 3117: 3118, 3118: 3119, 3119: 3120, 3120: 3121, 3121: 3122, 3122: 3123, 3123: 3124, 3124: 3125, 3125: 3126, 3126: 3127, 3127: 3128, 3128: 3129, 3129: 3130, 3130: 3131, 3131: 3132, 3132: 3133, 3133: 3134, 3134: 3135, 3135: 3136, 3136: 3137, 3137: 3138, 3138: 3139, 3139: 3140, 3140: 3141, 3141: 3142, 3142: 3143, 3143: 3144, 3144: 3145, 3145: 3146, 3146: 3147, 3147: 3148, 3148: 3149, 3149: 3150, 3150: 3151, 3151: 3152, 3152: 3153, 3153: 3154, 3154: 3155, 3155: 3156, 3156: 3157, 3157: 3158, 3158: 3159, 3159: 3160, 3160: 3161, 3161: 3162, 3162: 3163, 3163: 3164, 3164: 3165, 3165: 3166, 3166: 3167, 3167: 3168, 3168: 3169, 3169: 3170, 3170: 3171, 3171: 3172, 3172: 3173, 3173: 3174, 3174: 3175, 3175: 3176, 3176: 3177, 3177: 3178, 3178: 3179, 3179: 3180, 3180: 3181, 3181: 3182, 3182: 3183, 3183: 3184, 3184: 3185, 3185: 3186, 3186: 3187, 3187: 3188, 3188: 3189, 3189: 3190, 3190: 3191, 3191: 3192, 3192: 3193, 3193: 3194, 3194: 3195, 3195: 3196, 3196: 3197, 3197: 3198, 3198: 3199, 3199: 3200, 3200: 3201, 3201: 3202, 3202: 3203, 3203: 3204, 3204: 3205, 3205: 3206, 3206: 3207, 3207: 3208, 3208: 3209, 3209: 3210, 3210: 3211, 3211: 3212, 3212: 3213, 3213: 3214, 3214: 3215, 3215: 3216, 3216: 3217, 3217: 3218, 3218: 3219, 3219: 3220, 3220: 3221, 3221: 3222, 3222: 3223, 3223: 3224, 3224: 3225, 3225: 3226, 3226: 3227, 3227: 3228, 3228: 3229, 3229: 3230, 3230: 3231, 3231: 3232, 3232: 3233, 3233: 3234, 3234: 3235, 3235: 3236, 3236: 3237, 3237: 3238, 3238: 3239, 3239: 3240, 3240: 3241, 3241: 3242, 3242: 3243, 3243: 3244, 3244: 3245, 3245: 3246, 3246: 3247, 3247: 3248, 3248: 3249, 3249: 3250, 3250: 3251, 3251: 3252, 3252: 3253, 3253: 3254, 3254: 3255, 3255: 3256, 3256: 3257, 3257: 3258, 3258: 3259, 3259: 3260, 3260: 3261, 3261: 3262, 3262: 3263, 3263: 3264, 3264: 3265, 3265: 3266, 3266: 3267, 3267: 3268, 3268: 3269, 3269: 3270, 3270: 3271, 3271: 3272, 3272: 3273, 3273: 3274, 3274: 3275, 3275: 3276, 3276: 3277, 3277: 3278, 3278: 3279, 3279: 3280, 3280: 3281, 3281: 3282, 3282: 3283, 3283: 3284, 3284: 3285, 3285: 3286, 3286: 3287, 3287: 3288, 3288: 3289, 3289: 3290, 3290: 3291, 3291: 3292, 3292: 3293, 3293: 3294, 3294: 3295, 3295: 3296, 3296: 3297, 3297: 3298, 3298: 3299, 3299: 3300, 3300: 3301, 3301: 3302, 3302: 3303, 3303: 3304, 3304: 3305, 3305: 3306, 3306: 3307, 3307: 3308, 3308: 3309, 3309: 3310, 3310: 3311, 3311: 3312, 3312: 3313, 3313: 3314, 3314: 3315, 3315: 3316, 3316: 3317, 3317: 3318, 3318: 3319, 3319: 3320, 3320: 3321, 3321: 3322, 3322: 3323, 3323: 3324, 3324: 3325, 3325: 3326, 3326: 3327, 3327: 3328, 3328: 3329, 3329: 3330, 3330: 3331, 3331: 3332, 3332: 3333, 3333: 3334, 3334: 3335, 3335: 3336, 3336: 3337, 3337: 3338, 3338: 3339, 3339: 3340, 3340: 3341, 3341: 3342, 3342: 3343, 3343: 3344, 3344: 3345, 3345: 3346, 3346: 3347, 3347: 3348, 3348: 3349, 3349: 3350, 3350: 3351, 3351: 3352, 3352: 3353, 3353: 3354, 3354: 3355, 3355: 3356, 3356: 3357, 3357: 3358, 3358: 3359, 3359: 3360, 3360: 3361, 3361: 3362, 3362: 3363, 3363: 3364, 3364: 3365, 3365: 3366, 3366: 3367, 3367: 3368, 3368: 3369, 3369: 3370, 3370: 3371, 3371: 3372, 3372: 3373, 3373: 3374, 3374: 3375, 3375: 3376, 3376: 3377, 3377: 3378, 3378: 3379, 3379: 3380, 3380: 3381, 3381: 3382, 3382: 3383, 3383: 3384, 3384: 3385, 3385: 3386, 3386: 3387, 3387: 3388, 3388: 3389, 3389: 3390, 3390: 3391, 3391: 3392, 3392: 3393, 3393: 3394, 3394: 3395, 3395: 3396, 3396: 3397, 3397: 3398, 3398: 3399, 3399: 3400, 3400: 3401, 3401: 3402, 3402: 3403, 3403: 3404, 3404: 3405, 3405: 3406, 3406: 3407, 3407: 3408, 3408: 3409, 3409: 3410, 3410: 3411, 3411: 3412, 3412: 3413, 3413: 3414, 3414: 3415, 3415: 3416, 3416: 3417, 3417: 3418, 3418: 3419, 3419: 3420, 3420: 3421, 3421: 3422, 3422: 3423, 3423: 3424, 3424: 3425, 3425: 3426, 3426: 3427, 3427: 3428, 3428: 3429, 3429: 3430, 3430: 3431, 3431: 3432, 3432: 3433, 3433: 3434, 3434: 3435, 3435: 3436, 3436: 3437, 3437: 3438, 3438: 3439, 3439: 3440, 3440: 3441, 3441: 3442, 3442: 3443, 3443: 3444, 3444: 3445, 3445: 3446, 3446: 3447, 3447: 3448, 3448: 3449, 3449: 3450, 3450: 3451, 3451: 3452, 3452: 3453, 3453: 3454, 3454: 3455, 3455: 3456, 3456: 3457, 3457: 3458, 3458: 3459, 3459: 3460, 3460: 3461, 3461: 3462, 3462: 3463, 3463: 3464, 3464: 3465, 3465: 3466, 3466: 3467, 3467: 3468, 3468: 3469, 3469: 3470, 3470: 3471, 3471: 3472, 3472: 3473, 3473: 3474, 3474: 3475, 3475: 3476, 3476: 3477, 3477: 3478, 3478: 3479, 3479: 3480, 3480: 3481, 3481: 3482, 3482: 3483, 3483: 3484, 3484: 3485, 3485: 3486, 3486: 3487, 3487: 3488, 3488: 3489, 3489: 3490, 3490: 3491, 3491: 3492, 3492: 3493, 3493: 3494, 3494: 3495, 3495: 3496, 3496: 3497, 3497: 3498, 3498: 3499, 3499: 3500, 3500: 3501, 3501: 3502, 3502: 3503, 3503: 3504, 3504: 3505, 3505: 3506, 3506: 3507, 3507: 3508, 3508: 3509, 3509: 3510, 3510: 3511, 3511: 3512, 3512: 3513, 3513: 3514, 3514: 3515, 3515: 3516, 3516: 3517, 3517: 3518, 3518: 3519, 3519: 3520, 3520: 3521, 3521: 3522, 3522: 3523, 3523: 3524, 3524: 3525, 3525: 3526, 3526: 3527, 3527: 3528, 3528: 3529, 3529: 3530, 3530: 3531, 3531: 3532, 3532: 3533, 3533: 3534, 3534: 3535, 3535: 3536, 3536: 3537, 3537: 3538, 3538: 3539, 3539: 3540, 3540: 3541, 3541: 3542, 3542: 3543, 3543: 3544, 3544: 3545, 3545: 3546, 3546: 3547, 3547: 3548, 3548: 3549, 3549: 3550, 3550: 3551, 3551: 3552, 3552: 3553, 3553: 3554, 3554: 3555, 3555: 3556, 3556: 3557, 3557: 3558, 3558: 3559, 3559: 3560, 3560: 3561, 3561: 3562, 3562: 3563, 3563: 3564, 3564: 3565, 3565: 3566, 3566: 3567, 3567: 3568, 3568: 3569, 3569: 3570, 3570: 3571, 3571: 3572, 3572: 3573, 3573: 3574, 3574: 3575, 3575: 3576, 3576: 3577, 3577: 3578, 3578: 3579, 3579: 3580, 3580: 3581, 3581: 3582, 3582: 3583, 3583: 3584, 3584: 3585, 3585: 3586, 3586: 3587, 3587: 3588, 3588: 3589, 3589: 3590, 3590: 3591, 3591: 3592, 3592: 3593, 3593: 3594, 3594: 3595, 3595: 3596, 3596: 3597, 3597: 3598, 3598: 3599, 3599: 3600, 3600: 3601, 3601: 3602, 3602: 3603, 3603: 3604, 3604: 3605, 3605: 3606, 3606: 3607, 3607: 3608, 3608: 3609, 3609: 3610, 3610: 3611, 3611: 3612, 3612: 3613, 3613: 3614, 3614: 3615, 3615: 3616, 3616: 3617, 3617: 3618, 3618: 3619, 3619: 3620, 3620: 3621, 3621: 3622, 3622: 3623, 3623: 3624, 3624: 3625, 3625: 3626, 3626: 3627, 3627: 3628, 3628: 3629, 3629: 3630, 3630: 3631, 3631: 3632, 3632: 3633, 3633: 3634, 3634: 3635, 3635: 3636, 3636: 3637, 3637: 3638, 3638: 3639, 3639: 3640, 3640: 3641, 3641: 3642, 3642: 3643, 3643: 3644, 3644: 3645, 3645: 3646, 3646: 3647, 3647: 3648, 3648: 3649, 3649: 3650, 3650: 3651, 3651: 3652, 3652: 3653, 3653: 3654, 3654: 3655, 3655: 3656, 3656: 3657, 3657: 3658, 3658: 3659, 3659: 3660, 3660: 3661, 3661: 3662, 3662: 3663, 3663: 3664, 3664: 3665, 3665: 3666, 3666: 3667, 3667: 3668, 3668: 3669, 3669: 3670, 3670: 3671, 3671: 3672, 3672: 3673, 3673: 3674, 3674: 3675, 3675: 3676, 3676: 3677, 3677: 3678, 3678: 3679, 3679: 3680, 3680: 3681, 3681: 3682, 3682: 3683, 3683: 3684, 3684: 3685, 3685: 3686, 3686: 3687, 3687: 3688, 3688: 3689, 3689: 3690, 3690: 3691, 3691: 3692, 3692: 3693, 3693: 3694, 3694: 3695, 3695: 3696, 3696: 3697, 3697: 3698, 3698: 3699, 3699: 3700, 3700: 3701, 3701: 3702, 3702: 3703, 3703: 3704, 3704: 3705, 3705: 3706, 3706: 3707, 3707: 3708, 3708: 3709, 3709: 3710, 3710: 3711, 3711: 3712, 3712: 3713, 3713: 3714, 3714: 3715, 3715: 3716, 3716: 3717, 3717: 3718, 3718: 3719, 3719: 3720, 3720: 3721, 3721: 3722, 3722: 3723, 3723: 3724, 3724: 3725, 3725: 3726, 3726: 3727, 3727: 3728, 3728: 3729, 3729: 3730, 3730: 3731, 3731: 3732, 3732: 3733, 3733: 3734, 3734: 3735, 3735: 3736, 3736: 3737, 3737: 3738, 3738: 3739, 3739: 3740, 3740: 3741, 3741: 3742, 3742: 3743, 3743: 3744, 3744: 3745, 3745: 3746, 3746: 3747, 3747: 3748, 3748: 3749, 3749: 3750, 3750: 3751, 3751: 3752, 3752: 3753, 3753: 3754, 3754: 3755, 3755: 3756, 3756: 3757, 3757: 3758, 3758: 3759, 3759: 3760, 3760: 3761, 3761: 3762, 3762: 3763, 3763: 3764, 3764: 3765, 3765: 3766, 3766: 3767, 3767: 3768, 3768: 3769, 3769: 3770, 3770: 3771, 3771: 3772, 3772: 3773, 3773: 3774, 3774: 3775, 3775: 3776, 3776: 3777, 3777: 3778, 3778: 3779, 3779: 3780, 3780: 3781, 3781: 3782, 3782: 3783, 3783: 3784, 3784: 3785, 3785: 3786, 3786: 3787, 3787: 3788, 3788: 3789, 3789: 3790, 3790: 3791, 3791: 3792, 3792: 3793, 3793: 3794, 3794: 3795, 3795: 3796, 3796: 3797, 3797: 3798, 3798: 3799, 3799: 3800, 3800: 3801, 3801: 3802, 3802: 3803, 3803: 3804, 3804: 3805, 3805: 3806, 3806: 3807, 3807: 3808, 3808: 3809, 3809: 3810, 3810: 3811, 3811: 3812, 3812: 3813, 3813: 3814, 3814: 3815, 3815: 3816, 3816: 3817, 3817: 3818, 3818: 3819, 3819: 3820, 3820: 3821, 3821: 3822, 3822: 3823, 3823: 3824, 3824: 3825, 3825: 3826, 3826: 3827, 3827: 3828, 3828: 3829, 3829: 3830, 3830: 3831, 3831: 3832, 3832: 3833, 3833: 3834, 3834: 3835, 3835: 3836, 3836: 3837, 3837: 3838, 3838: 3839, 3839: 3840, 3840: 3841, 3841: 3842, 3842: 3843, 3843: 3844, 3844: 3845, 3845: 3846, 3846: 3847, 3847: 3848, 3848: 3849, 3849: 3850, 3850: 3851, 3851: 3852, 3852: 3853, 3853: 3854, 3854: 3855, 3855: 3856, 3856: 3857, 3857: 3858, 3858: 3859, 3859: 3860, 3860: 3861, 3861: 3862, 3862: 3863, 3863: 3864, 3864: 3865, 3865: 3866, 3866: 3867, 3867: 3868, 3868: 3869, 3869: 3870, 3870: 3871, 3871: 3872, 3872: 3873, 3873: 3874, 3874: 3875, 3875: 3876, 3876: 3877, 3877: 3878, 3878: 3879, 3879: 3880, 3880: 3881, 3881: 3882, 3882: 3883, 3883: 3884, 3884: 3885, 3885: 3886, 3886: 3887, 3887: 3888, 3888: 3889, 3889: 3890, 3890: 3891, 3891: 3892, 3892: 3893, 3893: 3894, 3894: 3895, 3895: 3896, 3896: 3897, 3897: 3898, 3898: 3899, 3899: 3900, 3900: 3901, 3901: 3902, 3902: 3903, 3903: 3904, 3904: 3905, 3905: 3906, 3906: 3907, 3907: 3908, 3908: 3909, 3909: 3910, 3910: 3911, 3911: 3912, 3912: 3913, 3913: 3914, 3914: 3915, 3915: 3916, 3916: 3917, 3917: 3918, 3918: 3919, 3919: 3920, 3920: 3921, 3921: 3922, 3922: 3923, 3923: 3924, 3924: 3925, 3925: 3926, 3926: 3927, 3927: 3928, 3928: 3929, 3929: 3930, 3930: 3931, 3931: 3932, 3932: 3933, 3933: 3934, 3934: 3935, 3935: 3936, 3936: 3937, 3937: 3938, 3938: 3939, 3939: 3940, 3940: 3941, 3941: 3942, 3942: 3943, 3943: 3944, 3944: 3945, 3945: 3946, 3946: 3947, 3947: 3948, 3948: 3949, 3949: 3950, 3950: 3951, 3951: 3952, 3952: 3953, 3953: 3954, 3954: 3955, 3955: 3956, 3956: 3957, 3957: 3958, 3958: 3959, 3959: 3960, 3960: 3961, 3961: 3962, 3962: 3963, 3963: 3964, 3964: 3965, 3965: 3966, 3966: 3967, 3967: 3968, 3968: 3969, 3969: 3970, 3970: 3971, 3971: 3972, 3972: 3973, 3973: 3974, 3974: 3975, 3975: 3976, 3976: 3977, 3977: 3978, 3978: 3979, 3979: 3980, 3980: 3981, 3981: 3982, 3982: 3983, 3983: 3984, 3984: 3985, 3985: 3986, 3986: 3987, 3987: 3988, 3988: 3989, 3989: 3990, 3990: 3991, 3991: 3992, 3992: 3993, 3993: 3994, 3994: 3995, 3995: 3996, 3996: 3997, 3997: 3998, 3998: 3999, 3999: 4000, 4000: 4001, 4001: 4002, 4002: 4003, 4003: 4004, 4004: 4005, 4005: 4006, 4006: 4007, 4007: 4008, 4008: 4009, 4009: 4010, 4010: 4011, 4011: 4012, 4012: 4013, 4013: 4014, 4014: 4015, 4015: 4016, 4016: 4017, 4017: 4018, 4018: 4019, 4019: 4020, 4020: 4021, 4021: 4022, 4022: 4023, 4023: 4024, 4024: 4025, 4025: 4026, 4026: 4027, 4027: 4028, 4028: 4029, 4029: 4030, 4030: 4031, 4031: 4032, 4032: 4033, 4033: 4034, 4034: 4035, 4035: 4036, 4036: 4037, 4037: 4038, 4038: 4039, 4039: 4040, 4040: 4041, 4041: 4042, 4042: 4043, 4043: 4044, 4044: 4045, 4045: 4046, 4046: 4047, 4047: 4048, 4048: 4049, 4049: 4050, 4050: 4051, 4051: 4052, 4052: 4053, 4053: 4054, 4054: 4055, 4055: 4056, 4056: 4057, 4057: 4058, 4058: 4059, 4059: 4060, 4060: 4061, 4061: 4062, 4062: 4063, 4063: 4064, 4064: 4065, 4065: 4066, 4066: 4067, 4067: 4068, 4068: 4069, 4069: 4070, 4070: 4071, 4071: 4072, 4072: 4073, 4073: 4074, 4074: 4075, 4075: 4076, 4076: 4077, 4077: 4078, 4078: 4079, 4079: 4080, 4080: 4081, 4081: 4082, 4082: 4083, 4083: 4084, 4084: 4085, 4085: 4086, 4086: 4087, 4087: 4088, 4088: 4089, 4089: 4090, 4090: 4091, 4091: 4092, 4092: 4093, 4093: 4094, 4094: 4095, 4095: 4096, 4096: 4097, 4097: 4098, 4098: 4099, 4099: 4100, 4100: 4101, 4101: 4102, 4102: 4103, 4103: 4104, 4104: 4105, 4105: 4106, 4106: 4107, 4107: 4108, 4108: 4109, 4109: 4110, 4110: 4111, 4111: 4112, 4112: 4113, 4113: 4114, 4114: 4115, 4115: 4116, 4116: 4117, 4117: 4118, 4118: 4119, 4119: 4120, 4120: 4121, 4121: 4122, 4122: 4123, 4123: 4124, 4124: 4125, 4125: 4126, 4126: 4127, 4127: 4128, 4128: 4129, 4129: 4130, 4130: 4131, 4131: 4132, 4132: 4133, 4133: 4134, 4134: 4135, 4135: 4136, 4136: 4137, 4137: 4138, 4138: 4139, 4139: 4140, 4140: 4141, 4141: 4142, 4142: 4143, 4143: 4144, 4144: 4145, 4145: 4146, 4146: 4147, 4147: 4148, 4148: 4149, 4149: 4150, 4150: 4151, 4151: 4152, 4152: 4153, 4153: 4154, 4154: 4155, 4155: 4156, 4156: 4157, 4157: 4158, 4158: 4159, 4159: 4160, 4160: 4161, 4161: 4162, 4162: 4163, 4163: 4164, 4164: 4165, 4165: 4166, 4166: 4167, 4167: 4168, 4168: 4169, 4169: 4170, 4170: 4171, 4171: 4172, 4172: 4173, 4173: 4174, 4174: 4175, 4175: 4176, 4176: 4177, 4177: 4178, 4178: 4179, 4179: 4180, 4180: 4181, 4181: 4182, 4182: 4183, 4183: 4184, 4184: 4185, 4185: 4186, 4186: 4187, 4187: 4188, 4188: 4189, 4189: 4190, 4190: 4191, 4191: 4192, 4192: 4193, 4193: 4194, 4194: 4195, 4195: 4196, 4196: 4197, 4197: 4198, 4198: 4199, 4199: 4200, 4200: 4201, 4201: 4202, 4202: 4203, 4203: 4204, 4204: 4205, 4205: 4206, 4206: 4207, 4207: 4208, 4208: 4209, 4209: 4210, 4210: 4211, 4211: 4212, 4212: 4213, 4213: 4214, 4214: 4215, 4215: 4216, 4216: 4217, 4217: 4218, 4218: 4219, 4219: 4220, 4220: 4221, 4221: 4222, 4222: 4223, 4223: 4224, 4224: 4225, 4225: 4226, 4226: 4227, 4227: 4228, 4228: 4229, 4229: 4230, 4230: 4231, 4231: 4232, 4232: 4233, 4233: 4234, 4234: 4235, 4235: 4236, 4236: 4237, 4237: 4238, 4238: 4239, 4239: 4240, 4240: 4241, 4241: 4242, 4242: 4243, 4243: 4244, 4244: 4245, 4245: 4246, 4246: 4247, 4247: 4248, 4248: 4249, 4249: 4250, 4250: 4251, 4251: 4252, 4252: 4253, 4253: 4254, 4254: 4255, 4255: 4256, 4256: 4257, 4257: 4258, 4258: 4259, 4259: 4260, 4260: 4261, 4261: 4262, 4262: 4263, 4263: 4264, 4264: 4265, 4265: 4266, 4266: 4267, 4267: 4268, 4268: 4269, 4269: 4270, 4270: 4271, 4271: 4272, 4272: 4273, 4273: 4274, 4274: 4275, 4275: 4276, 4276: 4277, 4277: 4278, 4278: 4279, 4279: 4280, 4280: 4281, 4281: 4282, 4282: 4283, 4283: 4284, 4284: 4285, 4285: 4286, 4286: 4287, 4287: 4288, 4288: 4289, 4289: 4290, 4290: 4291, 4291: 4292, 4292: 4293, 4293: 4294, 4294: 4295, 4295: 4296, 4296: 4297, 4297: 4298, 4298: 4299, 4299: 4300, 4300: 4301, 4301: 4302, 4302: 4303, 4303: 4304, 4304: 4305, 4305: 4306, 4306: 4307, 4307: 4308, 4308: 4309, 4309: 4310, 4310: 4311, 4311: 4312, 4312: 4313, 4313: 4314, 4314: 4315, 4315: 4316, 4316: 4317, 4317: 4318, 4318: 4319, 4319: 4320, 4320: 4321, 4321: 4322, 4322: 4323, 4323: 4324, 4324: 4325, 4325: 4326, 4326: 4327, 4327: 4328, 4328: 4329, 4329: 4330, 4330: 4331, 4331: 4332, 4332: 4333, 4333: 4334, 4334: 4335, 4335: 4336, 4336: 4337, 4337: 4338, 4338: 4339, 4339: 4340, 4340: 4341, 4341: 4342, 4342: 4343, 4343: 4344, 4344: 4345, 4345: 4346, 4346: 4347, 4347: 4348, 4348: 4349, 4349: 4350, 4350: 4351, 4351: 4352, 4352: 4353, 4353: 4354, 4354: 4355, 4355: 4356, 4356: 4357, 4357: 4358, 4358: 4359, 4359: 4360, 4360: 4361, 4361: 4362, 4362: 4363, 4363: 4364, 4364: 4365, 4365: 4366, 4366: 4367, 4367: 4368, 4368: 4369, 4369: 4370, 4370: 4371, 4371: 4372, 4372: 4373, 4373: 4374, 4374: 4375, 4375: 4376, 4376: 4377, 4377: 4378, 4378: 4379, 4379: 4380, 4380: 4381, 4381: 4382, 4382: 4383, 4383: 4384, 4384: 4385, 4385: 4386, 4386: 4387, 4387: 4388, 4388: 4389, 4389: 4390, 4390: 4391, 4391: 4392, 4392: 4393, 4393: 4394, 4394: 4395, 4395: 4396, 4396: 4397, 4397: 4398, 4398: 4399, 4399: 4400, 4400: 4401, 4401: 4402, 4402: 4403, 4403: 4404, 4404: 4405, 4405: 4406, 4406: 4407, 4407: 4408, 4408: 4409, 4409: 4410, 4410: 4411, 4411: 4412, 4412: 4413, 4413: 4414, 4414: 4415, 4415: 4416, 4416: 4417, 4417: 4418, 4418: 4419, 4419: 4420, 4420: 4421, 4421: 4422, 4422: 4423, 4423: 4424, 4424: 4425, 4425: 4426, 4426: 4427, 4427: 4428, 4428: 4429, 4429: 4430, 4430: 4431, 4431: 4432, 4432: 4433, 4433: 4434, 4434: 4435, 4435: 4436, 4436: 4437, 4437: 4438, 4438: 4439, 4439: 4440, 4440: 4441, 4441: 4442, 4442: 4443, 4443: 4444, 4444: 4445, 4445: 4446, 4446: 4447, 4447: 4448, 4448: 4449, 4449: 4450, 4450: 4451, 4451: 4452, 4452: 4453, 4453: 4454, 4454: 4455, 4455: 4456, 4456: 4457, 4457: 4458, 4458: 4459, 4459: 4460, 4460: 4461, 4461: 4462, 4462: 4463, 4463: 4464, 4464: 4465, 4465: 4466, 4466: 4467, 4467: 4468, 4468: 4469, 4469: 4470, 4470: 4471, 4471: 4472, 4472: 4473, 4473: 4474, 4474: 4475, 4475: 4476, 4476: 4477, 4477: 4478, 4478: 4479, 4479: 4480, 4480: 4481, 4481: 4482, 4482: 4483, 4483: 4484, 4484: 4485, 4485: 4486, 4486: 4487, 4487: 4488, 4488: 4489, 4489: 4490, 4490: 4491, 4491: 4492, 4492: 4493, 4493: 4494, 4494: 4495, 4495: 4496, 4496: 4497, 4497: 4498, 4498: 4499, 4499: 4500, 4500: 4501, 4501: 4502, 4502: 4503, 4503: 4504, 4504: 4505, 4505: 4506, 4506: 4507, 4507: 4508, 4508: 4509, 4509: 4510, 4510: 4511, 4511: 4512, 4512: 4513, 4513: 4514, 4514: 4515, 4515: 4516, 4516: 4517, 4517: 4518, 4518: 4519, 4519: 4520, 4520: 4521, 4521: 4522, 4522: 4523, 4523: 4524, 4524: 4525, 4525: 4526, 4526: 4527, 4527: 4528, 4528: 4529, 4529: 4530, 4530: 4531, 4531: 4532, 4532: 4533, 4533: 4534, 4534: 4535, 4535: 4536, 4536: 4537, 4537: 4538, 4538: 4539, 4539: 4540, 4540: 4541, 4541: 4542, 4542: 4543, 4543: 4544, 4544: 4545, 4545: 4546, 4546: 4547, 4547: 4548, 4548: 4549, 4549: 4550, 4550: 4551, 4551: 4552, 4552: 4553, 4553: 4554, 4554: 4555, 4555: 4556, 4556: 4557, 4557: 4558, 4558: 4559, 4559: 4560, 4560: 4561, 4561: 4562, 4562: 4563, 4563: 4564, 4564: 4565, 4565: 4566, 4566: 4567, 4567: 4568, 4568: 4569, 4569: 4570, 4570: 4571, 4571: 4572, 4572: 4573, 4573: 4574, 4574: 4575, 4575: 4576, 4576: 4577, 4577: 4578, 4578: 4579, 4579: 4580, 4580: 4581, 4581: 4582, 4582: 4583, 4583: 4584, 4584: 4585, 4585: 4586, 4586: 4587, 4587: 4588, 4588: 4589, 4589: 4590, 4590: 4591, 4591: 4592, 4592: 4593, 4593: 4594, 4594: 4595, 4595: 4596, 4596: 4597, 4597: 4598, 4598: 4599, 4599: 4600, 4600: 4601, 4601: 4602, 4602: 4603, 4603: 4604, 4604: 4605, 4605: 4606, 4606: 4607, 4607: 4608, 4608: 4609, 4609: 4610, 4610: 4611, 4611: 4612, 4612: 4613, 4613: 4614, 4614: 4615, 4615: 4616, 4616: 4617, 4617: 4618, 4618: 4619, 4619: 4620, 4620: 4621, 4621: 4622, 4622: 4623, 4623: 4624, 4624: 4625, 4625: 4626, 4626: 4627, 4627: 4628, 4628: 4629, 4629: 4630, 4630: 4631, 4631: 4632, 4632: 4633, 4633: 4634, 4634: 4635, 4635: 4636, 4636: 4637, 4637: 4638, 4638: 4639, 4639: 4640, 4640: 4641, 4641: 4642, 4642: 4643, 4643: 4644, 4644: 4645, 4645: 4646, 4646: 4647, 4647: 4648, 4648: 4649, 4649: 4650, 4650: 4651, 4651: 4652, 4652: 4653, 4653: 4654, 4654: 4655, 4655: 4656, 4656: 4657, 4657: 4658, 4658: 4659, 4659: 4660, 4660: 4661, 4661: 4662, 4662: 4663, 4663: 4664, 4664: 4665, 4665: 4666, 4666: 4667, 4667: 4668, 4668: 4669, 4669: 4670, 4670: 4671, 4671: 4672, 4672: 4673, 4673: 4674, 4674: 4675, 4675: 4676, 4676: 4677, 4677: 4678, 4678: 4679, 4679: 4680, 4680: 4681, 4681: 4682, 4682: 4683, 4683: 4684, 4684: 4685, 4685: 4686, 4686: 4687, 4687: 4688, 4688: 4689, 4689: 4690, 4690: 4691, 4691: 4692, 4692: 4693, 4693: 4694, 4694: 4695, 4695: 4696, 4696: 4697, 4697: 4698, 4698: 4699, 4699: 4700, 4700: 4701, 4701: 4702, 4702: 4703, 4703: 4704, 4704: 4705, 4705: 4706, 4706: 4707, 4707: 4708, 4708: 4709, 4709: 4710, 4710: 4711, 4711: 4712, 4712: 4713, 4713: 4714, 4714: 4715, 4715: 4716, 4716: 4717, 4717: 4718, 4718: 4719, 4719: 4720, 4720: 4721, 4721: 4722, 4722: 4723, 4723: 4724, 4724: 4725, 4725: 4726, 4726: 4727, 4727: 4728, 4728: 4729, 4729: 4730, 4730: 4731, 4731: 4732, 4732: 4733, 4733: 4734, 4734: 4735, 4735: 4736, 4736: 4737, 4737: 4738, 4738: 4739, 4739: 4740, 4740: 4741, 4741: 4742, 4742: 4743, 4743: 4744, 4744: 4745, 4745: 4746, 4746: 4747, 4747: 4748, 4748: 4749, 4749: 4750, 4750: 4751, 4751: 4752, 4752: 4753, 4753: 4754, 4754: 4755, 4755: 4756, 4756: 4757, 4757: 4758, 4758: 4759, 4759: 4760, 4760: 4761, 4761: 4762, 4762: 4763, 4763: 4764, 4764: 4765, 4765: 4766, 4766: 4767, 4767: 4768, 4768: 4769, 4769: 4770, 4770: 4771, 4771: 4772, 4772: 4773, 4773: 4774, 4774: 4775, 4775: 4776, 4776: 4777, 4777: 4778, 4778: 4779, 4779: 4780, 4780: 4781, 4781: 4782, 4782: 4783, 4783: 4784, 4784: 4785, 4785: 4786, 4786: 4787, 4787: 4788, 4788: 4789, 4789: 4790, 4790: 4791, 4791: 4792, 4792: 4793, 4793: 4794, 4794: 4795, 4795: 4796, 4796: 4797, 4797: 4798, 4798: 4799, 4799: 4800, 4800: 4801, 4801: 4802, 4802: 4803, 4803: 4804, 4804: 4805, 4805: 4806, 4806: 4807, 4807: 4808, 4808: 4809, 4809: 4810, 4810: 4811, 4811: 4812, 4812: 4813, 4813: 4814, 4814: 4815, 4815: 4816, 4816: 4817, 4817: 4818, 4818: 4819, 4819: 4820, 4820: 4821, 4821: 4822, 4822: 4823, 4823: 4824, 4824: 4825, 4825: 4826, 4826: 4827, 4827: 4828, 4828: 4829, 4829: 4830, 4830: 4831, 4831: 4832, 4832: 4833, 4833: 4834, 4834: 4835, 4835: 4836, 4836: 4837, 4837: 4838, 4838: 4839, 4839: 4840, 4840: 4841, 4841: 4842, 4842: 4843, 4843: 4844, 4844: 4845, 4845: 4846, 4846: 4847, 4847: 4848, 4848: 4849, 4849: 4850, 4850: 4851, 4851: 4852, 4852: 4853, 4853: 4854, 4854: 4855, 4855: 4856, 4856: 4857, 4857: 4858, 4858: 4859, 4859: 4860, 4860: 4861, 4861: 4862, 4862: 4863, 4863: 4864, 4864: 4865, 4865: 4866, 4866: 4867, 4867: 4868, 4868: 4869, 4869: 4870, 4870: 4871, 4871: 4872, 4872: 4873, 4873: 4874, 4874: 4875, 4875: 4876, 4876: 4877, 4877: 4878, 4878: 4879, 4879: 4880, 4880: 4881, 4881: 4882, 4882: 4883, 4883: 4884, 4884: 4885, 4885: 4886, 4886: 4887, 4887: 4888, 4888: 4889, 4889: 4890, 4890: 4891, 4891: 4892, 4892: 4893, 4893: 4894, 4894: 4895, 4895: 4896, 4896: 4897, 4897: 4898, 4898: 4899, 4899: 4900, 4900: 4901, 4901: 4902, 4902: 4903, 4903: 4904, 4904: 4905, 4905: 4906, 4906: 4907, 4907: 4908, 4908: 4909, 4909: 4910, 4910: 4911, 4911: 4912, 4912: 4913, 4913: 4914, 4914: 4915, 4915: 4916, 4916: 4917, 4917: 4918, 4918: 4919, 4919: 4920, 4920: 4921, 4921: 4922, 4922: 4923, 4923: 4924, 4924: 4925, 4925: 4926, 4926: 4927, 4927: 4928, 4928: 4929, 4929: 4930, 4930: 4931, 4931: 4932, 4932: 4933, 4933: 4934, 4934: 4935, 4935: 4936, 4936: 4937, 4937: 4938, 4938: 4939, 4939: 4940, 4940: 4941, 4941: 4942, 4942: 4943, 4943: 4944, 4944: 4945, 4945: 4946, 4946: 4947, 4947: 4948, 4948: 4949, 4949: 4950, 4950: 4951, 4951: 4952, 4952: 4953, 4953: 4954, 4954: 4955, 4955: 4956, 4956: 4957, 4957: 4958, 4958: 4959, 4959: 4960, 4960: 4961, 4961: 4962, 4962: 4963, 4963: 4964, 4964: 4965, 4965: 4966, 4966: 4967, 4967: 4968, 4968: 4969, 4969: 4970, 4970: 4971, 4971: 4972, 4972: 4973, 4973: 4974, 4974: 4975, 4975: 4976, 4976: 4977, 4977: 4978, 4978: 4979, 4979: 4980, 4980: 4981, 4981: 4982, 4982: 4983, 4983: 4984, 4984: 4985, 4985: 4986, 4986: 4987, 4987: 4988, 4988: 4989, 4989: 4990, 4990: 4991, 4991: 4992, 4992: 4993, 4993: 4994, 4994: 4995, 4995: 4996, 4996: 4997, 4997: 4998, 4998: 4999, 4999: 5000, 5000: 5001, 5001: 5002, 5002: 5003, 5003: 5004, 5004: 5005, 5005: 5006, 5006: 5007, 5007: 5008, 5008: 5009, 5009: 5010, 5010: 5011, 5011: 5012, 5012: 5013, 5013: 5014, 5014: 5015, 5015: 5016, 5016: 5017, 5017: 5018, 5018: 5019, 5019: 5020, 5020: 5021, 5021: 5022, 5022: 5023, 5023: 5024, 5024: 5025, 5025: 5026, 5026: 5027, 5027: 5028, 5028: 5029, 5029: 5030, 5030: 5031, 5031: 5032, 5032: 5033, 5033: 5034, 5034: 5035, 5035: 5036, 5036: 5037, 5037: 5038, 5038: 5039, 5039: 5040, 5040: 5041, 5041: 5042, 5042: 5043, 5043: 5044, 5044: 5045, 5045: 5046, 5046: 5047, 5047: 5048, 5048: 5049, 5049: 5050, 5050: 5051, 5051: 5052, 5052: 5053, 5053: 5054, 5054: 5055, 5055: 5056, 5056: 5057, 5057: 5058, 5058: 5059, 5059: 5060, 5060: 5061, 5061: 5062, 5062: 5063, 5063: 5064, 5064: 5065, 5065: 5066, 5066: 5067, 5067: 5068, 5068: 5069, 5069: 5070, 5070: 5071, 5071: 5072, 5072: 5073, 5073: 5074, 5074: 5075, 5075: 5076, 5076: 5077, 5077: 5078, 5078: 5079, 5079: 5080, 5080: 5081, 5081: 5082, 5082: 5083, 5083: 5084, 5084: 5085, 5085: 5086, 5086: 5087, 5087: 5088, 5088: 5089, 5089: 5090, 5090: 5091, 5091: 5092, 5092: 5093, 5093: 5094, 5094: 5095, 5095: 5096, 5096: 5097, 5097: 5098, 5098: 5099, 5099: 5100, 5100: 5101, 5101: 5102, 5102: 5103, 5103: 5104, 5104: 5105, 5105: 5106, 5106: 5107, 5107: 5108, 5108: 5109, 5109: 5110, 5110: 5111, 5111: 5112, 5112: 5113, 5113: 5114, 5114: 5115, 5115: 5116, 5116: 5117, 5117: 5118, 5118: 5119, 5119: 5120, 5120: 5121, 5121: 5122, 5122: 5123, 5123: 5124, 5124: 5125, 5125: 5126, 5126: 5127, 5127: 5128, 5128: 5129, 5129: 5130, 5130: 5131, 5131: 5132, 5132: 5133, 5133: 5134, 5134: 5135, 5135: 5136, 5136: 5137, 5137: 5138, 5138: 5139, 5139: 5140, 5140: 5141, 5141: 5142, 5142: 5143, 5143: 5144, 5144: 5145, 5145: 5146, 5146: 5147, 5147: 5148, 5148: 5149, 5149: 5150, 5150: 5151, 5151: 5152, 5152: 5153, 5153: 5154, 5154: 5155, 5155: 5156, 5156: 5157, 5157: 5158, 5158: 5159, 5159: 5160, 5160: 5161, 5161: 5162, 5162: 5163, 5163: 5164, 5164: 5165, 5165: 5166, 5166: 5167, 5167: 5168, 5168: 5169, 5169: 5170, 5170: 5171, 5171: 5172, 5172: 5173, 5173: 5174, 5174: 5175, 5175: 5176, 5176: 5177, 5177: 5178, 5178: 5179, 5179: 5180, 5180: 5181, 5181: 5182, 5182: 5183, 5183: 5184, 5184: 5185, 5185: 5186, 5186: 5187, 5187: 5188, 5188: 5189, 5189: 5190, 5190: 5191, 5191: 5192, 5192: 5193, 5193: 5194, 5194: 5195, 5195: 5196, 5196: 5197, 5197: 5198, 5198: 5199, 5199: 5200, 5200: 5201, 5201: 5202, 5202: 5203, 5203: 5204, 5204: 5205, 5205: 5206, 5206: 5207, 5207: 5208, 5208: 5209, 5209: 5210, 5210: 5211, 5211: 5212, 5212: 5213, 5213: 5214, 5214: 5215, 5215: 5216, 5216: 5217, 5217: 5218, 5218: 5219, 5219: 5220, 5220: 5221, 5221: 5222, 5222: 5223, 5223: 5224, 5224: 5225, 5225: 5226, 5226: 5227, 5227: 5228, 5228: 5229, 5229: 5230, 5230: 5231, 5231: 5232, 5232: 5233, 5233: 5234, 5234: 5235, 5235: 5236, 5236: 5237, 5237: 5238, 5238: 5239, 5239: 5240, 5240: 5241, 5241: 5242, 5242: 5243, 5243: 5244, 5244: 5245, 5245: 5246, 5246: 5247, 5247: 5248, 5248: 5249, 5249: 5250, 5250: 5251, 5251: 5252, 5252: 5253, 5253: 5254, 5254: 5255, 5255: 5256, 5256: 5257, 5257: 5258, 5258: 5259, 5259: 5260, 5260: 5261, 5261: 5262, 5262: 5263, 5263: 5264, 5264: 5265, 5265: 5266, 5266: 5267, 5267: 5268, 5268: 5269, 5269: 5270, 5270: 5271, 5271: 5272, 5272: 5273, 5273: 5274, 5274: 5275, 5275: 5276, 5276: 5277, 5277: 5278, 5278: 5279, 5279: 5280, 5280: 5281, 5281: 5282, 5282: 5283, 5283: 5284, 5284: 5285, 5285: 5286, 5286: 5287, 5287: 5288, 5288: 5289, 5289: 5290, 5290: 5291, 5291: 5292, 5292: 5293, 5293: 5294, 5294: 5295, 5295: 5296, 5296: 5297, 5297: 5298, 5298: 5299, 5299: 5300, 5300: 5301, 5301: 5302, 5302: 5303, 5303: 5304, 5304: 5305, 5305: 5306, 5306: 5307, 5307: 5308, 5308: 5309, 5309: 5310, 5310: 5311, 5311: 5312, 5312: 5313, 5313: 5314, 5314: 5315, 5315: 5316, 5316: 5317, 5317: 5318, 5318: 5319, 5319: 5320, 5320: 5321, 5321: 5322, 5322: 5323, 5323: 5324, 5324: 5325, 5325: 5326, 5326: 5327, 5327: 5328, 5328: 5329, 5329: 5330, 5330: 5331, 5331: 5332, 5332: 5333, 5333: 5334, 5334: 5335, 5335: 5336, 5336: 5337, 5337: 5338, 5338: 5339, 5339: 5340, 5340: 5341, 5341: 5342, 5342: 5343, 5343: 5344, 5344: 5345, 5345: 5346, 5346: 5347, 5347: 5348, 5348: 5349, 5349: 5350, 5350: 5351, 5351: 5352, 5352: 5353, 5353: 5354, 5354: 5355, 5355: 5356, 5356: 5357, 5357: 5358, 5358: 5359, 5359: 5360, 5360: 5361, 5361: 5362, 5362: 5363, 5363: 5364, 5364: 5365, 5365: 5366, 5366: 5367, 5367: 5368, 5368: 5369, 5369: 5370, 5370: 5371, 5371: 5372, 5372: 5373, 5373: 5374, 5374: 5375, 5375: 5376, 5376: 5377, 5377: 5378, 5378: 5379, 5379: 5380, 5380: 5381, 5381: 5382, 5382: 5383, 5383: 5384, 5384: 5385, 5385: 5386, 5386: 5387, 5387: 5388, 5388: 5389, 5389: 5390, 5390: 5391, 5391: 5392, 5392: 5393, 5393: 5394, 5394: 5395, 5395: 5396, 5396: 5397, 5397: 5398, 5398: 5399, 5399: 5400, 5400: 5401, 5401: 5402, 5402: 5403, 5403: 5404, 5404: 5405, 5405: 5406, 5406: 5407, 5407: 5408, 5408: 5409, 5409: 5410, 5410: 5411, 5411: 5412, 5412: 5413, 5413: 5414, 5414: 5415, 5415: 5416, 5416: 5417, 5417: 5418, 5418: 5419, 5419: 5420, 5420: 5421, 5421: 5422, 5422: 5423, 5423: 5424, 5424: 5425, 5425: 5426, 5426: 5427, 5427: 5428, 5428: 5429, 5429: 5430, 5430: 5431, 5431: 5432, 5432: 5433, 5433: 5434, 5434: 5435, 5435: 5436, 5436: 5437, 5437: 5438, 5438: 5439, 5439: 5440, 5440: 5441, 5441: 5442, 5442: 5443, 5443: 5444, 5444: 5445, 5445: 5446, 5446: 5447, 5447: 5448, 5448: 5449, 5449: 5450, 5450: 5451, 5451: 5452, 5452: 5453, 5453: 5454, 5454: 5455, 5455: 5456, 5456: 5457, 5457: 5458, 5458: 5459, 5459: 5460, 5460: 5461, 5461: 5462, 5462: 5463, 5463: 5464, 5464: 5465, 5465: 5466, 5466: 5467, 5467: 5468, 5468: 5469, 5469: 5470, 5470: 5471, 5471: 5472, 5472: 5473, 5473: 5474, 5474: 5475, 5475: 5476, 5476: 5477, 5477: 5478, 5478: 5479, 5479: 5480, 5480: 5481, 5481: 5482, 5482: 5483, 5483: 5484, 5484: 5485, 5485: 5486, 5486: 5487, 5487: 5488, 5488: 5489, 5489: 5490, 5490: 5491, 5491: 5492, 5492: 5493, 5493: 5494, 5494: 5495, 5495: 5496, 5496: 5497, 5497: 5498, 5498: 5499, 5499: 5500, 5500: 5501, 5501: 5502, 5502: 5503, 5503: 5504, 5504: 5505, 5505: 5506, 5506: 5507, 5507: 5508, 5508: 5509, 5509: 5510, 5510: 5511, 5511: 5512, 5512: 5513, 5513: 5514, 5514: 5515, 5515: 5516, 5516: 5517, 5517: 5518, 5518: 5519, 5519: 5520, 5520: 5521, 5521: 5522, 5522: 5523, 5523: 5524, 5524: 5525, 5525: 5526, 5526: 5527, 5527: 5528, 5528: 5529, 5529: 5530, 5530: 5531, 5531: 5532, 5532: 5533, 5533: 5534, 5534: 5535, 5535: 5536, 5536: 5537, 5537: 5538, 5538: 5539, 5539: 5540, 5540: 5541, 5541: 5542, 5542: 5543, 5543: 5544, 5544: 5545, 5545: 5546, 5546: 5547, 5547: 5548, 5548: 5549, 5549: 5550, 5550: 5551, 5551: 5552, 5552: 5553, 5553: 5554, 5554: 5555, 5555: 5556, 5556: 5557, 5557: 5558, 5558: 5559, 5559: 5560, 5560: 5561, 5561: 5562, 5562: 5563, 5563: 5564, 5564: 5565, 5565: 5566, 5566: 5567, 5567: 5568, 5568: 5569, 5569: 5570, 5570: 5571, 5571: 5572, 5572: 5573, 5573: 5574, 5574: 5575, 5575: 5576, 5576: 5577, 5577: 5578, 5578: 5579, 5579: 5580, 5580: 5581, 5581: 5582, 5582: 5583, 5583: 5584, 5584: 5585, 5585: 5586, 5586: 5587, 5587: 5588, 5588: 5589, 5589: 5590, 5590: 5591, 5591: 5592, 5592: 5593, 5593: 5594, 5594: 5595, 5595: 5596, 5596: 5597, 5597: 5598, 5598: 5599, 5599: 5600, 5600: 5601, 5601: 5602, 5602: 5603, 5603: 5604, 5604: 5605, 5605: 5606, 5606: 5607, 5607: 5608, 5608: 5609, 5609: 5610, 5610: 5611, 5611: 5612, 5612: 5613, 5613: 5614, 5614: 5615, 5615: 5616, 5616: 5617, 5617: 5618, 5618: 5619, 5619: 5620, 5620: 5621, 5621: 5622, 5622: 5623, 5623: 5624, 5624: 5625, 5625: 5626, 5626: 5627, 5627: 5628, 5628: 5629, 5629: 5630, 5630: 5631, 5631: 5632, 5632: 5633, 5633: 5634, 5634: 5635, 5635: 5636, 5636: 5637, 5637: 5638, 5638: 5639, 5639: 5640, 5640: 5641, 5641: 5642, 5642: 5643, 5643: 5644, 5644: 5645, 5645: 5646, 5646: 5647, 5647: 5648, 5648: 5649, 5649: 5650, 5650: 5651, 5651: 5652, 5652: 5653, 5653: 5654, 5654: 5655, 5655: 5656, 5656: 5657, 5657: 5658, 5658: 5659, 5659: 5660, 5660: 5661, 5661: 5662, 5662: 5663, 5663: 5664, 5664: 5665, 5665: 5666, 5666: 5667, 5667: 5668, 5668: 5669, 5669: 5670, 5670: 5671, 5671: 5672, 5672: 5673, 5673: 5674, 5674: 5675, 5675: 5676, 5676: 5677, 5677: 5678, 5678: 5679, 5679: 5680, 5680: 5681, 5681: 5682, 5682: 5683, 5683: 5684, 5684: 5685, 5685: 5686, 5686: 5687, 5687: 5688, 5688: 5689, 5689: 5690, 5690: 5691, 5691: 5692, 5692: 5693, 5693: 5694, 5694: 5695, 5695: 5696, 5696: 5697, 5697: 5698, 5698: 5699, 5699: 5700, 5700: 5701, 5701: 5702, 5702: 5703, 5703: 5704, 5704: 5705, 5705: 5706, 5706: 5707, 5707: 5708, 5708: 5709, 5709: 5710, 5710: 5711, 5711: 5712, 5712: 5713, 5713: 5714, 5714: 5715, 5715: 5716, 5716: 5717, 5717: 5718, 5718: 5719, 5719: 5720, 5720: 5721, 5721: 5722, 5722: 5723, 5723: 5724, 5724: 5725, 5725: 5726, 5726: 5727, 5727: 5728, 5728: 5729, 5729: 5730, 5730: 5731, 5731: 5732, 5732: 5733, 5733: 5734, 5734: 5735, 5735: 5736, 5736: 5737, 5737: 5738, 5738: 5739, 5739: 5740, 5740: 5741, 5741: 5742, 5742: 5743, 5743: 5744, 5744: 5745, 5745: 5746, 5746: 5747, 5747: 5748, 5748: 5749, 5749: 5750, 5750: 5751, 5751: 5752, 5752: 5753, 5753: 5754, 5754: 5755, 5755: 5756, 5756: 5757, 5757: 5758, 5758: 5759, 5759: 5760, 5760: 5761, 5761: 5762, 5762: 5763, 5763: 5764, 5764: 5765, 5765: 5766, 5766: 5767, 5767: 5768, 5768: 5769, 5769: 5770, 5770: 5771, 5771: 5772, 5772: 5773, 5773: 5774, 5774: 5775, 5775: 5776, 5776: 5777, 5777: 5778, 5778: 5779, 5779: 5780, 5780: 5781, 5781: 5782, 5782: 5783, 5783: 5784, 5784: 5785, 5785: 5786, 5786: 5787, 5787: 5788, 5788: 5789, 5789: 5790, 5790: 5791, 5791: 5792, 5792: 5793, 5793: 5794, 5794: 5795, 5795: 5796, 5796: 5797, 5797: 5798, 5798: 5799, 5799: 5800, 5800: 5801, 5801: 5802, 5802: 5803, 5803: 5804, 5804: 5805, 5805: 5806, 5806: 5807, 5807: 5808, 5808: 5809, 5809: 5810, 5810: 5811, 5811: 5812, 5812: 5813, 5813: 5814, 5814: 5815, 5815: 5816, 5816: 5817, 5817: 5818, 5818: 5819, 5819: 5820, 5820: 5821, 5821: 5822, 5822: 5823, 5823: 5824, 5824: 5825, 5825: 5826, 5826: 5827, 5827: 5828, 5828: 5829, 5829: 5830, 5830: 5831, 5831: 5832, 5832: 5833, 5833: 5834, 5834: 5835, 5835: 5836, 5836: 5837, 5837: 5838, 5838: 5839, 5839: 5840, 5840: 5841, 5841: 5842, 5842: 5843, 5843: 5844, 5844: 5845, 5845: 5846, 5846: 5847, 5847: 5848, 5848: 5849, 5849: 5850, 5850: 5851, 5851: 5852, 5852: 5853, 5853: 5854, 5854: 5855, 5855: 5856, 5856: 5857, 5857: 5858, 5858: 5859, 5859: 5860, 5860: 5861, 5861: 5862, 5862: 5863, 5863: 5864, 5864: 5865, 5865: 5866, 5866: 5867, 5867: 5868, 5868: 5869, 5869: 5870, 5870: 5871, 5871: 5872, 5872: 5873, 5873: 5874, 5874: 5875, 5875: 5876, 5876: 5877, 5877: 5878, 5878: 5879, 5879: 5880, 5880: 5881, 5881: 5882, 5882: 5883, 5883: 5884, 5884: 5885, 5885: 5886, 5886: 5887, 5887: 5888, 5888: 5889, 5889: 5890, 5890: 5891, 5891: 5892, 5892: 5893, 5893: 5894, 5894: 5895, 5895: 5896, 5896: 5897, 5897: 5898, 5898: 5899, 5899: 5900, 5900: 5901, 5901: 5902, 5902: 5903, 5903: 5904, 5904: 5905, 5905: 5906, 5906: 5907, 5907: 5908, 5908: 5909, 5909: 5910, 5910: 5911, 5911: 5912, 5912: 5913, 5913: 5914, 5914: 5915, 5915: 5916, 5916: 5917, 5917: 5918, 5918: 5919, 5919: 5920, 5920: 5921, 5921: 5922, 5922: 5923, 5923: 5924, 5924: 5925, 5925: 5926, 5926: 5927, 5927: 5928, 5928: 5929, 5929: 5930, 5930: 5931, 5931: 5932, 5932: 5933, 5933: 5934, 5934: 5935, 5935: 5936, 5936: 5937, 5937: 5938, 5938: 5939, 5939: 5940, 5940: 5941, 5941: 5942, 5942: 5943, 5943: 5944, 5944: 5945, 5945: 5946, 5946: 5947, 5947: 5948, 5948: 5949, 5949: 5950, 5950: 5951, 5951: 5952, 5952: 5953, 5953: 5954, 5954: 5955, 5955: 5956, 5956: 5957, 5957: 5958, 5958: 5959, 5959: 5960, 5960: 5961, 5961: 5962, 5962: 5963, 5963: 5964, 5964: 5965, 5965: 5966, 5966: 5967, 5967: 5968, 5968: 5969, 5969: 5970, 5970: 5971, 5971: 5972, 5972: 5973, 5973: 5974, 5974: 5975, 5975: 5976, 5976: 5977, 5977: 5978, 5978: 5979, 5979: 5980, 5980: 5981, 5981: 5982, 5982: 5983, 5983: 5984, 5984: 5985, 5985: 5986, 5986: 5987, 5987: 5988, 5988: 5989, 5989: 5990, 5990: 5991, 5991: 5992, 5992: 5993, 5993: 5994, 5994: 5995, 5995: 5996, 5996: 5997, 5997: 5998, 5998: 5999, 5999: 6000, 6000: 6001, 6001: 6002, 6002: 6003, 6003: 6004, 6004: 6005, 6005: 6006, 6006: 6007, 6007: 6008, 6008: 6009, 6009: 6010, 6010: 6011, 6011: 6012, 6012: 6013, 6013: 6014, 6014: 6015, 6015: 6016, 6016: 6017, 6017: 6018, 6018: 6019, 6019: 6020, 6020: 6021, 6021: 6022, 6022: 6023, 6023: 6024, 6024: 6025, 6025: 6026, 6026: 6027, 6027: 6028, 6028: 6029, 6029: 6030, 6030: 6031, 6031: 6032, 6032: 6033, 6033: 6034, 6034: 6035, 6035: 6036, 6036: 6037, 6037: 6038, 6038: 6039, 6039: 6040}}\n", + "{'item_id': {1: 0, 2: 1, 3: 2, 4: 3, 5: 4, 6: 5, 7: 6, 8: 7, 9: 8, 10: 9, 11: 10, 12: 11, 13: 12, 14: 13, 15: 14, 16: 15, 17: 16, 18: 17, 19: 18, 20: 19, 21: 20, 22: 21, 23: 22, 24: 23, 25: 24, 26: 25, 27: 26, 28: 27, 29: 28, 30: 29, 31: 30, 32: 31, 33: 32, 34: 33, 35: 34, 36: 35, 37: 36, 38: 37, 39: 38, 40: 39, 41: 40, 42: 41, 43: 42, 44: 43, 45: 44, 46: 45, 47: 46, 48: 47, 49: 48, 50: 49, 51: 50, 52: 51, 53: 52, 54: 53, 55: 54, 56: 55, 57: 56, 58: 57, 59: 58, 60: 59, 61: 60, 62: 61, 63: 62, 64: 63, 65: 64, 66: 65, 67: 66, 68: 67, 69: 68, 70: 69, 71: 70, 72: 71, 73: 72, 74: 73, 75: 74, 76: 75, 77: 76, 78: 77, 79: 78, 80: 79, 81: 80, 82: 81, 83: 82, 84: 83, 85: 84, 86: 85, 87: 86, 88: 87, 89: 88, 90: 89, 92: 90, 93: 91, 94: 92, 95: 93, 96: 94, 97: 95, 98: 96, 99: 97, 100: 98, 101: 99, 102: 100, 103: 101, 104: 102, 105: 103, 106: 104, 107: 105, 108: 106, 109: 107, 110: 108, 111: 109, 112: 110, 113: 111, 114: 112, 115: 113, 116: 114, 117: 115, 118: 116, 119: 117, 120: 118, 121: 119, 122: 120, 123: 121, 124: 122, 125: 123, 126: 124, 127: 125, 128: 126, 129: 127, 130: 128, 131: 129, 132: 130, 133: 131, 134: 132, 135: 133, 136: 134, 137: 135, 138: 136, 139: 137, 140: 138, 141: 139, 142: 140, 143: 141, 144: 142, 145: 143, 146: 144, 147: 145, 148: 146, 149: 147, 150: 148, 151: 149, 152: 150, 153: 151, 154: 152, 155: 153, 156: 154, 157: 155, 158: 156, 159: 157, 160: 158, 161: 159, 162: 160, 163: 161, 164: 162, 165: 163, 166: 164, 167: 165, 168: 166, 169: 167, 170: 168, 171: 169, 172: 170, 173: 171, 174: 172, 175: 173, 176: 174, 177: 175, 178: 176, 179: 177, 180: 178, 181: 179, 182: 180, 183: 181, 184: 182, 185: 183, 186: 184, 187: 185, 188: 186, 189: 187, 190: 188, 191: 189, 192: 190, 193: 191, 194: 192, 195: 193, 196: 194, 197: 195, 198: 196, 199: 197, 200: 198, 201: 199, 202: 200, 203: 201, 204: 202, 205: 203, 206: 204, 207: 205, 208: 206, 209: 207, 210: 208, 211: 209, 212: 210, 213: 211, 214: 212, 215: 213, 216: 214, 217: 215, 218: 216, 219: 217, 220: 218, 222: 219, 223: 220, 224: 221, 225: 222, 226: 223, 227: 224, 228: 225, 229: 226, 230: 227, 231: 228, 232: 229, 233: 230, 234: 231, 235: 232, 236: 233, 237: 234, 238: 235, 239: 236, 240: 237, 241: 238, 242: 239, 243: 240, 244: 241, 245: 242, 246: 243, 247: 244, 248: 245, 249: 246, 250: 247, 251: 248, 252: 249, 253: 250, 254: 251, 255: 252, 256: 253, 257: 254, 258: 255, 259: 256, 260: 257, 261: 258, 262: 259, 263: 260, 264: 261, 265: 262, 266: 263, 267: 264, 268: 265, 269: 266, 270: 267, 271: 268, 272: 269, 273: 270, 274: 271, 275: 272, 276: 273, 277: 274, 278: 275, 279: 276, 280: 277, 281: 278, 282: 279, 283: 280, 284: 281, 285: 282, 286: 283, 287: 284, 288: 285, 289: 286, 290: 287, 291: 288, 292: 289, 293: 290, 294: 291, 295: 292, 296: 293, 297: 294, 298: 295, 299: 296, 300: 297, 301: 298, 302: 299, 303: 300, 304: 301, 305: 302, 306: 303, 307: 304, 308: 305, 309: 306, 310: 307, 311: 308, 312: 309, 313: 310, 314: 311, 315: 312, 316: 313, 317: 314, 318: 315, 319: 316, 320: 317, 321: 318, 322: 319, 324: 320, 325: 321, 326: 322, 327: 323, 328: 324, 329: 325, 330: 326, 331: 327, 332: 328, 333: 329, 334: 330, 335: 331, 336: 332, 337: 333, 338: 334, 339: 335, 340: 336, 341: 337, 342: 338, 343: 339, 344: 340, 345: 341, 346: 342, 347: 343, 348: 344, 349: 345, 350: 346, 351: 347, 352: 348, 353: 349, 354: 350, 355: 351, 356: 352, 357: 353, 358: 354, 359: 355, 360: 356, 361: 357, 362: 358, 363: 359, 364: 360, 365: 361, 366: 362, 367: 363, 368: 364, 369: 365, 370: 366, 371: 367, 372: 368, 373: 369, 374: 370, 375: 371, 376: 372, 377: 373, 378: 374, 379: 375, 380: 376, 381: 377, 382: 378, 383: 379, 384: 380, 385: 381, 386: 382, 387: 383, 388: 384, 389: 385, 390: 386, 391: 387, 392: 388, 393: 389, 394: 390, 395: 391, 396: 392, 397: 393, 398: 394, 399: 395, 400: 396, 401: 397, 402: 398, 403: 399, 404: 400, 405: 401, 406: 402, 407: 403, 408: 404, 409: 405, 410: 406, 411: 407, 412: 408, 413: 409, 414: 410, 415: 411, 416: 412, 417: 413, 418: 414, 419: 415, 420: 416, 421: 417, 422: 418, 423: 419, 424: 420, 425: 421, 426: 422, 427: 423, 428: 424, 429: 425, 430: 426, 431: 427, 432: 428, 433: 429, 434: 430, 435: 431, 436: 432, 437: 433, 438: 434, 439: 435, 440: 436, 441: 437, 442: 438, 443: 439, 444: 440, 445: 441, 446: 442, 447: 443, 448: 444, 449: 445, 450: 446, 451: 447, 452: 448, 453: 449, 454: 450, 455: 451, 456: 452, 457: 453, 458: 454, 459: 455, 460: 456, 461: 457, 462: 458, 463: 459, 464: 460, 465: 461, 466: 462, 467: 463, 468: 464, 469: 465, 470: 466, 471: 467, 472: 468, 473: 469, 474: 470, 475: 471, 476: 472, 477: 473, 478: 474, 479: 475, 480: 476, 481: 477, 482: 478, 483: 479, 484: 480, 485: 481, 486: 482, 487: 483, 488: 484, 489: 485, 490: 486, 491: 487, 492: 488, 493: 489, 494: 490, 495: 491, 496: 492, 497: 493, 498: 494, 499: 495, 500: 496, 501: 497, 502: 498, 503: 499, 504: 500, 505: 501, 506: 502, 507: 503, 508: 504, 509: 505, 510: 506, 511: 507, 512: 508, 513: 509, 514: 510, 515: 511, 516: 512, 517: 513, 518: 514, 519: 515, 520: 516, 521: 517, 522: 518, 523: 519, 524: 520, 525: 521, 526: 522, 527: 523, 528: 524, 529: 525, 530: 526, 531: 527, 532: 528, 533: 529, 534: 530, 535: 531, 536: 532, 537: 533, 538: 534, 539: 535, 540: 536, 541: 537, 542: 538, 543: 539, 544: 540, 545: 541, 546: 542, 547: 543, 548: 544, 549: 545, 550: 546, 551: 547, 552: 548, 553: 549, 554: 550, 555: 551, 556: 552, 557: 553, 558: 554, 559: 555, 560: 556, 561: 557, 562: 558, 563: 559, 564: 560, 565: 561, 566: 562, 567: 563, 568: 564, 569: 565, 570: 566, 571: 567, 572: 568, 573: 569, 574: 570, 575: 571, 576: 572, 577: 573, 578: 574, 579: 575, 580: 576, 581: 577, 582: 578, 583: 579, 584: 580, 585: 581, 586: 582, 587: 583, 588: 584, 589: 585, 590: 586, 591: 587, 592: 588, 593: 589, 594: 590, 595: 591, 596: 592, 597: 593, 598: 594, 599: 595, 600: 596, 601: 597, 602: 598, 603: 599, 604: 600, 605: 601, 606: 602, 607: 603, 608: 604, 609: 605, 610: 606, 611: 607, 612: 608, 613: 609, 614: 610, 615: 611, 616: 612, 617: 613, 618: 614, 619: 615, 620: 616, 621: 617, 623: 618, 624: 619, 625: 620, 626: 621, 627: 622, 628: 623, 629: 624, 630: 625, 631: 626, 632: 627, 633: 628, 634: 629, 635: 630, 636: 631, 637: 632, 638: 633, 639: 634, 640: 635, 641: 636, 642: 637, 643: 638, 644: 639, 645: 640, 647: 641, 648: 642, 649: 643, 650: 644, 651: 645, 652: 646, 653: 647, 654: 648, 655: 649, 656: 650, 657: 651, 658: 652, 659: 653, 660: 654, 661: 655, 662: 656, 663: 657, 664: 658, 665: 659, 666: 660, 667: 661, 668: 662, 669: 663, 670: 664, 671: 665, 672: 666, 673: 667, 674: 668, 675: 669, 676: 670, 678: 671, 679: 672, 680: 673, 681: 674, 682: 675, 683: 676, 684: 677, 685: 678, 687: 679, 688: 680, 690: 681, 691: 682, 692: 683, 693: 684, 694: 685, 695: 686, 696: 687, 697: 688, 698: 689, 699: 690, 700: 691, 701: 692, 702: 693, 703: 694, 704: 695, 705: 696, 706: 697, 707: 698, 708: 699, 709: 700, 710: 701, 711: 702, 712: 703, 713: 704, 714: 705, 715: 706, 716: 707, 717: 708, 718: 709, 719: 710, 720: 711, 721: 712, 722: 713, 723: 714, 724: 715, 725: 716, 726: 717, 727: 718, 728: 719, 729: 720, 730: 721, 731: 722, 732: 723, 733: 724, 734: 725, 735: 726, 736: 727, 737: 728, 738: 729, 739: 730, 741: 731, 742: 732, 743: 733, 744: 734, 745: 735, 746: 736, 747: 737, 748: 738, 749: 739, 750: 740, 751: 741, 752: 742, 753: 743, 754: 744, 755: 745, 756: 746, 757: 747, 758: 748, 759: 749, 760: 750, 761: 751, 762: 752, 763: 753, 764: 754, 765: 755, 766: 756, 767: 757, 768: 758, 769: 759, 770: 760, 771: 761, 772: 762, 773: 763, 774: 764, 775: 765, 776: 766, 777: 767, 778: 768, 779: 769, 780: 770, 781: 771, 782: 772, 783: 773, 784: 774, 785: 775, 786: 776, 787: 777, 788: 778, 789: 779, 790: 780, 791: 781, 792: 782, 793: 783, 794: 784, 795: 785, 796: 786, 797: 787, 798: 788, 799: 789, 800: 790, 801: 791, 802: 792, 803: 793, 804: 794, 805: 795, 806: 796, 807: 797, 808: 798, 809: 799, 810: 800, 811: 801, 812: 802, 813: 803, 814: 804, 815: 805, 816: 806, 818: 807, 819: 808, 820: 809, 821: 810, 822: 811, 823: 812, 824: 813, 825: 814, 826: 815, 827: 816, 828: 817, 829: 818, 830: 819, 831: 820, 832: 821, 833: 822, 834: 823, 835: 824, 836: 825, 837: 826, 838: 827, 839: 828, 840: 829, 841: 830, 842: 831, 843: 832, 844: 833, 845: 834, 846: 835, 847: 836, 848: 837, 849: 838, 850: 839, 851: 840, 852: 841, 853: 842, 854: 843, 855: 844, 856: 845, 857: 846, 858: 847, 859: 848, 860: 849, 861: 850, 862: 851, 863: 852, 864: 853, 865: 854, 866: 855, 867: 856, 868: 857, 869: 858, 870: 859, 871: 860, 872: 861, 873: 862, 874: 863, 875: 864, 876: 865, 877: 866, 878: 867, 879: 868, 880: 869, 881: 870, 882: 871, 884: 872, 885: 873, 886: 874, 887: 875, 888: 876, 889: 877, 890: 878, 891: 879, 892: 880, 893: 881, 894: 882, 895: 883, 896: 884, 897: 885, 898: 886, 899: 887, 900: 888, 901: 889, 902: 890, 903: 891, 904: 892, 905: 893, 906: 894, 907: 895, 908: 896, 909: 897, 910: 898, 911: 899, 912: 900, 913: 901, 914: 902, 915: 903, 916: 904, 917: 905, 918: 906, 919: 907, 920: 908, 921: 909, 922: 910, 923: 911, 924: 912, 925: 913, 926: 914, 927: 915, 928: 916, 929: 917, 930: 918, 931: 919, 932: 920, 933: 921, 934: 922, 935: 923, 936: 924, 937: 925, 938: 926, 939: 927, 940: 928, 941: 929, 942: 930, 943: 931, 944: 932, 945: 933, 946: 934, 947: 935, 948: 936, 949: 937, 950: 938, 951: 939, 952: 940, 953: 941, 954: 942, 955: 943, 956: 944, 957: 945, 958: 946, 959: 947, 960: 948, 961: 949, 962: 950, 963: 951, 964: 952, 965: 953, 966: 954, 967: 955, 968: 956, 969: 957, 970: 958, 971: 959, 972: 960, 973: 961, 974: 962, 975: 963, 976: 964, 977: 965, 978: 966, 979: 967, 980: 968, 981: 969, 982: 970, 983: 971, 984: 972, 985: 973, 986: 974, 987: 975, 988: 976, 989: 977, 990: 978, 991: 979, 992: 980, 993: 981, 994: 982, 996: 983, 997: 984, 998: 985, 999: 986, 1000: 987, 1001: 988, 1002: 989, 1003: 990, 1004: 991, 1005: 992, 1006: 993, 1007: 994, 1008: 995, 1009: 996, 1010: 997, 1011: 998, 1012: 999, 1013: 1000, 1014: 1001, 1015: 1002, 1016: 1003, 1017: 1004, 1018: 1005, 1019: 1006, 1020: 1007, 1021: 1008, 1022: 1009, 1023: 1010, 1024: 1011, 1025: 1012, 1026: 1013, 1027: 1014, 1028: 1015, 1029: 1016, 1030: 1017, 1031: 1018, 1032: 1019, 1033: 1020, 1034: 1021, 1035: 1022, 1036: 1023, 1037: 1024, 1038: 1025, 1039: 1026, 1040: 1027, 1041: 1028, 1042: 1029, 1043: 1030, 1044: 1031, 1045: 1032, 1046: 1033, 1047: 1034, 1049: 1035, 1050: 1036, 1051: 1037, 1052: 1038, 1053: 1039, 1054: 1040, 1055: 1041, 1056: 1042, 1057: 1043, 1058: 1044, 1059: 1045, 1060: 1046, 1061: 1047, 1062: 1048, 1063: 1049, 1064: 1050, 1065: 1051, 1066: 1052, 1067: 1053, 1068: 1054, 1069: 1055, 1070: 1056, 1071: 1057, 1073: 1058, 1075: 1059, 1076: 1060, 1077: 1061, 1078: 1062, 1079: 1063, 1080: 1064, 1081: 1065, 1082: 1066, 1083: 1067, 1084: 1068, 1085: 1069, 1086: 1070, 1087: 1071, 1088: 1072, 1089: 1073, 1090: 1074, 1091: 1075, 1092: 1076, 1093: 1077, 1094: 1078, 1095: 1079, 1096: 1080, 1097: 1081, 1098: 1082, 1099: 1083, 1100: 1084, 1101: 1085, 1102: 1086, 1103: 1087, 1104: 1088, 1105: 1089, 1106: 1090, 1107: 1091, 1108: 1092, 1109: 1093, 1110: 1094, 1111: 1095, 1112: 1096, 1113: 1097, 1114: 1098, 1115: 1099, 1116: 1100, 1117: 1101, 1118: 1102, 1119: 1103, 1120: 1104, 1121: 1105, 1122: 1106, 1123: 1107, 1124: 1108, 1125: 1109, 1126: 1110, 1127: 1111, 1128: 1112, 1129: 1113, 1130: 1114, 1131: 1115, 1132: 1116, 1133: 1117, 1134: 1118, 1135: 1119, 1136: 1120, 1137: 1121, 1138: 1122, 1139: 1123, 1140: 1124, 1141: 1125, 1142: 1126, 1143: 1127, 1144: 1128, 1145: 1129, 1146: 1130, 1147: 1131, 1148: 1132, 1149: 1133, 1150: 1134, 1151: 1135, 1152: 1136, 1153: 1137, 1154: 1138, 1155: 1139, 1156: 1140, 1157: 1141, 1158: 1142, 1159: 1143, 1160: 1144, 1161: 1145, 1162: 1146, 1163: 1147, 1164: 1148, 1165: 1149, 1166: 1150, 1167: 1151, 1168: 1152, 1169: 1153, 1170: 1154, 1171: 1155, 1172: 1156, 1173: 1157, 1174: 1158, 1175: 1159, 1176: 1160, 1177: 1161, 1178: 1162, 1179: 1163, 1180: 1164, 1181: 1165, 1183: 1166, 1184: 1167, 1185: 1168, 1186: 1169, 1187: 1170, 1188: 1171, 1189: 1172, 1190: 1173, 1191: 1174, 1192: 1175, 1193: 1176, 1194: 1177, 1196: 1178, 1197: 1179, 1198: 1180, 1199: 1181, 1200: 1182, 1201: 1183, 1202: 1184, 1203: 1185, 1204: 1186, 1205: 1187, 1206: 1188, 1207: 1189, 1208: 1190, 1209: 1191, 1210: 1192, 1211: 1193, 1212: 1194, 1213: 1195, 1214: 1196, 1215: 1197, 1216: 1198, 1217: 1199, 1218: 1200, 1219: 1201, 1220: 1202, 1221: 1203, 1222: 1204, 1223: 1205, 1224: 1206, 1225: 1207, 1226: 1208, 1227: 1209, 1228: 1210, 1230: 1211, 1231: 1212, 1232: 1213, 1233: 1214, 1234: 1215, 1235: 1216, 1236: 1217, 1237: 1218, 1238: 1219, 1240: 1220, 1241: 1221, 1242: 1222, 1243: 1223, 1244: 1224, 1245: 1225, 1246: 1226, 1247: 1227, 1248: 1228, 1249: 1229, 1250: 1230, 1251: 1231, 1252: 1232, 1253: 1233, 1254: 1234, 1255: 1235, 1256: 1236, 1257: 1237, 1258: 1238, 1259: 1239, 1260: 1240, 1261: 1241, 1262: 1242, 1263: 1243, 1264: 1244, 1265: 1245, 1266: 1246, 1267: 1247, 1268: 1248, 1269: 1249, 1270: 1250, 1271: 1251, 1272: 1252, 1273: 1253, 1274: 1254, 1275: 1255, 1276: 1256, 1277: 1257, 1278: 1258, 1279: 1259, 1280: 1260, 1281: 1261, 1282: 1262, 1283: 1263, 1284: 1264, 1285: 1265, 1286: 1266, 1287: 1267, 1288: 1268, 1289: 1269, 1290: 1270, 1291: 1271, 1292: 1272, 1293: 1273, 1294: 1274, 1295: 1275, 1296: 1276, 1297: 1277, 1298: 1278, 1299: 1279, 1300: 1280, 1301: 1281, 1302: 1282, 1303: 1283, 1304: 1284, 1305: 1285, 1306: 1286, 1307: 1287, 1308: 1288, 1309: 1289, 1310: 1290, 1311: 1291, 1312: 1292, 1313: 1293, 1314: 1294, 1315: 1295, 1316: 1296, 1317: 1297, 1318: 1298, 1319: 1299, 1320: 1300, 1321: 1301, 1322: 1302, 1323: 1303, 1324: 1304, 1325: 1305, 1326: 1306, 1327: 1307, 1328: 1308, 1329: 1309, 1330: 1310, 1331: 1311, 1332: 1312, 1333: 1313, 1334: 1314, 1335: 1315, 1336: 1316, 1337: 1317, 1339: 1318, 1340: 1319, 1341: 1320, 1342: 1321, 1343: 1322, 1344: 1323, 1345: 1324, 1346: 1325, 1347: 1326, 1348: 1327, 1349: 1328, 1350: 1329, 1351: 1330, 1352: 1331, 1353: 1332, 1354: 1333, 1355: 1334, 1356: 1335, 1357: 1336, 1358: 1337, 1359: 1338, 1360: 1339, 1361: 1340, 1362: 1341, 1363: 1342, 1364: 1343, 1365: 1344, 1366: 1345, 1367: 1346, 1368: 1347, 1369: 1348, 1370: 1349, 1371: 1350, 1372: 1351, 1373: 1352, 1374: 1353, 1375: 1354, 1376: 1355, 1377: 1356, 1378: 1357, 1379: 1358, 1380: 1359, 1381: 1360, 1382: 1361, 1383: 1362, 1384: 1363, 1385: 1364, 1386: 1365, 1387: 1366, 1388: 1367, 1389: 1368, 1390: 1369, 1391: 1370, 1392: 1371, 1393: 1372, 1394: 1373, 1395: 1374, 1396: 1375, 1397: 1376, 1398: 1377, 1399: 1378, 1400: 1379, 1401: 1380, 1404: 1381, 1405: 1382, 1406: 1383, 1407: 1384, 1408: 1385, 1409: 1386, 1410: 1387, 1411: 1388, 1412: 1389, 1413: 1390, 1414: 1391, 1415: 1392, 1416: 1393, 1417: 1394, 1419: 1395, 1420: 1396, 1421: 1397, 1422: 1398, 1423: 1399, 1424: 1400, 1425: 1401, 1426: 1402, 1427: 1403, 1428: 1404, 1429: 1405, 1430: 1406, 1431: 1407, 1432: 1408, 1433: 1409, 1434: 1410, 1436: 1411, 1437: 1412, 1438: 1413, 1439: 1414, 1440: 1415, 1441: 1416, 1442: 1417, 1443: 1418, 1444: 1419, 1445: 1420, 1446: 1421, 1447: 1422, 1448: 1423, 1449: 1424, 1450: 1425, 1453: 1426, 1454: 1427, 1455: 1428, 1456: 1429, 1457: 1430, 1458: 1431, 1459: 1432, 1460: 1433, 1461: 1434, 1462: 1435, 1463: 1436, 1464: 1437, 1465: 1438, 1466: 1439, 1467: 1440, 1468: 1441, 1470: 1442, 1471: 1443, 1472: 1444, 1473: 1445, 1474: 1446, 1475: 1447, 1476: 1448, 1477: 1449, 1479: 1450, 1480: 1451, 1482: 1452, 1483: 1453, 1484: 1454, 1485: 1455, 1486: 1456, 1487: 1457, 1488: 1458, 1489: 1459, 1490: 1460, 1493: 1461, 1494: 1462, 1495: 1463, 1496: 1464, 1497: 1465, 1498: 1466, 1499: 1467, 1500: 1468, 1501: 1469, 1502: 1470, 1503: 1471, 1504: 1472, 1507: 1473, 1508: 1474, 1509: 1475, 1510: 1476, 1511: 1477, 1513: 1478, 1514: 1479, 1515: 1480, 1516: 1481, 1517: 1482, 1518: 1483, 1519: 1484, 1520: 1485, 1522: 1486, 1523: 1487, 1524: 1488, 1525: 1489, 1526: 1490, 1527: 1491, 1528: 1492, 1529: 1493, 1531: 1494, 1532: 1495, 1533: 1496, 1534: 1497, 1535: 1498, 1537: 1499, 1538: 1500, 1539: 1501, 1541: 1502, 1542: 1503, 1543: 1504, 1544: 1505, 1545: 1506, 1546: 1507, 1547: 1508, 1548: 1509, 1549: 1510, 1550: 1511, 1551: 1512, 1552: 1513, 1553: 1514, 1554: 1515, 1555: 1516, 1556: 1517, 1557: 1518, 1558: 1519, 1559: 1520, 1561: 1521, 1562: 1522, 1563: 1523, 1564: 1524, 1565: 1525, 1566: 1526, 1567: 1527, 1568: 1528, 1569: 1529, 1570: 1530, 1571: 1531, 1572: 1532, 1573: 1533, 1574: 1534, 1575: 1535, 1577: 1536, 1578: 1537, 1579: 1538, 1580: 1539, 1581: 1540, 1582: 1541, 1583: 1542, 1584: 1543, 1585: 1544, 1586: 1545, 1587: 1546, 1588: 1547, 1589: 1548, 1590: 1549, 1591: 1550, 1592: 1551, 1593: 1552, 1594: 1553, 1595: 1554, 1596: 1555, 1597: 1556, 1598: 1557, 1599: 1558, 1600: 1559, 1601: 1560, 1602: 1561, 1603: 1562, 1604: 1563, 1605: 1564, 1606: 1565, 1608: 1566, 1609: 1567, 1610: 1568, 1611: 1569, 1612: 1570, 1613: 1571, 1614: 1572, 1615: 1573, 1616: 1574, 1617: 1575, 1619: 1576, 1620: 1577, 1621: 1578, 1622: 1579, 1623: 1580, 1624: 1581, 1625: 1582, 1626: 1583, 1627: 1584, 1628: 1585, 1629: 1586, 1630: 1587, 1631: 1588, 1632: 1589, 1633: 1590, 1635: 1591, 1636: 1592, 1639: 1593, 1640: 1594, 1641: 1595, 1642: 1596, 1643: 1597, 1644: 1598, 1645: 1599, 1646: 1600, 1647: 1601, 1648: 1602, 1649: 1603, 1650: 1604, 1651: 1605, 1652: 1606, 1653: 1607, 1654: 1608, 1655: 1609, 1656: 1610, 1657: 1611, 1658: 1612, 1659: 1613, 1660: 1614, 1661: 1615, 1662: 1616, 1663: 1617, 1664: 1618, 1665: 1619, 1666: 1620, 1667: 1621, 1668: 1622, 1669: 1623, 1670: 1624, 1671: 1625, 1672: 1626, 1673: 1627, 1674: 1628, 1675: 1629, 1676: 1630, 1677: 1631, 1678: 1632, 1679: 1633, 1680: 1634, 1681: 1635, 1682: 1636, 1683: 1637, 1684: 1638, 1685: 1639, 1686: 1640, 1687: 1641, 1688: 1642, 1689: 1643, 1690: 1644, 1692: 1645, 1693: 1646, 1694: 1647, 1695: 1648, 1696: 1649, 1697: 1650, 1698: 1651, 1699: 1652, 1701: 1653, 1702: 1654, 1703: 1655, 1704: 1656, 1705: 1657, 1706: 1658, 1707: 1659, 1708: 1660, 1709: 1661, 1710: 1662, 1711: 1663, 1713: 1664, 1714: 1665, 1715: 1666, 1716: 1667, 1717: 1668, 1718: 1669, 1719: 1670, 1720: 1671, 1721: 1672, 1722: 1673, 1723: 1674, 1724: 1675, 1725: 1676, 1726: 1677, 1727: 1678, 1728: 1679, 1729: 1680, 1730: 1681, 1731: 1682, 1732: 1683, 1733: 1684, 1734: 1685, 1735: 1686, 1738: 1687, 1739: 1688, 1740: 1689, 1741: 1690, 1742: 1691, 1743: 1692, 1744: 1693, 1746: 1694, 1747: 1695, 1748: 1696, 1749: 1697, 1750: 1698, 1752: 1699, 1753: 1700, 1754: 1701, 1755: 1702, 1756: 1703, 1757: 1704, 1758: 1705, 1759: 1706, 1760: 1707, 1762: 1708, 1764: 1709, 1765: 1710, 1767: 1711, 1768: 1712, 1769: 1713, 1770: 1714, 1771: 1715, 1772: 1716, 1773: 1717, 1774: 1718, 1776: 1719, 1777: 1720, 1779: 1721, 1780: 1722, 1781: 1723, 1782: 1724, 1783: 1725, 1784: 1726, 1785: 1727, 1787: 1728, 1788: 1729, 1789: 1730, 1791: 1731, 1792: 1732, 1793: 1733, 1794: 1734, 1795: 1735, 1796: 1736, 1797: 1737, 1798: 1738, 1799: 1739, 1801: 1740, 1804: 1741, 1805: 1742, 1806: 1743, 1807: 1744, 1809: 1745, 1810: 1746, 1811: 1747, 1812: 1748, 1814: 1749, 1815: 1750, 1816: 1751, 1817: 1752, 1819: 1753, 1820: 1754, 1821: 1755, 1822: 1756, 1824: 1757, 1825: 1758, 1826: 1759, 1827: 1760, 1829: 1761, 1830: 1762, 1831: 1763, 1832: 1764, 1833: 1765, 1834: 1766, 1835: 1767, 1836: 1768, 1837: 1769, 1839: 1770, 1840: 1771, 1841: 1772, 1842: 1773, 1843: 1774, 1844: 1775, 1845: 1776, 1846: 1777, 1847: 1778, 1848: 1779, 1849: 1780, 1850: 1781, 1851: 1782, 1852: 1783, 1853: 1784, 1854: 1785, 1855: 1786, 1856: 1787, 1857: 1788, 1858: 1789, 1859: 1790, 1860: 1791, 1861: 1792, 1862: 1793, 1863: 1794, 1864: 1795, 1865: 1796, 1866: 1797, 1867: 1798, 1868: 1799, 1869: 1800, 1870: 1801, 1871: 1802, 1872: 1803, 1873: 1804, 1874: 1805, 1875: 1806, 1876: 1807, 1877: 1808, 1878: 1809, 1879: 1810, 1880: 1811, 1881: 1812, 1882: 1813, 1883: 1814, 1884: 1815, 1885: 1816, 1886: 1817, 1887: 1818, 1888: 1819, 1889: 1820, 1890: 1821, 1891: 1822, 1892: 1823, 1893: 1824, 1894: 1825, 1895: 1826, 1896: 1827, 1897: 1828, 1898: 1829, 1899: 1830, 1900: 1831, 1901: 1832, 1902: 1833, 1903: 1834, 1904: 1835, 1905: 1836, 1906: 1837, 1907: 1838, 1908: 1839, 1909: 1840, 1910: 1841, 1911: 1842, 1912: 1843, 1913: 1844, 1914: 1845, 1915: 1846, 1916: 1847, 1917: 1848, 1918: 1849, 1919: 1850, 1920: 1851, 1921: 1852, 1922: 1853, 1923: 1854, 1924: 1855, 1925: 1856, 1926: 1857, 1927: 1858, 1928: 1859, 1929: 1860, 1930: 1861, 1931: 1862, 1932: 1863, 1933: 1864, 1934: 1865, 1935: 1866, 1936: 1867, 1937: 1868, 1938: 1869, 1939: 1870, 1940: 1871, 1941: 1872, 1942: 1873, 1943: 1874, 1944: 1875, 1945: 1876, 1946: 1877, 1947: 1878, 1948: 1879, 1949: 1880, 1950: 1881, 1951: 1882, 1952: 1883, 1953: 1884, 1954: 1885, 1955: 1886, 1956: 1887, 1957: 1888, 1958: 1889, 1959: 1890, 1960: 1891, 1961: 1892, 1962: 1893, 1963: 1894, 1964: 1895, 1965: 1896, 1966: 1897, 1967: 1898, 1968: 1899, 1969: 1900, 1970: 1901, 1971: 1902, 1972: 1903, 1973: 1904, 1974: 1905, 1975: 1906, 1976: 1907, 1977: 1908, 1978: 1909, 1979: 1910, 1980: 1911, 1981: 1912, 1982: 1913, 1983: 1914, 1984: 1915, 1985: 1916, 1986: 1917, 1987: 1918, 1988: 1919, 1989: 1920, 1990: 1921, 1991: 1922, 1992: 1923, 1993: 1924, 1994: 1925, 1995: 1926, 1996: 1927, 1997: 1928, 1998: 1929, 1999: 1930, 2000: 1931, 2001: 1932, 2002: 1933, 2003: 1934, 2004: 1935, 2005: 1936, 2006: 1937, 2007: 1938, 2008: 1939, 2009: 1940, 2010: 1941, 2011: 1942, 2012: 1943, 2013: 1944, 2014: 1945, 2015: 1946, 2016: 1947, 2017: 1948, 2018: 1949, 2019: 1950, 2020: 1951, 2021: 1952, 2022: 1953, 2023: 1954, 2024: 1955, 2025: 1956, 2026: 1957, 2027: 1958, 2028: 1959, 2029: 1960, 2030: 1961, 2031: 1962, 2032: 1963, 2033: 1964, 2034: 1965, 2035: 1966, 2036: 1967, 2037: 1968, 2038: 1969, 2039: 1970, 2040: 1971, 2041: 1972, 2042: 1973, 2043: 1974, 2044: 1975, 2045: 1976, 2046: 1977, 2047: 1978, 2048: 1979, 2049: 1980, 2050: 1981, 2051: 1982, 2052: 1983, 2053: 1984, 2054: 1985, 2055: 1986, 2056: 1987, 2057: 1988, 2058: 1989, 2059: 1990, 2060: 1991, 2061: 1992, 2062: 1993, 2063: 1994, 2064: 1995, 2065: 1996, 2066: 1997, 2067: 1998, 2068: 1999, 2069: 2000, 2070: 2001, 2071: 2002, 2072: 2003, 2073: 2004, 2074: 2005, 2075: 2006, 2076: 2007, 2077: 2008, 2078: 2009, 2079: 2010, 2080: 2011, 2081: 2012, 2082: 2013, 2083: 2014, 2084: 2015, 2085: 2016, 2086: 2017, 2087: 2018, 2088: 2019, 2089: 2020, 2090: 2021, 2091: 2022, 2092: 2023, 2093: 2024, 2094: 2025, 2095: 2026, 2096: 2027, 2097: 2028, 2098: 2029, 2099: 2030, 2100: 2031, 2101: 2032, 2102: 2033, 2103: 2034, 2104: 2035, 2105: 2036, 2106: 2037, 2107: 2038, 2108: 2039, 2109: 2040, 2110: 2041, 2111: 2042, 2112: 2043, 2113: 2044, 2114: 2045, 2115: 2046, 2116: 2047, 2117: 2048, 2118: 2049, 2119: 2050, 2120: 2051, 2121: 2052, 2122: 2053, 2123: 2054, 2124: 2055, 2125: 2056, 2126: 2057, 2127: 2058, 2128: 2059, 2129: 2060, 2130: 2061, 2131: 2062, 2132: 2063, 2133: 2064, 2134: 2065, 2135: 2066, 2136: 2067, 2137: 2068, 2138: 2069, 2139: 2070, 2140: 2071, 2141: 2072, 2142: 2073, 2143: 2074, 2144: 2075, 2145: 2076, 2146: 2077, 2147: 2078, 2148: 2079, 2149: 2080, 2150: 2081, 2151: 2082, 2152: 2083, 2153: 2084, 2154: 2085, 2155: 2086, 2156: 2087, 2157: 2088, 2158: 2089, 2159: 2090, 2160: 2091, 2161: 2092, 2162: 2093, 2163: 2094, 2164: 2095, 2165: 2096, 2166: 2097, 2167: 2098, 2168: 2099, 2169: 2100, 2170: 2101, 2171: 2102, 2172: 2103, 2173: 2104, 2174: 2105, 2175: 2106, 2176: 2107, 2177: 2108, 2178: 2109, 2179: 2110, 2180: 2111, 2181: 2112, 2182: 2113, 2183: 2114, 2184: 2115, 2185: 2116, 2186: 2117, 2187: 2118, 2188: 2119, 2189: 2120, 2190: 2121, 2191: 2122, 2192: 2123, 2193: 2124, 2194: 2125, 2195: 2126, 2196: 2127, 2197: 2128, 2198: 2129, 2199: 2130, 2200: 2131, 2201: 2132, 2202: 2133, 2203: 2134, 2204: 2135, 2205: 2136, 2206: 2137, 2207: 2138, 2208: 2139, 2209: 2140, 2210: 2141, 2211: 2142, 2212: 2143, 2213: 2144, 2214: 2145, 2215: 2146, 2216: 2147, 2217: 2148, 2218: 2149, 2219: 2150, 2220: 2151, 2221: 2152, 2222: 2153, 2223: 2154, 2224: 2155, 2225: 2156, 2226: 2157, 2227: 2158, 2228: 2159, 2229: 2160, 2230: 2161, 2231: 2162, 2232: 2163, 2233: 2164, 2234: 2165, 2235: 2166, 2236: 2167, 2237: 2168, 2238: 2169, 2239: 2170, 2240: 2171, 2241: 2172, 2242: 2173, 2243: 2174, 2244: 2175, 2245: 2176, 2246: 2177, 2247: 2178, 2248: 2179, 2249: 2180, 2250: 2181, 2251: 2182, 2252: 2183, 2253: 2184, 2254: 2185, 2255: 2186, 2256: 2187, 2257: 2188, 2258: 2189, 2259: 2190, 2260: 2191, 2261: 2192, 2262: 2193, 2263: 2194, 2264: 2195, 2265: 2196, 2266: 2197, 2267: 2198, 2268: 2199, 2269: 2200, 2270: 2201, 2271: 2202, 2272: 2203, 2273: 2204, 2274: 2205, 2275: 2206, 2276: 2207, 2277: 2208, 2278: 2209, 2279: 2210, 2280: 2211, 2281: 2212, 2282: 2213, 2283: 2214, 2284: 2215, 2285: 2216, 2286: 2217, 2287: 2218, 2288: 2219, 2289: 2220, 2290: 2221, 2291: 2222, 2292: 2223, 2293: 2224, 2294: 2225, 2295: 2226, 2296: 2227, 2297: 2228, 2298: 2229, 2299: 2230, 2300: 2231, 2301: 2232, 2302: 2233, 2303: 2234, 2304: 2235, 2305: 2236, 2306: 2237, 2307: 2238, 2308: 2239, 2309: 2240, 2310: 2241, 2311: 2242, 2312: 2243, 2313: 2244, 2314: 2245, 2315: 2246, 2316: 2247, 2317: 2248, 2318: 2249, 2319: 2250, 2320: 2251, 2321: 2252, 2322: 2253, 2323: 2254, 2324: 2255, 2325: 2256, 2326: 2257, 2327: 2258, 2328: 2259, 2329: 2260, 2330: 2261, 2331: 2262, 2332: 2263, 2333: 2264, 2334: 2265, 2335: 2266, 2336: 2267, 2337: 2268, 2338: 2269, 2339: 2270, 2340: 2271, 2341: 2272, 2342: 2273, 2343: 2274, 2344: 2275, 2345: 2276, 2346: 2277, 2347: 2278, 2348: 2279, 2349: 2280, 2350: 2281, 2351: 2282, 2352: 2283, 2353: 2284, 2354: 2285, 2355: 2286, 2356: 2287, 2357: 2288, 2358: 2289, 2359: 2290, 2360: 2291, 2361: 2292, 2362: 2293, 2363: 2294, 2364: 2295, 2365: 2296, 2366: 2297, 2367: 2298, 2368: 2299, 2369: 2300, 2370: 2301, 2371: 2302, 2372: 2303, 2373: 2304, 2374: 2305, 2375: 2306, 2376: 2307, 2377: 2308, 2378: 2309, 2379: 2310, 2380: 2311, 2381: 2312, 2382: 2313, 2383: 2314, 2384: 2315, 2385: 2316, 2386: 2317, 2387: 2318, 2388: 2319, 2389: 2320, 2390: 2321, 2391: 2322, 2392: 2323, 2393: 2324, 2394: 2325, 2395: 2326, 2396: 2327, 2397: 2328, 2398: 2329, 2399: 2330, 2400: 2331, 2401: 2332, 2402: 2333, 2403: 2334, 2404: 2335, 2405: 2336, 2406: 2337, 2407: 2338, 2408: 2339, 2409: 2340, 2410: 2341, 2411: 2342, 2412: 2343, 2413: 2344, 2414: 2345, 2415: 2346, 2416: 2347, 2417: 2348, 2418: 2349, 2419: 2350, 2420: 2351, 2421: 2352, 2422: 2353, 2423: 2354, 2424: 2355, 2425: 2356, 2426: 2357, 2427: 2358, 2428: 2359, 2429: 2360, 2430: 2361, 2431: 2362, 2432: 2363, 2433: 2364, 2434: 2365, 2435: 2366, 2436: 2367, 2437: 2368, 2438: 2369, 2439: 2370, 2440: 2371, 2441: 2372, 2442: 2373, 2443: 2374, 2444: 2375, 2445: 2376, 2446: 2377, 2447: 2378, 2448: 2379, 2449: 2380, 2450: 2381, 2451: 2382, 2452: 2383, 2453: 2384, 2454: 2385, 2455: 2386, 2456: 2387, 2457: 2388, 2458: 2389, 2459: 2390, 2460: 2391, 2461: 2392, 2462: 2393, 2463: 2394, 2464: 2395, 2465: 2396, 2466: 2397, 2467: 2398, 2468: 2399, 2469: 2400, 2470: 2401, 2471: 2402, 2472: 2403, 2473: 2404, 2474: 2405, 2475: 2406, 2476: 2407, 2477: 2408, 2478: 2409, 2479: 2410, 2480: 2411, 2481: 2412, 2482: 2413, 2483: 2414, 2484: 2415, 2485: 2416, 2486: 2417, 2487: 2418, 2488: 2419, 2489: 2420, 2490: 2421, 2491: 2422, 2492: 2423, 2493: 2424, 2494: 2425, 2495: 2426, 2496: 2427, 2497: 2428, 2498: 2429, 2499: 2430, 2500: 2431, 2501: 2432, 2502: 2433, 2503: 2434, 2504: 2435, 2505: 2436, 2506: 2437, 2507: 2438, 2508: 2439, 2509: 2440, 2510: 2441, 2511: 2442, 2512: 2443, 2513: 2444, 2514: 2445, 2515: 2446, 2516: 2447, 2517: 2448, 2518: 2449, 2519: 2450, 2520: 2451, 2521: 2452, 2522: 2453, 2523: 2454, 2524: 2455, 2525: 2456, 2526: 2457, 2527: 2458, 2528: 2459, 2529: 2460, 2530: 2461, 2531: 2462, 2532: 2463, 2533: 2464, 2534: 2465, 2535: 2466, 2536: 2467, 2537: 2468, 2538: 2469, 2539: 2470, 2540: 2471, 2541: 2472, 2542: 2473, 2543: 2474, 2544: 2475, 2545: 2476, 2546: 2477, 2547: 2478, 2548: 2479, 2549: 2480, 2550: 2481, 2551: 2482, 2552: 2483, 2553: 2484, 2554: 2485, 2555: 2486, 2556: 2487, 2557: 2488, 2558: 2489, 2559: 2490, 2560: 2491, 2561: 2492, 2562: 2493, 2563: 2494, 2564: 2495, 2565: 2496, 2566: 2497, 2567: 2498, 2568: 2499, 2569: 2500, 2570: 2501, 2571: 2502, 2572: 2503, 2573: 2504, 2574: 2505, 2575: 2506, 2576: 2507, 2577: 2508, 2578: 2509, 2579: 2510, 2580: 2511, 2581: 2512, 2582: 2513, 2583: 2514, 2584: 2515, 2585: 2516, 2586: 2517, 2587: 2518, 2588: 2519, 2589: 2520, 2590: 2521, 2591: 2522, 2592: 2523, 2593: 2524, 2594: 2525, 2595: 2526, 2596: 2527, 2597: 2528, 2598: 2529, 2599: 2530, 2600: 2531, 2601: 2532, 2602: 2533, 2603: 2534, 2604: 2535, 2605: 2536, 2606: 2537, 2607: 2538, 2608: 2539, 2609: 2540, 2610: 2541, 2611: 2542, 2612: 2543, 2613: 2544, 2614: 2545, 2615: 2546, 2616: 2547, 2617: 2548, 2618: 2549, 2619: 2550, 2620: 2551, 2621: 2552, 2622: 2553, 2623: 2554, 2624: 2555, 2625: 2556, 2626: 2557, 2627: 2558, 2628: 2559, 2629: 2560, 2630: 2561, 2631: 2562, 2632: 2563, 2633: 2564, 2634: 2565, 2635: 2566, 2636: 2567, 2637: 2568, 2638: 2569, 2639: 2570, 2640: 2571, 2641: 2572, 2642: 2573, 2643: 2574, 2644: 2575, 2645: 2576, 2646: 2577, 2647: 2578, 2648: 2579, 2649: 2580, 2650: 2581, 2651: 2582, 2652: 2583, 2653: 2584, 2654: 2585, 2655: 2586, 2656: 2587, 2657: 2588, 2658: 2589, 2659: 2590, 2660: 2591, 2661: 2592, 2662: 2593, 2663: 2594, 2664: 2595, 2665: 2596, 2666: 2597, 2667: 2598, 2668: 2599, 2669: 2600, 2670: 2601, 2671: 2602, 2672: 2603, 2673: 2604, 2674: 2605, 2675: 2606, 2676: 2607, 2677: 2608, 2678: 2609, 2679: 2610, 2680: 2611, 2681: 2612, 2682: 2613, 2683: 2614, 2684: 2615, 2685: 2616, 2686: 2617, 2687: 2618, 2688: 2619, 2689: 2620, 2690: 2621, 2691: 2622, 2692: 2623, 2693: 2624, 2694: 2625, 2695: 2626, 2696: 2627, 2697: 2628, 2698: 2629, 2699: 2630, 2700: 2631, 2701: 2632, 2702: 2633, 2703: 2634, 2704: 2635, 2705: 2636, 2706: 2637, 2707: 2638, 2708: 2639, 2709: 2640, 2710: 2641, 2711: 2642, 2712: 2643, 2713: 2644, 2714: 2645, 2715: 2646, 2716: 2647, 2717: 2648, 2718: 2649, 2719: 2650, 2720: 2651, 2721: 2652, 2722: 2653, 2723: 2654, 2724: 2655, 2725: 2656, 2726: 2657, 2727: 2658, 2728: 2659, 2729: 2660, 2730: 2661, 2731: 2662, 2732: 2663, 2733: 2664, 2734: 2665, 2735: 2666, 2736: 2667, 2737: 2668, 2738: 2669, 2739: 2670, 2740: 2671, 2741: 2672, 2742: 2673, 2743: 2674, 2744: 2675, 2745: 2676, 2746: 2677, 2747: 2678, 2748: 2679, 2749: 2680, 2750: 2681, 2751: 2682, 2752: 2683, 2753: 2684, 2754: 2685, 2755: 2686, 2756: 2687, 2757: 2688, 2758: 2689, 2759: 2690, 2760: 2691, 2761: 2692, 2762: 2693, 2763: 2694, 2764: 2695, 2765: 2696, 2766: 2697, 2767: 2698, 2768: 2699, 2769: 2700, 2770: 2701, 2771: 2702, 2772: 2703, 2773: 2704, 2774: 2705, 2775: 2706, 2776: 2707, 2777: 2708, 2778: 2709, 2779: 2710, 2780: 2711, 2781: 2712, 2782: 2713, 2783: 2714, 2784: 2715, 2785: 2716, 2786: 2717, 2787: 2718, 2788: 2719, 2789: 2720, 2790: 2721, 2791: 2722, 2792: 2723, 2793: 2724, 2794: 2725, 2795: 2726, 2796: 2727, 2797: 2728, 2798: 2729, 2799: 2730, 2800: 2731, 2801: 2732, 2802: 2733, 2803: 2734, 2804: 2735, 2805: 2736, 2806: 2737, 2807: 2738, 2808: 2739, 2809: 2740, 2810: 2741, 2811: 2742, 2812: 2743, 2813: 2744, 2814: 2745, 2815: 2746, 2816: 2747, 2817: 2748, 2818: 2749, 2819: 2750, 2820: 2751, 2821: 2752, 2822: 2753, 2823: 2754, 2824: 2755, 2825: 2756, 2826: 2757, 2827: 2758, 2828: 2759, 2829: 2760, 2830: 2761, 2831: 2762, 2832: 2763, 2833: 2764, 2834: 2765, 2835: 2766, 2836: 2767, 2837: 2768, 2838: 2769, 2839: 2770, 2840: 2771, 2841: 2772, 2842: 2773, 2843: 2774, 2844: 2775, 2845: 2776, 2846: 2777, 2847: 2778, 2848: 2779, 2849: 2780, 2850: 2781, 2851: 2782, 2852: 2783, 2853: 2784, 2854: 2785, 2855: 2786, 2856: 2787, 2857: 2788, 2858: 2789, 2859: 2790, 2860: 2791, 2861: 2792, 2862: 2793, 2863: 2794, 2864: 2795, 2865: 2796, 2866: 2797, 2867: 2798, 2868: 2799, 2869: 2800, 2870: 2801, 2871: 2802, 2872: 2803, 2873: 2804, 2874: 2805, 2875: 2806, 2876: 2807, 2877: 2808, 2878: 2809, 2879: 2810, 2880: 2811, 2881: 2812, 2882: 2813, 2883: 2814, 2884: 2815, 2885: 2816, 2886: 2817, 2887: 2818, 2888: 2819, 2889: 2820, 2890: 2821, 2891: 2822, 2892: 2823, 2893: 2824, 2894: 2825, 2895: 2826, 2896: 2827, 2897: 2828, 2898: 2829, 2899: 2830, 2900: 2831, 2901: 2832, 2902: 2833, 2903: 2834, 2904: 2835, 2905: 2836, 2906: 2837, 2907: 2838, 2908: 2839, 2909: 2840, 2910: 2841, 2911: 2842, 2912: 2843, 2913: 2844, 2914: 2845, 2915: 2846, 2916: 2847, 2917: 2848, 2918: 2849, 2919: 2850, 2920: 2851, 2921: 2852, 2922: 2853, 2923: 2854, 2924: 2855, 2925: 2856, 2926: 2857, 2927: 2858, 2928: 2859, 2929: 2860, 2930: 2861, 2931: 2862, 2932: 2863, 2933: 2864, 2934: 2865, 2935: 2866, 2936: 2867, 2937: 2868, 2938: 2869, 2939: 2870, 2940: 2871, 2941: 2872, 2942: 2873, 2943: 2874, 2944: 2875, 2945: 2876, 2946: 2877, 2947: 2878, 2948: 2879, 2949: 2880, 2950: 2881, 2951: 2882, 2952: 2883, 2953: 2884, 2954: 2885, 2955: 2886, 2956: 2887, 2957: 2888, 2958: 2889, 2959: 2890, 2960: 2891, 2961: 2892, 2962: 2893, 2963: 2894, 2964: 2895, 2965: 2896, 2966: 2897, 2967: 2898, 2968: 2899, 2969: 2900, 2970: 2901, 2971: 2902, 2972: 2903, 2973: 2904, 2974: 2905, 2975: 2906, 2976: 2907, 2977: 2908, 2978: 2909, 2979: 2910, 2980: 2911, 2981: 2912, 2982: 2913, 2983: 2914, 2984: 2915, 2985: 2916, 2986: 2917, 2987: 2918, 2988: 2919, 2989: 2920, 2990: 2921, 2991: 2922, 2992: 2923, 2993: 2924, 2994: 2925, 2995: 2926, 2996: 2927, 2997: 2928, 2998: 2929, 2999: 2930, 3000: 2931, 3001: 2932, 3002: 2933, 3003: 2934, 3004: 2935, 3005: 2936, 3006: 2937, 3007: 2938, 3008: 2939, 3009: 2940, 3010: 2941, 3011: 2942, 3012: 2943, 3013: 2944, 3014: 2945, 3015: 2946, 3016: 2947, 3017: 2948, 3018: 2949, 3019: 2950, 3020: 2951, 3021: 2952, 3022: 2953, 3023: 2954, 3024: 2955, 3025: 2956, 3026: 2957, 3027: 2958, 3028: 2959, 3029: 2960, 3030: 2961, 3031: 2962, 3032: 2963, 3033: 2964, 3034: 2965, 3035: 2966, 3036: 2967, 3037: 2968, 3038: 2969, 3039: 2970, 3040: 2971, 3041: 2972, 3042: 2973, 3043: 2974, 3044: 2975, 3045: 2976, 3046: 2977, 3047: 2978, 3048: 2979, 3049: 2980, 3050: 2981, 3051: 2982, 3052: 2983, 3053: 2984, 3054: 2985, 3055: 2986, 3056: 2987, 3057: 2988, 3058: 2989, 3059: 2990, 3060: 2991, 3061: 2992, 3062: 2993, 3063: 2994, 3064: 2995, 3065: 2996, 3066: 2997, 3067: 2998, 3068: 2999, 3069: 3000, 3070: 3001, 3071: 3002, 3072: 3003, 3073: 3004, 3074: 3005, 3075: 3006, 3076: 3007, 3077: 3008, 3078: 3009, 3079: 3010, 3080: 3011, 3081: 3012, 3082: 3013, 3083: 3014, 3084: 3015, 3085: 3016, 3086: 3017, 3087: 3018, 3088: 3019, 3089: 3020, 3090: 3021, 3091: 3022, 3092: 3023, 3093: 3024, 3094: 3025, 3095: 3026, 3096: 3027, 3097: 3028, 3098: 3029, 3099: 3030, 3100: 3031, 3101: 3032, 3102: 3033, 3103: 3034, 3104: 3035, 3105: 3036, 3106: 3037, 3107: 3038, 3108: 3039, 3109: 3040, 3110: 3041, 3111: 3042, 3112: 3043, 3113: 3044, 3114: 3045, 3115: 3046, 3116: 3047, 3117: 3048, 3118: 3049, 3119: 3050, 3120: 3051, 3121: 3052, 3122: 3053, 3123: 3054, 3124: 3055, 3125: 3056, 3126: 3057, 3127: 3058, 3128: 3059, 3129: 3060, 3130: 3061, 3131: 3062, 3132: 3063, 3133: 3064, 3134: 3065, 3135: 3066, 3136: 3067, 3137: 3068, 3138: 3069, 3139: 3070, 3140: 3071, 3141: 3072, 3142: 3073, 3143: 3074, 3144: 3075, 3145: 3076, 3146: 3077, 3147: 3078, 3148: 3079, 3149: 3080, 3150: 3081, 3151: 3082, 3152: 3083, 3153: 3084, 3154: 3085, 3155: 3086, 3156: 3087, 3157: 3088, 3158: 3089, 3159: 3090, 3160: 3091, 3161: 3092, 3162: 3093, 3163: 3094, 3164: 3095, 3165: 3096, 3166: 3097, 3167: 3098, 3168: 3099, 3169: 3100, 3170: 3101, 3171: 3102, 3172: 3103, 3173: 3104, 3174: 3105, 3175: 3106, 3176: 3107, 3177: 3108, 3178: 3109, 3179: 3110, 3180: 3111, 3181: 3112, 3182: 3113, 3183: 3114, 3184: 3115, 3185: 3116, 3186: 3117, 3187: 3118, 3188: 3119, 3189: 3120, 3190: 3121, 3191: 3122, 3192: 3123, 3193: 3124, 3194: 3125, 3195: 3126, 3196: 3127, 3197: 3128, 3198: 3129, 3199: 3130, 3200: 3131, 3201: 3132, 3202: 3133, 3203: 3134, 3204: 3135, 3205: 3136, 3206: 3137, 3207: 3138, 3208: 3139, 3209: 3140, 3210: 3141, 3211: 3142, 3212: 3143, 3213: 3144, 3214: 3145, 3215: 3146, 3216: 3147, 3217: 3148, 3218: 3149, 3219: 3150, 3220: 3151, 3221: 3152, 3222: 3153, 3223: 3154, 3224: 3155, 3225: 3156, 3226: 3157, 3227: 3158, 3228: 3159, 3229: 3160, 3230: 3161, 3231: 3162, 3232: 3163, 3233: 3164, 3234: 3165, 3235: 3166, 3236: 3167, 3237: 3168, 3238: 3169, 3239: 3170, 3240: 3171, 3241: 3172, 3242: 3173, 3243: 3174, 3244: 3175, 3245: 3176, 3246: 3177, 3247: 3178, 3248: 3179, 3249: 3180, 3250: 3181, 3251: 3182, 3252: 3183, 3253: 3184, 3254: 3185, 3255: 3186, 3256: 3187, 3257: 3188, 3258: 3189, 3259: 3190, 3260: 3191, 3261: 3192, 3262: 3193, 3263: 3194, 3264: 3195, 3265: 3196, 3266: 3197, 3267: 3198, 3268: 3199, 3269: 3200, 3270: 3201, 3271: 3202, 3272: 3203, 3273: 3204, 3274: 3205, 3275: 3206, 3276: 3207, 3277: 3208, 3278: 3209, 3279: 3210, 3280: 3211, 3281: 3212, 3282: 3213, 3283: 3214, 3284: 3215, 3285: 3216, 3286: 3217, 3287: 3218, 3288: 3219, 3289: 3220, 3290: 3221, 3291: 3222, 3292: 3223, 3293: 3224, 3294: 3225, 3295: 3226, 3296: 3227, 3297: 3228, 3298: 3229, 3299: 3230, 3300: 3231, 3301: 3232, 3302: 3233, 3303: 3234, 3304: 3235, 3305: 3236, 3306: 3237, 3307: 3238, 3308: 3239, 3309: 3240, 3310: 3241, 3311: 3242, 3312: 3243, 3313: 3244, 3314: 3245, 3315: 3246, 3316: 3247, 3317: 3248, 3318: 3249, 3319: 3250, 3320: 3251, 3321: 3252, 3322: 3253, 3323: 3254, 3324: 3255, 3325: 3256, 3326: 3257, 3327: 3258, 3328: 3259, 3329: 3260, 3330: 3261, 3331: 3262, 3332: 3263, 3333: 3264, 3334: 3265, 3335: 3266, 3336: 3267, 3337: 3268, 3338: 3269, 3339: 3270, 3340: 3271, 3341: 3272, 3342: 3273, 3343: 3274, 3344: 3275, 3345: 3276, 3346: 3277, 3347: 3278, 3348: 3279, 3349: 3280, 3350: 3281, 3351: 3282, 3352: 3283, 3353: 3284, 3354: 3285, 3355: 3286, 3356: 3287, 3357: 3288, 3358: 3289, 3359: 3290, 3360: 3291, 3361: 3292, 3362: 3293, 3363: 3294, 3364: 3295, 3365: 3296, 3366: 3297, 3367: 3298, 3368: 3299, 3369: 3300, 3370: 3301, 3371: 3302, 3372: 3303, 3373: 3304, 3374: 3305, 3375: 3306, 3376: 3307, 3377: 3308, 3378: 3309, 3379: 3310, 3380: 3311, 3381: 3312, 3382: 3313, 3383: 3314, 3384: 3315, 3385: 3316, 3386: 3317, 3387: 3318, 3388: 3319, 3389: 3320, 3390: 3321, 3391: 3322, 3392: 3323, 3393: 3324, 3394: 3325, 3395: 3326, 3396: 3327, 3397: 3328, 3398: 3329, 3399: 3330, 3400: 3331, 3401: 3332, 3402: 3333, 3403: 3334, 3404: 3335, 3405: 3336, 3406: 3337, 3407: 3338, 3408: 3339, 3409: 3340, 3410: 3341, 3411: 3342, 3412: 3343, 3413: 3344, 3414: 3345, 3415: 3346, 3416: 3347, 3417: 3348, 3418: 3349, 3419: 3350, 3420: 3351, 3421: 3352, 3422: 3353, 3423: 3354, 3424: 3355, 3425: 3356, 3426: 3357, 3427: 3358, 3428: 3359, 3429: 3360, 3430: 3361, 3431: 3362, 3432: 3363, 3433: 3364, 3434: 3365, 3435: 3366, 3436: 3367, 3437: 3368, 3438: 3369, 3439: 3370, 3440: 3371, 3441: 3372, 3442: 3373, 3443: 3374, 3444: 3375, 3445: 3376, 3446: 3377, 3447: 3378, 3448: 3379, 3449: 3380, 3450: 3381, 3451: 3382, 3452: 3383, 3453: 3384, 3454: 3385, 3455: 3386, 3456: 3387, 3457: 3388, 3458: 3389, 3459: 3390, 3460: 3391, 3461: 3392, 3462: 3393, 3463: 3394, 3464: 3395, 3465: 3396, 3466: 3397, 3467: 3398, 3468: 3399, 3469: 3400, 3470: 3401, 3471: 3402, 3472: 3403, 3473: 3404, 3474: 3405, 3475: 3406, 3476: 3407, 3477: 3408, 3478: 3409, 3479: 3410, 3480: 3411, 3481: 3412, 3482: 3413, 3483: 3414, 3484: 3415, 3485: 3416, 3486: 3417, 3487: 3418, 3488: 3419, 3489: 3420, 3490: 3421, 3491: 3422, 3492: 3423, 3493: 3424, 3494: 3425, 3495: 3426, 3496: 3427, 3497: 3428, 3498: 3429, 3499: 3430, 3500: 3431, 3501: 3432, 3502: 3433, 3503: 3434, 3504: 3435, 3505: 3436, 3506: 3437, 3507: 3438, 3508: 3439, 3509: 3440, 3510: 3441, 3511: 3442, 3512: 3443, 3513: 3444, 3514: 3445, 3515: 3446, 3516: 3447, 3517: 3448, 3518: 3449, 3519: 3450, 3520: 3451, 3521: 3452, 3522: 3453, 3523: 3454, 3524: 3455, 3525: 3456, 3526: 3457, 3527: 3458, 3528: 3459, 3529: 3460, 3530: 3461, 3531: 3462, 3532: 3463, 3533: 3464, 3534: 3465, 3535: 3466, 3536: 3467, 3537: 3468, 3538: 3469, 3539: 3470, 3540: 3471, 3541: 3472, 3542: 3473, 3543: 3474, 3544: 3475, 3545: 3476, 3546: 3477, 3547: 3478, 3548: 3479, 3549: 3480, 3550: 3481, 3551: 3482, 3552: 3483, 3553: 3484, 3554: 3485, 3555: 3486, 3556: 3487, 3557: 3488, 3558: 3489, 3559: 3490, 3560: 3491, 3561: 3492, 3562: 3493, 3563: 3494, 3564: 3495, 3565: 3496, 3566: 3497, 3567: 3498, 3568: 3499, 3569: 3500, 3570: 3501, 3571: 3502, 3572: 3503, 3573: 3504, 3574: 3505, 3575: 3506, 3576: 3507, 3577: 3508, 3578: 3509, 3579: 3510, 3580: 3511, 3581: 3512, 3582: 3513, 3583: 3514, 3584: 3515, 3585: 3516, 3586: 3517, 3587: 3518, 3588: 3519, 3589: 3520, 3590: 3521, 3591: 3522, 3592: 3523, 3593: 3524, 3594: 3525, 3595: 3526, 3596: 3527, 3597: 3528, 3598: 3529, 3599: 3530, 3600: 3531, 3601: 3532, 3602: 3533, 3603: 3534, 3604: 3535, 3605: 3536, 3606: 3537, 3607: 3538, 3608: 3539, 3609: 3540, 3610: 3541, 3611: 3542, 3612: 3543, 3613: 3544, 3614: 3545, 3615: 3546, 3616: 3547, 3617: 3548, 3618: 3549, 3619: 3550, 3620: 3551, 3621: 3552, 3622: 3553, 3623: 3554, 3624: 3555, 3625: 3556, 3626: 3557, 3627: 3558, 3628: 3559, 3629: 3560, 3630: 3561, 3631: 3562, 3632: 3563, 3633: 3564, 3634: 3565, 3635: 3566, 3636: 3567, 3637: 3568, 3638: 3569, 3639: 3570, 3640: 3571, 3641: 3572, 3642: 3573, 3643: 3574, 3644: 3575, 3645: 3576, 3646: 3577, 3647: 3578, 3648: 3579, 3649: 3580, 3650: 3581, 3651: 3582, 3652: 3583, 3653: 3584, 3654: 3585, 3655: 3586, 3656: 3587, 3657: 3588, 3658: 3589, 3659: 3590, 3660: 3591, 3661: 3592, 3662: 3593, 3663: 3594, 3664: 3595, 3665: 3596, 3666: 3597, 3667: 3598, 3668: 3599, 3669: 3600, 3670: 3601, 3671: 3602, 3672: 3603, 3673: 3604, 3674: 3605, 3675: 3606, 3676: 3607, 3677: 3608, 3678: 3609, 3679: 3610, 3680: 3611, 3681: 3612, 3682: 3613, 3683: 3614, 3684: 3615, 3685: 3616, 3686: 3617, 3687: 3618, 3688: 3619, 3689: 3620, 3690: 3621, 3691: 3622, 3692: 3623, 3693: 3624, 3694: 3625, 3695: 3626, 3696: 3627, 3697: 3628, 3698: 3629, 3699: 3630, 3700: 3631, 3701: 3632, 3702: 3633, 3703: 3634, 3704: 3635, 3705: 3636, 3706: 3637, 3707: 3638, 3708: 3639, 3709: 3640, 3710: 3641, 3711: 3642, 3712: 3643, 3713: 3644, 3714: 3645, 3715: 3646, 3716: 3647, 3717: 3648, 3718: 3649, 3719: 3650, 3720: 3651, 3721: 3652, 3722: 3653, 3723: 3654, 3724: 3655, 3725: 3656, 3726: 3657, 3727: 3658, 3728: 3659, 3729: 3660, 3730: 3661, 3731: 3662, 3732: 3663, 3733: 3664, 3734: 3665, 3735: 3666, 3736: 3667, 3737: 3668, 3738: 3669, 3739: 3670, 3740: 3671, 3741: 3672, 3742: 3673, 3743: 3674, 3744: 3675, 3745: 3676, 3746: 3677, 3747: 3678, 3748: 3679, 3749: 3680, 3750: 3681, 3751: 3682, 3752: 3683, 3753: 3684, 3754: 3685, 3755: 3686, 3756: 3687, 3757: 3688, 3758: 3689, 3759: 3690, 3760: 3691, 3761: 3692, 3762: 3693, 3763: 3694, 3764: 3695, 3765: 3696, 3766: 3697, 3767: 3698, 3768: 3699, 3769: 3700, 3770: 3701, 3771: 3702, 3772: 3703, 3773: 3704, 3774: 3705, 3775: 3706, 3776: 3707, 3777: 3708, 3778: 3709, 3779: 3710, 3780: 3711, 3781: 3712, 3782: 3713, 3783: 3714, 3784: 3715, 3785: 3716, 3786: 3717, 3787: 3718, 3788: 3719, 3789: 3720, 3790: 3721, 3791: 3722, 3792: 3723, 3793: 3724, 3794: 3725, 3795: 3726, 3796: 3727, 3797: 3728, 3798: 3729, 3799: 3730, 3800: 3731, 3801: 3732, 3802: 3733, 3803: 3734, 3804: 3735, 3805: 3736, 3806: 3737, 3807: 3738, 3808: 3739, 3809: 3740, 3810: 3741, 3811: 3742, 3812: 3743, 3813: 3744, 3814: 3745, 3816: 3746, 3817: 3747, 3818: 3748, 3819: 3749, 3820: 3750, 3821: 3751, 3822: 3752, 3823: 3753, 3824: 3754, 3825: 3755, 3826: 3756, 3827: 3757, 3828: 3758, 3829: 3759, 3830: 3760, 3831: 3761, 3832: 3762, 3833: 3763, 3834: 3764, 3835: 3765, 3836: 3766, 3837: 3767, 3838: 3768, 3839: 3769, 3840: 3770, 3841: 3771, 3842: 3772, 3843: 3773, 3844: 3774, 3845: 3775, 3846: 3776, 3847: 3777, 3848: 3778, 3849: 3779, 3850: 3780, 3851: 3781, 3852: 3782, 3853: 3783, 3854: 3784, 3855: 3785, 3856: 3786, 3857: 3787, 3858: 3788, 3859: 3789, 3860: 3790, 3861: 3791, 3862: 3792, 3863: 3793, 3864: 3794, 3865: 3795, 3866: 3796, 3867: 3797, 3868: 3798, 3869: 3799, 3870: 3800, 3871: 3801, 3872: 3802, 3873: 3803, 3874: 3804, 3875: 3805, 3876: 3806, 3877: 3807, 3878: 3808, 3879: 3809, 3880: 3810, 3881: 3811, 3882: 3812, 3883: 3813, 3884: 3814, 3885: 3815, 3886: 3816, 3887: 3817, 3888: 3818, 3889: 3819, 3890: 3820, 3891: 3821, 3892: 3822, 3893: 3823, 3894: 3824, 3895: 3825, 3896: 3826, 3897: 3827, 3898: 3828, 3899: 3829, 3900: 3830, 3901: 3831, 3902: 3832, 3903: 3833, 3904: 3834, 3905: 3835, 3906: 3836, 3907: 3837, 3908: 3838, 3909: 3839, 3910: 3840, 3911: 3841, 3912: 3842, 3913: 3843, 3914: 3844, 3915: 3845, 3916: 3846, 3917: 3847, 3918: 3848, 3919: 3849, 3920: 3850, 3921: 3851, 3922: 3852, 3923: 3853, 3924: 3854, 3925: 3855, 3926: 3856, 3927: 3857, 3928: 3858, 3929: 3859, 3930: 3860, 3931: 3861, 3932: 3862, 3933: 3863, 3934: 3864, 3935: 3865, 3936: 3866, 3937: 3867, 3938: 3868, 3939: 3869, 3940: 3870, 3941: 3871, 3942: 3872, 3943: 3873, 3944: 3874, 3945: 3875, 3946: 3876, 3947: 3877, 3948: 3878, 3949: 3879, 3950: 3880, 3951: 3881, 3952: 3882}} {'item_id': {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10, 10: 11, 11: 12, 12: 13, 13: 14, 14: 15, 15: 16, 16: 17, 17: 18, 18: 19, 19: 20, 20: 21, 21: 22, 22: 23, 23: 24, 24: 25, 25: 26, 26: 27, 27: 28, 28: 29, 29: 30, 30: 31, 31: 32, 32: 33, 33: 34, 34: 35, 35: 36, 36: 37, 37: 38, 38: 39, 39: 40, 40: 41, 41: 42, 42: 43, 43: 44, 44: 45, 45: 46, 46: 47, 47: 48, 48: 49, 49: 50, 50: 51, 51: 52, 52: 53, 53: 54, 54: 55, 55: 56, 56: 57, 57: 58, 58: 59, 59: 60, 60: 61, 61: 62, 62: 63, 63: 64, 64: 65, 65: 66, 66: 67, 67: 68, 68: 69, 69: 70, 70: 71, 71: 72, 72: 73, 73: 74, 74: 75, 75: 76, 76: 77, 77: 78, 78: 79, 79: 80, 80: 81, 81: 82, 82: 83, 83: 84, 84: 85, 85: 86, 86: 87, 87: 88, 88: 89, 89: 90, 90: 92, 91: 93, 92: 94, 93: 95, 94: 96, 95: 97, 96: 98, 97: 99, 98: 100, 99: 101, 100: 102, 101: 103, 102: 104, 103: 105, 104: 106, 105: 107, 106: 108, 107: 109, 108: 110, 109: 111, 110: 112, 111: 113, 112: 114, 113: 115, 114: 116, 115: 117, 116: 118, 117: 119, 118: 120, 119: 121, 120: 122, 121: 123, 122: 124, 123: 125, 124: 126, 125: 127, 126: 128, 127: 129, 128: 130, 129: 131, 130: 132, 131: 133, 132: 134, 133: 135, 134: 136, 135: 137, 136: 138, 137: 139, 138: 140, 139: 141, 140: 142, 141: 143, 142: 144, 143: 145, 144: 146, 145: 147, 146: 148, 147: 149, 148: 150, 149: 151, 150: 152, 151: 153, 152: 154, 153: 155, 154: 156, 155: 157, 156: 158, 157: 159, 158: 160, 159: 161, 160: 162, 161: 163, 162: 164, 163: 165, 164: 166, 165: 167, 166: 168, 167: 169, 168: 170, 169: 171, 170: 172, 171: 173, 172: 174, 173: 175, 174: 176, 175: 177, 176: 178, 177: 179, 178: 180, 179: 181, 180: 182, 181: 183, 182: 184, 183: 185, 184: 186, 185: 187, 186: 188, 187: 189, 188: 190, 189: 191, 190: 192, 191: 193, 192: 194, 193: 195, 194: 196, 195: 197, 196: 198, 197: 199, 198: 200, 199: 201, 200: 202, 201: 203, 202: 204, 203: 205, 204: 206, 205: 207, 206: 208, 207: 209, 208: 210, 209: 211, 210: 212, 211: 213, 212: 214, 213: 215, 214: 216, 215: 217, 216: 218, 217: 219, 218: 220, 219: 222, 220: 223, 221: 224, 222: 225, 223: 226, 224: 227, 225: 228, 226: 229, 227: 230, 228: 231, 229: 232, 230: 233, 231: 234, 232: 235, 233: 236, 234: 237, 235: 238, 236: 239, 237: 240, 238: 241, 239: 242, 240: 243, 241: 244, 242: 245, 243: 246, 244: 247, 245: 248, 246: 249, 247: 250, 248: 251, 249: 252, 250: 253, 251: 254, 252: 255, 253: 256, 254: 257, 255: 258, 256: 259, 257: 260, 258: 261, 259: 262, 260: 263, 261: 264, 262: 265, 263: 266, 264: 267, 265: 268, 266: 269, 267: 270, 268: 271, 269: 272, 270: 273, 271: 274, 272: 275, 273: 276, 274: 277, 275: 278, 276: 279, 277: 280, 278: 281, 279: 282, 280: 283, 281: 284, 282: 285, 283: 286, 284: 287, 285: 288, 286: 289, 287: 290, 288: 291, 289: 292, 290: 293, 291: 294, 292: 295, 293: 296, 294: 297, 295: 298, 296: 299, 297: 300, 298: 301, 299: 302, 300: 303, 301: 304, 302: 305, 303: 306, 304: 307, 305: 308, 306: 309, 307: 310, 308: 311, 309: 312, 310: 313, 311: 314, 312: 315, 313: 316, 314: 317, 315: 318, 316: 319, 317: 320, 318: 321, 319: 322, 320: 324, 321: 325, 322: 326, 323: 327, 324: 328, 325: 329, 326: 330, 327: 331, 328: 332, 329: 333, 330: 334, 331: 335, 332: 336, 333: 337, 334: 338, 335: 339, 336: 340, 337: 341, 338: 342, 339: 343, 340: 344, 341: 345, 342: 346, 343: 347, 344: 348, 345: 349, 346: 350, 347: 351, 348: 352, 349: 353, 350: 354, 351: 355, 352: 356, 353: 357, 354: 358, 355: 359, 356: 360, 357: 361, 358: 362, 359: 363, 360: 364, 361: 365, 362: 366, 363: 367, 364: 368, 365: 369, 366: 370, 367: 371, 368: 372, 369: 373, 370: 374, 371: 375, 372: 376, 373: 377, 374: 378, 375: 379, 376: 380, 377: 381, 378: 382, 379: 383, 380: 384, 381: 385, 382: 386, 383: 387, 384: 388, 385: 389, 386: 390, 387: 391, 388: 392, 389: 393, 390: 394, 391: 395, 392: 396, 393: 397, 394: 398, 395: 399, 396: 400, 397: 401, 398: 402, 399: 403, 400: 404, 401: 405, 402: 406, 403: 407, 404: 408, 405: 409, 406: 410, 407: 411, 408: 412, 409: 413, 410: 414, 411: 415, 412: 416, 413: 417, 414: 418, 415: 419, 416: 420, 417: 421, 418: 422, 419: 423, 420: 424, 421: 425, 422: 426, 423: 427, 424: 428, 425: 429, 426: 430, 427: 431, 428: 432, 429: 433, 430: 434, 431: 435, 432: 436, 433: 437, 434: 438, 435: 439, 436: 440, 437: 441, 438: 442, 439: 443, 440: 444, 441: 445, 442: 446, 443: 447, 444: 448, 445: 449, 446: 450, 447: 451, 448: 452, 449: 453, 450: 454, 451: 455, 452: 456, 453: 457, 454: 458, 455: 459, 456: 460, 457: 461, 458: 462, 459: 463, 460: 464, 461: 465, 462: 466, 463: 467, 464: 468, 465: 469, 466: 470, 467: 471, 468: 472, 469: 473, 470: 474, 471: 475, 472: 476, 473: 477, 474: 478, 475: 479, 476: 480, 477: 481, 478: 482, 479: 483, 480: 484, 481: 485, 482: 486, 483: 487, 484: 488, 485: 489, 486: 490, 487: 491, 488: 492, 489: 493, 490: 494, 491: 495, 492: 496, 493: 497, 494: 498, 495: 499, 496: 500, 497: 501, 498: 502, 499: 503, 500: 504, 501: 505, 502: 506, 503: 507, 504: 508, 505: 509, 506: 510, 507: 511, 508: 512, 509: 513, 510: 514, 511: 515, 512: 516, 513: 517, 514: 518, 515: 519, 516: 520, 517: 521, 518: 522, 519: 523, 520: 524, 521: 525, 522: 526, 523: 527, 524: 528, 525: 529, 526: 530, 527: 531, 528: 532, 529: 533, 530: 534, 531: 535, 532: 536, 533: 537, 534: 538, 535: 539, 536: 540, 537: 541, 538: 542, 539: 543, 540: 544, 541: 545, 542: 546, 543: 547, 544: 548, 545: 549, 546: 550, 547: 551, 548: 552, 549: 553, 550: 554, 551: 555, 552: 556, 553: 557, 554: 558, 555: 559, 556: 560, 557: 561, 558: 562, 559: 563, 560: 564, 561: 565, 562: 566, 563: 567, 564: 568, 565: 569, 566: 570, 567: 571, 568: 572, 569: 573, 570: 574, 571: 575, 572: 576, 573: 577, 574: 578, 575: 579, 576: 580, 577: 581, 578: 582, 579: 583, 580: 584, 581: 585, 582: 586, 583: 587, 584: 588, 585: 589, 586: 590, 587: 591, 588: 592, 589: 593, 590: 594, 591: 595, 592: 596, 593: 597, 594: 598, 595: 599, 596: 600, 597: 601, 598: 602, 599: 603, 600: 604, 601: 605, 602: 606, 603: 607, 604: 608, 605: 609, 606: 610, 607: 611, 608: 612, 609: 613, 610: 614, 611: 615, 612: 616, 613: 617, 614: 618, 615: 619, 616: 620, 617: 621, 618: 623, 619: 624, 620: 625, 621: 626, 622: 627, 623: 628, 624: 629, 625: 630, 626: 631, 627: 632, 628: 633, 629: 634, 630: 635, 631: 636, 632: 637, 633: 638, 634: 639, 635: 640, 636: 641, 637: 642, 638: 643, 639: 644, 640: 645, 641: 647, 642: 648, 643: 649, 644: 650, 645: 651, 646: 652, 647: 653, 648: 654, 649: 655, 650: 656, 651: 657, 652: 658, 653: 659, 654: 660, 655: 661, 656: 662, 657: 663, 658: 664, 659: 665, 660: 666, 661: 667, 662: 668, 663: 669, 664: 670, 665: 671, 666: 672, 667: 673, 668: 674, 669: 675, 670: 676, 671: 678, 672: 679, 673: 680, 674: 681, 675: 682, 676: 683, 677: 684, 678: 685, 679: 687, 680: 688, 681: 690, 682: 691, 683: 692, 684: 693, 685: 694, 686: 695, 687: 696, 688: 697, 689: 698, 690: 699, 691: 700, 692: 701, 693: 702, 694: 703, 695: 704, 696: 705, 697: 706, 698: 707, 699: 708, 700: 709, 701: 710, 702: 711, 703: 712, 704: 713, 705: 714, 706: 715, 707: 716, 708: 717, 709: 718, 710: 719, 711: 720, 712: 721, 713: 722, 714: 723, 715: 724, 716: 725, 717: 726, 718: 727, 719: 728, 720: 729, 721: 730, 722: 731, 723: 732, 724: 733, 725: 734, 726: 735, 727: 736, 728: 737, 729: 738, 730: 739, 731: 741, 732: 742, 733: 743, 734: 744, 735: 745, 736: 746, 737: 747, 738: 748, 739: 749, 740: 750, 741: 751, 742: 752, 743: 753, 744: 754, 745: 755, 746: 756, 747: 757, 748: 758, 749: 759, 750: 760, 751: 761, 752: 762, 753: 763, 754: 764, 755: 765, 756: 766, 757: 767, 758: 768, 759: 769, 760: 770, 761: 771, 762: 772, 763: 773, 764: 774, 765: 775, 766: 776, 767: 777, 768: 778, 769: 779, 770: 780, 771: 781, 772: 782, 773: 783, 774: 784, 775: 785, 776: 786, 777: 787, 778: 788, 779: 789, 780: 790, 781: 791, 782: 792, 783: 793, 784: 794, 785: 795, 786: 796, 787: 797, 788: 798, 789: 799, 790: 800, 791: 801, 792: 802, 793: 803, 794: 804, 795: 805, 796: 806, 797: 807, 798: 808, 799: 809, 800: 810, 801: 811, 802: 812, 803: 813, 804: 814, 805: 815, 806: 816, 807: 818, 808: 819, 809: 820, 810: 821, 811: 822, 812: 823, 813: 824, 814: 825, 815: 826, 816: 827, 817: 828, 818: 829, 819: 830, 820: 831, 821: 832, 822: 833, 823: 834, 824: 835, 825: 836, 826: 837, 827: 838, 828: 839, 829: 840, 830: 841, 831: 842, 832: 843, 833: 844, 834: 845, 835: 846, 836: 847, 837: 848, 838: 849, 839: 850, 840: 851, 841: 852, 842: 853, 843: 854, 844: 855, 845: 856, 846: 857, 847: 858, 848: 859, 849: 860, 850: 861, 851: 862, 852: 863, 853: 864, 854: 865, 855: 866, 856: 867, 857: 868, 858: 869, 859: 870, 860: 871, 861: 872, 862: 873, 863: 874, 864: 875, 865: 876, 866: 877, 867: 878, 868: 879, 869: 880, 870: 881, 871: 882, 872: 884, 873: 885, 874: 886, 875: 887, 876: 888, 877: 889, 878: 890, 879: 891, 880: 892, 881: 893, 882: 894, 883: 895, 884: 896, 885: 897, 886: 898, 887: 899, 888: 900, 889: 901, 890: 902, 891: 903, 892: 904, 893: 905, 894: 906, 895: 907, 896: 908, 897: 909, 898: 910, 899: 911, 900: 912, 901: 913, 902: 914, 903: 915, 904: 916, 905: 917, 906: 918, 907: 919, 908: 920, 909: 921, 910: 922, 911: 923, 912: 924, 913: 925, 914: 926, 915: 927, 916: 928, 917: 929, 918: 930, 919: 931, 920: 932, 921: 933, 922: 934, 923: 935, 924: 936, 925: 937, 926: 938, 927: 939, 928: 940, 929: 941, 930: 942, 931: 943, 932: 944, 933: 945, 934: 946, 935: 947, 936: 948, 937: 949, 938: 950, 939: 951, 940: 952, 941: 953, 942: 954, 943: 955, 944: 956, 945: 957, 946: 958, 947: 959, 948: 960, 949: 961, 950: 962, 951: 963, 952: 964, 953: 965, 954: 966, 955: 967, 956: 968, 957: 969, 958: 970, 959: 971, 960: 972, 961: 973, 962: 974, 963: 975, 964: 976, 965: 977, 966: 978, 967: 979, 968: 980, 969: 981, 970: 982, 971: 983, 972: 984, 973: 985, 974: 986, 975: 987, 976: 988, 977: 989, 978: 990, 979: 991, 980: 992, 981: 993, 982: 994, 983: 996, 984: 997, 985: 998, 986: 999, 987: 1000, 988: 1001, 989: 1002, 990: 1003, 991: 1004, 992: 1005, 993: 1006, 994: 1007, 995: 1008, 996: 1009, 997: 1010, 998: 1011, 999: 1012, 1000: 1013, 1001: 1014, 1002: 1015, 1003: 1016, 1004: 1017, 1005: 1018, 1006: 1019, 1007: 1020, 1008: 1021, 1009: 1022, 1010: 1023, 1011: 1024, 1012: 1025, 1013: 1026, 1014: 1027, 1015: 1028, 1016: 1029, 1017: 1030, 1018: 1031, 1019: 1032, 1020: 1033, 1021: 1034, 1022: 1035, 1023: 1036, 1024: 1037, 1025: 1038, 1026: 1039, 1027: 1040, 1028: 1041, 1029: 1042, 1030: 1043, 1031: 1044, 1032: 1045, 1033: 1046, 1034: 1047, 1035: 1049, 1036: 1050, 1037: 1051, 1038: 1052, 1039: 1053, 1040: 1054, 1041: 1055, 1042: 1056, 1043: 1057, 1044: 1058, 1045: 1059, 1046: 1060, 1047: 1061, 1048: 1062, 1049: 1063, 1050: 1064, 1051: 1065, 1052: 1066, 1053: 1067, 1054: 1068, 1055: 1069, 1056: 1070, 1057: 1071, 1058: 1073, 1059: 1075, 1060: 1076, 1061: 1077, 1062: 1078, 1063: 1079, 1064: 1080, 1065: 1081, 1066: 1082, 1067: 1083, 1068: 1084, 1069: 1085, 1070: 1086, 1071: 1087, 1072: 1088, 1073: 1089, 1074: 1090, 1075: 1091, 1076: 1092, 1077: 1093, 1078: 1094, 1079: 1095, 1080: 1096, 1081: 1097, 1082: 1098, 1083: 1099, 1084: 1100, 1085: 1101, 1086: 1102, 1087: 1103, 1088: 1104, 1089: 1105, 1090: 1106, 1091: 1107, 1092: 1108, 1093: 1109, 1094: 1110, 1095: 1111, 1096: 1112, 1097: 1113, 1098: 1114, 1099: 1115, 1100: 1116, 1101: 1117, 1102: 1118, 1103: 1119, 1104: 1120, 1105: 1121, 1106: 1122, 1107: 1123, 1108: 1124, 1109: 1125, 1110: 1126, 1111: 1127, 1112: 1128, 1113: 1129, 1114: 1130, 1115: 1131, 1116: 1132, 1117: 1133, 1118: 1134, 1119: 1135, 1120: 1136, 1121: 1137, 1122: 1138, 1123: 1139, 1124: 1140, 1125: 1141, 1126: 1142, 1127: 1143, 1128: 1144, 1129: 1145, 1130: 1146, 1131: 1147, 1132: 1148, 1133: 1149, 1134: 1150, 1135: 1151, 1136: 1152, 1137: 1153, 1138: 1154, 1139: 1155, 1140: 1156, 1141: 1157, 1142: 1158, 1143: 1159, 1144: 1160, 1145: 1161, 1146: 1162, 1147: 1163, 1148: 1164, 1149: 1165, 1150: 1166, 1151: 1167, 1152: 1168, 1153: 1169, 1154: 1170, 1155: 1171, 1156: 1172, 1157: 1173, 1158: 1174, 1159: 1175, 1160: 1176, 1161: 1177, 1162: 1178, 1163: 1179, 1164: 1180, 1165: 1181, 1166: 1183, 1167: 1184, 1168: 1185, 1169: 1186, 1170: 1187, 1171: 1188, 1172: 1189, 1173: 1190, 1174: 1191, 1175: 1192, 1176: 1193, 1177: 1194, 1178: 1196, 1179: 1197, 1180: 1198, 1181: 1199, 1182: 1200, 1183: 1201, 1184: 1202, 1185: 1203, 1186: 1204, 1187: 1205, 1188: 1206, 1189: 1207, 1190: 1208, 1191: 1209, 1192: 1210, 1193: 1211, 1194: 1212, 1195: 1213, 1196: 1214, 1197: 1215, 1198: 1216, 1199: 1217, 1200: 1218, 1201: 1219, 1202: 1220, 1203: 1221, 1204: 1222, 1205: 1223, 1206: 1224, 1207: 1225, 1208: 1226, 1209: 1227, 1210: 1228, 1211: 1230, 1212: 1231, 1213: 1232, 1214: 1233, 1215: 1234, 1216: 1235, 1217: 1236, 1218: 1237, 1219: 1238, 1220: 1240, 1221: 1241, 1222: 1242, 1223: 1243, 1224: 1244, 1225: 1245, 1226: 1246, 1227: 1247, 1228: 1248, 1229: 1249, 1230: 1250, 1231: 1251, 1232: 1252, 1233: 1253, 1234: 1254, 1235: 1255, 1236: 1256, 1237: 1257, 1238: 1258, 1239: 1259, 1240: 1260, 1241: 1261, 1242: 1262, 1243: 1263, 1244: 1264, 1245: 1265, 1246: 1266, 1247: 1267, 1248: 1268, 1249: 1269, 1250: 1270, 1251: 1271, 1252: 1272, 1253: 1273, 1254: 1274, 1255: 1275, 1256: 1276, 1257: 1277, 1258: 1278, 1259: 1279, 1260: 1280, 1261: 1281, 1262: 1282, 1263: 1283, 1264: 1284, 1265: 1285, 1266: 1286, 1267: 1287, 1268: 1288, 1269: 1289, 1270: 1290, 1271: 1291, 1272: 1292, 1273: 1293, 1274: 1294, 1275: 1295, 1276: 1296, 1277: 1297, 1278: 1298, 1279: 1299, 1280: 1300, 1281: 1301, 1282: 1302, 1283: 1303, 1284: 1304, 1285: 1305, 1286: 1306, 1287: 1307, 1288: 1308, 1289: 1309, 1290: 1310, 1291: 1311, 1292: 1312, 1293: 1313, 1294: 1314, 1295: 1315, 1296: 1316, 1297: 1317, 1298: 1318, 1299: 1319, 1300: 1320, 1301: 1321, 1302: 1322, 1303: 1323, 1304: 1324, 1305: 1325, 1306: 1326, 1307: 1327, 1308: 1328, 1309: 1329, 1310: 1330, 1311: 1331, 1312: 1332, 1313: 1333, 1314: 1334, 1315: 1335, 1316: 1336, 1317: 1337, 1318: 1339, 1319: 1340, 1320: 1341, 1321: 1342, 1322: 1343, 1323: 1344, 1324: 1345, 1325: 1346, 1326: 1347, 1327: 1348, 1328: 1349, 1329: 1350, 1330: 1351, 1331: 1352, 1332: 1353, 1333: 1354, 1334: 1355, 1335: 1356, 1336: 1357, 1337: 1358, 1338: 1359, 1339: 1360, 1340: 1361, 1341: 1362, 1342: 1363, 1343: 1364, 1344: 1365, 1345: 1366, 1346: 1367, 1347: 1368, 1348: 1369, 1349: 1370, 1350: 1371, 1351: 1372, 1352: 1373, 1353: 1374, 1354: 1375, 1355: 1376, 1356: 1377, 1357: 1378, 1358: 1379, 1359: 1380, 1360: 1381, 1361: 1382, 1362: 1383, 1363: 1384, 1364: 1385, 1365: 1386, 1366: 1387, 1367: 1388, 1368: 1389, 1369: 1390, 1370: 1391, 1371: 1392, 1372: 1393, 1373: 1394, 1374: 1395, 1375: 1396, 1376: 1397, 1377: 1398, 1378: 1399, 1379: 1400, 1380: 1401, 1381: 1404, 1382: 1405, 1383: 1406, 1384: 1407, 1385: 1408, 1386: 1409, 1387: 1410, 1388: 1411, 1389: 1412, 1390: 1413, 1391: 1414, 1392: 1415, 1393: 1416, 1394: 1417, 1395: 1419, 1396: 1420, 1397: 1421, 1398: 1422, 1399: 1423, 1400: 1424, 1401: 1425, 1402: 1426, 1403: 1427, 1404: 1428, 1405: 1429, 1406: 1430, 1407: 1431, 1408: 1432, 1409: 1433, 1410: 1434, 1411: 1436, 1412: 1437, 1413: 1438, 1414: 1439, 1415: 1440, 1416: 1441, 1417: 1442, 1418: 1443, 1419: 1444, 1420: 1445, 1421: 1446, 1422: 1447, 1423: 1448, 1424: 1449, 1425: 1450, 1426: 1453, 1427: 1454, 1428: 1455, 1429: 1456, 1430: 1457, 1431: 1458, 1432: 1459, 1433: 1460, 1434: 1461, 1435: 1462, 1436: 1463, 1437: 1464, 1438: 1465, 1439: 1466, 1440: 1467, 1441: 1468, 1442: 1470, 1443: 1471, 1444: 1472, 1445: 1473, 1446: 1474, 1447: 1475, 1448: 1476, 1449: 1477, 1450: 1479, 1451: 1480, 1452: 1482, 1453: 1483, 1454: 1484, 1455: 1485, 1456: 1486, 1457: 1487, 1458: 1488, 1459: 1489, 1460: 1490, 1461: 1493, 1462: 1494, 1463: 1495, 1464: 1496, 1465: 1497, 1466: 1498, 1467: 1499, 1468: 1500, 1469: 1501, 1470: 1502, 1471: 1503, 1472: 1504, 1473: 1507, 1474: 1508, 1475: 1509, 1476: 1510, 1477: 1511, 1478: 1513, 1479: 1514, 1480: 1515, 1481: 1516, 1482: 1517, 1483: 1518, 1484: 1519, 1485: 1520, 1486: 1522, 1487: 1523, 1488: 1524, 1489: 1525, 1490: 1526, 1491: 1527, 1492: 1528, 1493: 1529, 1494: 1531, 1495: 1532, 1496: 1533, 1497: 1534, 1498: 1535, 1499: 1537, 1500: 1538, 1501: 1539, 1502: 1541, 1503: 1542, 1504: 1543, 1505: 1544, 1506: 1545, 1507: 1546, 1508: 1547, 1509: 1548, 1510: 1549, 1511: 1550, 1512: 1551, 1513: 1552, 1514: 1553, 1515: 1554, 1516: 1555, 1517: 1556, 1518: 1557, 1519: 1558, 1520: 1559, 1521: 1561, 1522: 1562, 1523: 1563, 1524: 1564, 1525: 1565, 1526: 1566, 1527: 1567, 1528: 1568, 1529: 1569, 1530: 1570, 1531: 1571, 1532: 1572, 1533: 1573, 1534: 1574, 1535: 1575, 1536: 1577, 1537: 1578, 1538: 1579, 1539: 1580, 1540: 1581, 1541: 1582, 1542: 1583, 1543: 1584, 1544: 1585, 1545: 1586, 1546: 1587, 1547: 1588, 1548: 1589, 1549: 1590, 1550: 1591, 1551: 1592, 1552: 1593, 1553: 1594, 1554: 1595, 1555: 1596, 1556: 1597, 1557: 1598, 1558: 1599, 1559: 1600, 1560: 1601, 1561: 1602, 1562: 1603, 1563: 1604, 1564: 1605, 1565: 1606, 1566: 1608, 1567: 1609, 1568: 1610, 1569: 1611, 1570: 1612, 1571: 1613, 1572: 1614, 1573: 1615, 1574: 1616, 1575: 1617, 1576: 1619, 1577: 1620, 1578: 1621, 1579: 1622, 1580: 1623, 1581: 1624, 1582: 1625, 1583: 1626, 1584: 1627, 1585: 1628, 1586: 1629, 1587: 1630, 1588: 1631, 1589: 1632, 1590: 1633, 1591: 1635, 1592: 1636, 1593: 1639, 1594: 1640, 1595: 1641, 1596: 1642, 1597: 1643, 1598: 1644, 1599: 1645, 1600: 1646, 1601: 1647, 1602: 1648, 1603: 1649, 1604: 1650, 1605: 1651, 1606: 1652, 1607: 1653, 1608: 1654, 1609: 1655, 1610: 1656, 1611: 1657, 1612: 1658, 1613: 1659, 1614: 1660, 1615: 1661, 1616: 1662, 1617: 1663, 1618: 1664, 1619: 1665, 1620: 1666, 1621: 1667, 1622: 1668, 1623: 1669, 1624: 1670, 1625: 1671, 1626: 1672, 1627: 1673, 1628: 1674, 1629: 1675, 1630: 1676, 1631: 1677, 1632: 1678, 1633: 1679, 1634: 1680, 1635: 1681, 1636: 1682, 1637: 1683, 1638: 1684, 1639: 1685, 1640: 1686, 1641: 1687, 1642: 1688, 1643: 1689, 1644: 1690, 1645: 1692, 1646: 1693, 1647: 1694, 1648: 1695, 1649: 1696, 1650: 1697, 1651: 1698, 1652: 1699, 1653: 1701, 1654: 1702, 1655: 1703, 1656: 1704, 1657: 1705, 1658: 1706, 1659: 1707, 1660: 1708, 1661: 1709, 1662: 1710, 1663: 1711, 1664: 1713, 1665: 1714, 1666: 1715, 1667: 1716, 1668: 1717, 1669: 1718, 1670: 1719, 1671: 1720, 1672: 1721, 1673: 1722, 1674: 1723, 1675: 1724, 1676: 1725, 1677: 1726, 1678: 1727, 1679: 1728, 1680: 1729, 1681: 1730, 1682: 1731, 1683: 1732, 1684: 1733, 1685: 1734, 1686: 1735, 1687: 1738, 1688: 1739, 1689: 1740, 1690: 1741, 1691: 1742, 1692: 1743, 1693: 1744, 1694: 1746, 1695: 1747, 1696: 1748, 1697: 1749, 1698: 1750, 1699: 1752, 1700: 1753, 1701: 1754, 1702: 1755, 1703: 1756, 1704: 1757, 1705: 1758, 1706: 1759, 1707: 1760, 1708: 1762, 1709: 1764, 1710: 1765, 1711: 1767, 1712: 1768, 1713: 1769, 1714: 1770, 1715: 1771, 1716: 1772, 1717: 1773, 1718: 1774, 1719: 1776, 1720: 1777, 1721: 1779, 1722: 1780, 1723: 1781, 1724: 1782, 1725: 1783, 1726: 1784, 1727: 1785, 1728: 1787, 1729: 1788, 1730: 1789, 1731: 1791, 1732: 1792, 1733: 1793, 1734: 1794, 1735: 1795, 1736: 1796, 1737: 1797, 1738: 1798, 1739: 1799, 1740: 1801, 1741: 1804, 1742: 1805, 1743: 1806, 1744: 1807, 1745: 1809, 1746: 1810, 1747: 1811, 1748: 1812, 1749: 1814, 1750: 1815, 1751: 1816, 1752: 1817, 1753: 1819, 1754: 1820, 1755: 1821, 1756: 1822, 1757: 1824, 1758: 1825, 1759: 1826, 1760: 1827, 1761: 1829, 1762: 1830, 1763: 1831, 1764: 1832, 1765: 1833, 1766: 1834, 1767: 1835, 1768: 1836, 1769: 1837, 1770: 1839, 1771: 1840, 1772: 1841, 1773: 1842, 1774: 1843, 1775: 1844, 1776: 1845, 1777: 1846, 1778: 1847, 1779: 1848, 1780: 1849, 1781: 1850, 1782: 1851, 1783: 1852, 1784: 1853, 1785: 1854, 1786: 1855, 1787: 1856, 1788: 1857, 1789: 1858, 1790: 1859, 1791: 1860, 1792: 1861, 1793: 1862, 1794: 1863, 1795: 1864, 1796: 1865, 1797: 1866, 1798: 1867, 1799: 1868, 1800: 1869, 1801: 1870, 1802: 1871, 1803: 1872, 1804: 1873, 1805: 1874, 1806: 1875, 1807: 1876, 1808: 1877, 1809: 1878, 1810: 1879, 1811: 1880, 1812: 1881, 1813: 1882, 1814: 1883, 1815: 1884, 1816: 1885, 1817: 1886, 1818: 1887, 1819: 1888, 1820: 1889, 1821: 1890, 1822: 1891, 1823: 1892, 1824: 1893, 1825: 1894, 1826: 1895, 1827: 1896, 1828: 1897, 1829: 1898, 1830: 1899, 1831: 1900, 1832: 1901, 1833: 1902, 1834: 1903, 1835: 1904, 1836: 1905, 1837: 1906, 1838: 1907, 1839: 1908, 1840: 1909, 1841: 1910, 1842: 1911, 1843: 1912, 1844: 1913, 1845: 1914, 1846: 1915, 1847: 1916, 1848: 1917, 1849: 1918, 1850: 1919, 1851: 1920, 1852: 1921, 1853: 1922, 1854: 1923, 1855: 1924, 1856: 1925, 1857: 1926, 1858: 1927, 1859: 1928, 1860: 1929, 1861: 1930, 1862: 1931, 1863: 1932, 1864: 1933, 1865: 1934, 1866: 1935, 1867: 1936, 1868: 1937, 1869: 1938, 1870: 1939, 1871: 1940, 1872: 1941, 1873: 1942, 1874: 1943, 1875: 1944, 1876: 1945, 1877: 1946, 1878: 1947, 1879: 1948, 1880: 1949, 1881: 1950, 1882: 1951, 1883: 1952, 1884: 1953, 1885: 1954, 1886: 1955, 1887: 1956, 1888: 1957, 1889: 1958, 1890: 1959, 1891: 1960, 1892: 1961, 1893: 1962, 1894: 1963, 1895: 1964, 1896: 1965, 1897: 1966, 1898: 1967, 1899: 1968, 1900: 1969, 1901: 1970, 1902: 1971, 1903: 1972, 1904: 1973, 1905: 1974, 1906: 1975, 1907: 1976, 1908: 1977, 1909: 1978, 1910: 1979, 1911: 1980, 1912: 1981, 1913: 1982, 1914: 1983, 1915: 1984, 1916: 1985, 1917: 1986, 1918: 1987, 1919: 1988, 1920: 1989, 1921: 1990, 1922: 1991, 1923: 1992, 1924: 1993, 1925: 1994, 1926: 1995, 1927: 1996, 1928: 1997, 1929: 1998, 1930: 1999, 1931: 2000, 1932: 2001, 1933: 2002, 1934: 2003, 1935: 2004, 1936: 2005, 1937: 2006, 1938: 2007, 1939: 2008, 1940: 2009, 1941: 2010, 1942: 2011, 1943: 2012, 1944: 2013, 1945: 2014, 1946: 2015, 1947: 2016, 1948: 2017, 1949: 2018, 1950: 2019, 1951: 2020, 1952: 2021, 1953: 2022, 1954: 2023, 1955: 2024, 1956: 2025, 1957: 2026, 1958: 2027, 1959: 2028, 1960: 2029, 1961: 2030, 1962: 2031, 1963: 2032, 1964: 2033, 1965: 2034, 1966: 2035, 1967: 2036, 1968: 2037, 1969: 2038, 1970: 2039, 1971: 2040, 1972: 2041, 1973: 2042, 1974: 2043, 1975: 2044, 1976: 2045, 1977: 2046, 1978: 2047, 1979: 2048, 1980: 2049, 1981: 2050, 1982: 2051, 1983: 2052, 1984: 2053, 1985: 2054, 1986: 2055, 1987: 2056, 1988: 2057, 1989: 2058, 1990: 2059, 1991: 2060, 1992: 2061, 1993: 2062, 1994: 2063, 1995: 2064, 1996: 2065, 1997: 2066, 1998: 2067, 1999: 2068, 2000: 2069, 2001: 2070, 2002: 2071, 2003: 2072, 2004: 2073, 2005: 2074, 2006: 2075, 2007: 2076, 2008: 2077, 2009: 2078, 2010: 2079, 2011: 2080, 2012: 2081, 2013: 2082, 2014: 2083, 2015: 2084, 2016: 2085, 2017: 2086, 2018: 2087, 2019: 2088, 2020: 2089, 2021: 2090, 2022: 2091, 2023: 2092, 2024: 2093, 2025: 2094, 2026: 2095, 2027: 2096, 2028: 2097, 2029: 2098, 2030: 2099, 2031: 2100, 2032: 2101, 2033: 2102, 2034: 2103, 2035: 2104, 2036: 2105, 2037: 2106, 2038: 2107, 2039: 2108, 2040: 2109, 2041: 2110, 2042: 2111, 2043: 2112, 2044: 2113, 2045: 2114, 2046: 2115, 2047: 2116, 2048: 2117, 2049: 2118, 2050: 2119, 2051: 2120, 2052: 2121, 2053: 2122, 2054: 2123, 2055: 2124, 2056: 2125, 2057: 2126, 2058: 2127, 2059: 2128, 2060: 2129, 2061: 2130, 2062: 2131, 2063: 2132, 2064: 2133, 2065: 2134, 2066: 2135, 2067: 2136, 2068: 2137, 2069: 2138, 2070: 2139, 2071: 2140, 2072: 2141, 2073: 2142, 2074: 2143, 2075: 2144, 2076: 2145, 2077: 2146, 2078: 2147, 2079: 2148, 2080: 2149, 2081: 2150, 2082: 2151, 2083: 2152, 2084: 2153, 2085: 2154, 2086: 2155, 2087: 2156, 2088: 2157, 2089: 2158, 2090: 2159, 2091: 2160, 2092: 2161, 2093: 2162, 2094: 2163, 2095: 2164, 2096: 2165, 2097: 2166, 2098: 2167, 2099: 2168, 2100: 2169, 2101: 2170, 2102: 2171, 2103: 2172, 2104: 2173, 2105: 2174, 2106: 2175, 2107: 2176, 2108: 2177, 2109: 2178, 2110: 2179, 2111: 2180, 2112: 2181, 2113: 2182, 2114: 2183, 2115: 2184, 2116: 2185, 2117: 2186, 2118: 2187, 2119: 2188, 2120: 2189, 2121: 2190, 2122: 2191, 2123: 2192, 2124: 2193, 2125: 2194, 2126: 2195, 2127: 2196, 2128: 2197, 2129: 2198, 2130: 2199, 2131: 2200, 2132: 2201, 2133: 2202, 2134: 2203, 2135: 2204, 2136: 2205, 2137: 2206, 2138: 2207, 2139: 2208, 2140: 2209, 2141: 2210, 2142: 2211, 2143: 2212, 2144: 2213, 2145: 2214, 2146: 2215, 2147: 2216, 2148: 2217, 2149: 2218, 2150: 2219, 2151: 2220, 2152: 2221, 2153: 2222, 2154: 2223, 2155: 2224, 2156: 2225, 2157: 2226, 2158: 2227, 2159: 2228, 2160: 2229, 2161: 2230, 2162: 2231, 2163: 2232, 2164: 2233, 2165: 2234, 2166: 2235, 2167: 2236, 2168: 2237, 2169: 2238, 2170: 2239, 2171: 2240, 2172: 2241, 2173: 2242, 2174: 2243, 2175: 2244, 2176: 2245, 2177: 2246, 2178: 2247, 2179: 2248, 2180: 2249, 2181: 2250, 2182: 2251, 2183: 2252, 2184: 2253, 2185: 2254, 2186: 2255, 2187: 2256, 2188: 2257, 2189: 2258, 2190: 2259, 2191: 2260, 2192: 2261, 2193: 2262, 2194: 2263, 2195: 2264, 2196: 2265, 2197: 2266, 2198: 2267, 2199: 2268, 2200: 2269, 2201: 2270, 2202: 2271, 2203: 2272, 2204: 2273, 2205: 2274, 2206: 2275, 2207: 2276, 2208: 2277, 2209: 2278, 2210: 2279, 2211: 2280, 2212: 2281, 2213: 2282, 2214: 2283, 2215: 2284, 2216: 2285, 2217: 2286, 2218: 2287, 2219: 2288, 2220: 2289, 2221: 2290, 2222: 2291, 2223: 2292, 2224: 2293, 2225: 2294, 2226: 2295, 2227: 2296, 2228: 2297, 2229: 2298, 2230: 2299, 2231: 2300, 2232: 2301, 2233: 2302, 2234: 2303, 2235: 2304, 2236: 2305, 2237: 2306, 2238: 2307, 2239: 2308, 2240: 2309, 2241: 2310, 2242: 2311, 2243: 2312, 2244: 2313, 2245: 2314, 2246: 2315, 2247: 2316, 2248: 2317, 2249: 2318, 2250: 2319, 2251: 2320, 2252: 2321, 2253: 2322, 2254: 2323, 2255: 2324, 2256: 2325, 2257: 2326, 2258: 2327, 2259: 2328, 2260: 2329, 2261: 2330, 2262: 2331, 2263: 2332, 2264: 2333, 2265: 2334, 2266: 2335, 2267: 2336, 2268: 2337, 2269: 2338, 2270: 2339, 2271: 2340, 2272: 2341, 2273: 2342, 2274: 2343, 2275: 2344, 2276: 2345, 2277: 2346, 2278: 2347, 2279: 2348, 2280: 2349, 2281: 2350, 2282: 2351, 2283: 2352, 2284: 2353, 2285: 2354, 2286: 2355, 2287: 2356, 2288: 2357, 2289: 2358, 2290: 2359, 2291: 2360, 2292: 2361, 2293: 2362, 2294: 2363, 2295: 2364, 2296: 2365, 2297: 2366, 2298: 2367, 2299: 2368, 2300: 2369, 2301: 2370, 2302: 2371, 2303: 2372, 2304: 2373, 2305: 2374, 2306: 2375, 2307: 2376, 2308: 2377, 2309: 2378, 2310: 2379, 2311: 2380, 2312: 2381, 2313: 2382, 2314: 2383, 2315: 2384, 2316: 2385, 2317: 2386, 2318: 2387, 2319: 2388, 2320: 2389, 2321: 2390, 2322: 2391, 2323: 2392, 2324: 2393, 2325: 2394, 2326: 2395, 2327: 2396, 2328: 2397, 2329: 2398, 2330: 2399, 2331: 2400, 2332: 2401, 2333: 2402, 2334: 2403, 2335: 2404, 2336: 2405, 2337: 2406, 2338: 2407, 2339: 2408, 2340: 2409, 2341: 2410, 2342: 2411, 2343: 2412, 2344: 2413, 2345: 2414, 2346: 2415, 2347: 2416, 2348: 2417, 2349: 2418, 2350: 2419, 2351: 2420, 2352: 2421, 2353: 2422, 2354: 2423, 2355: 2424, 2356: 2425, 2357: 2426, 2358: 2427, 2359: 2428, 2360: 2429, 2361: 2430, 2362: 2431, 2363: 2432, 2364: 2433, 2365: 2434, 2366: 2435, 2367: 2436, 2368: 2437, 2369: 2438, 2370: 2439, 2371: 2440, 2372: 2441, 2373: 2442, 2374: 2443, 2375: 2444, 2376: 2445, 2377: 2446, 2378: 2447, 2379: 2448, 2380: 2449, 2381: 2450, 2382: 2451, 2383: 2452, 2384: 2453, 2385: 2454, 2386: 2455, 2387: 2456, 2388: 2457, 2389: 2458, 2390: 2459, 2391: 2460, 2392: 2461, 2393: 2462, 2394: 2463, 2395: 2464, 2396: 2465, 2397: 2466, 2398: 2467, 2399: 2468, 2400: 2469, 2401: 2470, 2402: 2471, 2403: 2472, 2404: 2473, 2405: 2474, 2406: 2475, 2407: 2476, 2408: 2477, 2409: 2478, 2410: 2479, 2411: 2480, 2412: 2481, 2413: 2482, 2414: 2483, 2415: 2484, 2416: 2485, 2417: 2486, 2418: 2487, 2419: 2488, 2420: 2489, 2421: 2490, 2422: 2491, 2423: 2492, 2424: 2493, 2425: 2494, 2426: 2495, 2427: 2496, 2428: 2497, 2429: 2498, 2430: 2499, 2431: 2500, 2432: 2501, 2433: 2502, 2434: 2503, 2435: 2504, 2436: 2505, 2437: 2506, 2438: 2507, 2439: 2508, 2440: 2509, 2441: 2510, 2442: 2511, 2443: 2512, 2444: 2513, 2445: 2514, 2446: 2515, 2447: 2516, 2448: 2517, 2449: 2518, 2450: 2519, 2451: 2520, 2452: 2521, 2453: 2522, 2454: 2523, 2455: 2524, 2456: 2525, 2457: 2526, 2458: 2527, 2459: 2528, 2460: 2529, 2461: 2530, 2462: 2531, 2463: 2532, 2464: 2533, 2465: 2534, 2466: 2535, 2467: 2536, 2468: 2537, 2469: 2538, 2470: 2539, 2471: 2540, 2472: 2541, 2473: 2542, 2474: 2543, 2475: 2544, 2476: 2545, 2477: 2546, 2478: 2547, 2479: 2548, 2480: 2549, 2481: 2550, 2482: 2551, 2483: 2552, 2484: 2553, 2485: 2554, 2486: 2555, 2487: 2556, 2488: 2557, 2489: 2558, 2490: 2559, 2491: 2560, 2492: 2561, 2493: 2562, 2494: 2563, 2495: 2564, 2496: 2565, 2497: 2566, 2498: 2567, 2499: 2568, 2500: 2569, 2501: 2570, 2502: 2571, 2503: 2572, 2504: 2573, 2505: 2574, 2506: 2575, 2507: 2576, 2508: 2577, 2509: 2578, 2510: 2579, 2511: 2580, 2512: 2581, 2513: 2582, 2514: 2583, 2515: 2584, 2516: 2585, 2517: 2586, 2518: 2587, 2519: 2588, 2520: 2589, 2521: 2590, 2522: 2591, 2523: 2592, 2524: 2593, 2525: 2594, 2526: 2595, 2527: 2596, 2528: 2597, 2529: 2598, 2530: 2599, 2531: 2600, 2532: 2601, 2533: 2602, 2534: 2603, 2535: 2604, 2536: 2605, 2537: 2606, 2538: 2607, 2539: 2608, 2540: 2609, 2541: 2610, 2542: 2611, 2543: 2612, 2544: 2613, 2545: 2614, 2546: 2615, 2547: 2616, 2548: 2617, 2549: 2618, 2550: 2619, 2551: 2620, 2552: 2621, 2553: 2622, 2554: 2623, 2555: 2624, 2556: 2625, 2557: 2626, 2558: 2627, 2559: 2628, 2560: 2629, 2561: 2630, 2562: 2631, 2563: 2632, 2564: 2633, 2565: 2634, 2566: 2635, 2567: 2636, 2568: 2637, 2569: 2638, 2570: 2639, 2571: 2640, 2572: 2641, 2573: 2642, 2574: 2643, 2575: 2644, 2576: 2645, 2577: 2646, 2578: 2647, 2579: 2648, 2580: 2649, 2581: 2650, 2582: 2651, 2583: 2652, 2584: 2653, 2585: 2654, 2586: 2655, 2587: 2656, 2588: 2657, 2589: 2658, 2590: 2659, 2591: 2660, 2592: 2661, 2593: 2662, 2594: 2663, 2595: 2664, 2596: 2665, 2597: 2666, 2598: 2667, 2599: 2668, 2600: 2669, 2601: 2670, 2602: 2671, 2603: 2672, 2604: 2673, 2605: 2674, 2606: 2675, 2607: 2676, 2608: 2677, 2609: 2678, 2610: 2679, 2611: 2680, 2612: 2681, 2613: 2682, 2614: 2683, 2615: 2684, 2616: 2685, 2617: 2686, 2618: 2687, 2619: 2688, 2620: 2689, 2621: 2690, 2622: 2691, 2623: 2692, 2624: 2693, 2625: 2694, 2626: 2695, 2627: 2696, 2628: 2697, 2629: 2698, 2630: 2699, 2631: 2700, 2632: 2701, 2633: 2702, 2634: 2703, 2635: 2704, 2636: 2705, 2637: 2706, 2638: 2707, 2639: 2708, 2640: 2709, 2641: 2710, 2642: 2711, 2643: 2712, 2644: 2713, 2645: 2714, 2646: 2715, 2647: 2716, 2648: 2717, 2649: 2718, 2650: 2719, 2651: 2720, 2652: 2721, 2653: 2722, 2654: 2723, 2655: 2724, 2656: 2725, 2657: 2726, 2658: 2727, 2659: 2728, 2660: 2729, 2661: 2730, 2662: 2731, 2663: 2732, 2664: 2733, 2665: 2734, 2666: 2735, 2667: 2736, 2668: 2737, 2669: 2738, 2670: 2739, 2671: 2740, 2672: 2741, 2673: 2742, 2674: 2743, 2675: 2744, 2676: 2745, 2677: 2746, 2678: 2747, 2679: 2748, 2680: 2749, 2681: 2750, 2682: 2751, 2683: 2752, 2684: 2753, 2685: 2754, 2686: 2755, 2687: 2756, 2688: 2757, 2689: 2758, 2690: 2759, 2691: 2760, 2692: 2761, 2693: 2762, 2694: 2763, 2695: 2764, 2696: 2765, 2697: 2766, 2698: 2767, 2699: 2768, 2700: 2769, 2701: 2770, 2702: 2771, 2703: 2772, 2704: 2773, 2705: 2774, 2706: 2775, 2707: 2776, 2708: 2777, 2709: 2778, 2710: 2779, 2711: 2780, 2712: 2781, 2713: 2782, 2714: 2783, 2715: 2784, 2716: 2785, 2717: 2786, 2718: 2787, 2719: 2788, 2720: 2789, 2721: 2790, 2722: 2791, 2723: 2792, 2724: 2793, 2725: 2794, 2726: 2795, 2727: 2796, 2728: 2797, 2729: 2798, 2730: 2799, 2731: 2800, 2732: 2801, 2733: 2802, 2734: 2803, 2735: 2804, 2736: 2805, 2737: 2806, 2738: 2807, 2739: 2808, 2740: 2809, 2741: 2810, 2742: 2811, 2743: 2812, 2744: 2813, 2745: 2814, 2746: 2815, 2747: 2816, 2748: 2817, 2749: 2818, 2750: 2819, 2751: 2820, 2752: 2821, 2753: 2822, 2754: 2823, 2755: 2824, 2756: 2825, 2757: 2826, 2758: 2827, 2759: 2828, 2760: 2829, 2761: 2830, 2762: 2831, 2763: 2832, 2764: 2833, 2765: 2834, 2766: 2835, 2767: 2836, 2768: 2837, 2769: 2838, 2770: 2839, 2771: 2840, 2772: 2841, 2773: 2842, 2774: 2843, 2775: 2844, 2776: 2845, 2777: 2846, 2778: 2847, 2779: 2848, 2780: 2849, 2781: 2850, 2782: 2851, 2783: 2852, 2784: 2853, 2785: 2854, 2786: 2855, 2787: 2856, 2788: 2857, 2789: 2858, 2790: 2859, 2791: 2860, 2792: 2861, 2793: 2862, 2794: 2863, 2795: 2864, 2796: 2865, 2797: 2866, 2798: 2867, 2799: 2868, 2800: 2869, 2801: 2870, 2802: 2871, 2803: 2872, 2804: 2873, 2805: 2874, 2806: 2875, 2807: 2876, 2808: 2877, 2809: 2878, 2810: 2879, 2811: 2880, 2812: 2881, 2813: 2882, 2814: 2883, 2815: 2884, 2816: 2885, 2817: 2886, 2818: 2887, 2819: 2888, 2820: 2889, 2821: 2890, 2822: 2891, 2823: 2892, 2824: 2893, 2825: 2894, 2826: 2895, 2827: 2896, 2828: 2897, 2829: 2898, 2830: 2899, 2831: 2900, 2832: 2901, 2833: 2902, 2834: 2903, 2835: 2904, 2836: 2905, 2837: 2906, 2838: 2907, 2839: 2908, 2840: 2909, 2841: 2910, 2842: 2911, 2843: 2912, 2844: 2913, 2845: 2914, 2846: 2915, 2847: 2916, 2848: 2917, 2849: 2918, 2850: 2919, 2851: 2920, 2852: 2921, 2853: 2922, 2854: 2923, 2855: 2924, 2856: 2925, 2857: 2926, 2858: 2927, 2859: 2928, 2860: 2929, 2861: 2930, 2862: 2931, 2863: 2932, 2864: 2933, 2865: 2934, 2866: 2935, 2867: 2936, 2868: 2937, 2869: 2938, 2870: 2939, 2871: 2940, 2872: 2941, 2873: 2942, 2874: 2943, 2875: 2944, 2876: 2945, 2877: 2946, 2878: 2947, 2879: 2948, 2880: 2949, 2881: 2950, 2882: 2951, 2883: 2952, 2884: 2953, 2885: 2954, 2886: 2955, 2887: 2956, 2888: 2957, 2889: 2958, 2890: 2959, 2891: 2960, 2892: 2961, 2893: 2962, 2894: 2963, 2895: 2964, 2896: 2965, 2897: 2966, 2898: 2967, 2899: 2968, 2900: 2969, 2901: 2970, 2902: 2971, 2903: 2972, 2904: 2973, 2905: 2974, 2906: 2975, 2907: 2976, 2908: 2977, 2909: 2978, 2910: 2979, 2911: 2980, 2912: 2981, 2913: 2982, 2914: 2983, 2915: 2984, 2916: 2985, 2917: 2986, 2918: 2987, 2919: 2988, 2920: 2989, 2921: 2990, 2922: 2991, 2923: 2992, 2924: 2993, 2925: 2994, 2926: 2995, 2927: 2996, 2928: 2997, 2929: 2998, 2930: 2999, 2931: 3000, 2932: 3001, 2933: 3002, 2934: 3003, 2935: 3004, 2936: 3005, 2937: 3006, 2938: 3007, 2939: 3008, 2940: 3009, 2941: 3010, 2942: 3011, 2943: 3012, 2944: 3013, 2945: 3014, 2946: 3015, 2947: 3016, 2948: 3017, 2949: 3018, 2950: 3019, 2951: 3020, 2952: 3021, 2953: 3022, 2954: 3023, 2955: 3024, 2956: 3025, 2957: 3026, 2958: 3027, 2959: 3028, 2960: 3029, 2961: 3030, 2962: 3031, 2963: 3032, 2964: 3033, 2965: 3034, 2966: 3035, 2967: 3036, 2968: 3037, 2969: 3038, 2970: 3039, 2971: 3040, 2972: 3041, 2973: 3042, 2974: 3043, 2975: 3044, 2976: 3045, 2977: 3046, 2978: 3047, 2979: 3048, 2980: 3049, 2981: 3050, 2982: 3051, 2983: 3052, 2984: 3053, 2985: 3054, 2986: 3055, 2987: 3056, 2988: 3057, 2989: 3058, 2990: 3059, 2991: 3060, 2992: 3061, 2993: 3062, 2994: 3063, 2995: 3064, 2996: 3065, 2997: 3066, 2998: 3067, 2999: 3068, 3000: 3069, 3001: 3070, 3002: 3071, 3003: 3072, 3004: 3073, 3005: 3074, 3006: 3075, 3007: 3076, 3008: 3077, 3009: 3078, 3010: 3079, 3011: 3080, 3012: 3081, 3013: 3082, 3014: 3083, 3015: 3084, 3016: 3085, 3017: 3086, 3018: 3087, 3019: 3088, 3020: 3089, 3021: 3090, 3022: 3091, 3023: 3092, 3024: 3093, 3025: 3094, 3026: 3095, 3027: 3096, 3028: 3097, 3029: 3098, 3030: 3099, 3031: 3100, 3032: 3101, 3033: 3102, 3034: 3103, 3035: 3104, 3036: 3105, 3037: 3106, 3038: 3107, 3039: 3108, 3040: 3109, 3041: 3110, 3042: 3111, 3043: 3112, 3044: 3113, 3045: 3114, 3046: 3115, 3047: 3116, 3048: 3117, 3049: 3118, 3050: 3119, 3051: 3120, 3052: 3121, 3053: 3122, 3054: 3123, 3055: 3124, 3056: 3125, 3057: 3126, 3058: 3127, 3059: 3128, 3060: 3129, 3061: 3130, 3062: 3131, 3063: 3132, 3064: 3133, 3065: 3134, 3066: 3135, 3067: 3136, 3068: 3137, 3069: 3138, 3070: 3139, 3071: 3140, 3072: 3141, 3073: 3142, 3074: 3143, 3075: 3144, 3076: 3145, 3077: 3146, 3078: 3147, 3079: 3148, 3080: 3149, 3081: 3150, 3082: 3151, 3083: 3152, 3084: 3153, 3085: 3154, 3086: 3155, 3087: 3156, 3088: 3157, 3089: 3158, 3090: 3159, 3091: 3160, 3092: 3161, 3093: 3162, 3094: 3163, 3095: 3164, 3096: 3165, 3097: 3166, 3098: 3167, 3099: 3168, 3100: 3169, 3101: 3170, 3102: 3171, 3103: 3172, 3104: 3173, 3105: 3174, 3106: 3175, 3107: 3176, 3108: 3177, 3109: 3178, 3110: 3179, 3111: 3180, 3112: 3181, 3113: 3182, 3114: 3183, 3115: 3184, 3116: 3185, 3117: 3186, 3118: 3187, 3119: 3188, 3120: 3189, 3121: 3190, 3122: 3191, 3123: 3192, 3124: 3193, 3125: 3194, 3126: 3195, 3127: 3196, 3128: 3197, 3129: 3198, 3130: 3199, 3131: 3200, 3132: 3201, 3133: 3202, 3134: 3203, 3135: 3204, 3136: 3205, 3137: 3206, 3138: 3207, 3139: 3208, 3140: 3209, 3141: 3210, 3142: 3211, 3143: 3212, 3144: 3213, 3145: 3214, 3146: 3215, 3147: 3216, 3148: 3217, 3149: 3218, 3150: 3219, 3151: 3220, 3152: 3221, 3153: 3222, 3154: 3223, 3155: 3224, 3156: 3225, 3157: 3226, 3158: 3227, 3159: 3228, 3160: 3229, 3161: 3230, 3162: 3231, 3163: 3232, 3164: 3233, 3165: 3234, 3166: 3235, 3167: 3236, 3168: 3237, 3169: 3238, 3170: 3239, 3171: 3240, 3172: 3241, 3173: 3242, 3174: 3243, 3175: 3244, 3176: 3245, 3177: 3246, 3178: 3247, 3179: 3248, 3180: 3249, 3181: 3250, 3182: 3251, 3183: 3252, 3184: 3253, 3185: 3254, 3186: 3255, 3187: 3256, 3188: 3257, 3189: 3258, 3190: 3259, 3191: 3260, 3192: 3261, 3193: 3262, 3194: 3263, 3195: 3264, 3196: 3265, 3197: 3266, 3198: 3267, 3199: 3268, 3200: 3269, 3201: 3270, 3202: 3271, 3203: 3272, 3204: 3273, 3205: 3274, 3206: 3275, 3207: 3276, 3208: 3277, 3209: 3278, 3210: 3279, 3211: 3280, 3212: 3281, 3213: 3282, 3214: 3283, 3215: 3284, 3216: 3285, 3217: 3286, 3218: 3287, 3219: 3288, 3220: 3289, 3221: 3290, 3222: 3291, 3223: 3292, 3224: 3293, 3225: 3294, 3226: 3295, 3227: 3296, 3228: 3297, 3229: 3298, 3230: 3299, 3231: 3300, 3232: 3301, 3233: 3302, 3234: 3303, 3235: 3304, 3236: 3305, 3237: 3306, 3238: 3307, 3239: 3308, 3240: 3309, 3241: 3310, 3242: 3311, 3243: 3312, 3244: 3313, 3245: 3314, 3246: 3315, 3247: 3316, 3248: 3317, 3249: 3318, 3250: 3319, 3251: 3320, 3252: 3321, 3253: 3322, 3254: 3323, 3255: 3324, 3256: 3325, 3257: 3326, 3258: 3327, 3259: 3328, 3260: 3329, 3261: 3330, 3262: 3331, 3263: 3332, 3264: 3333, 3265: 3334, 3266: 3335, 3267: 3336, 3268: 3337, 3269: 3338, 3270: 3339, 3271: 3340, 3272: 3341, 3273: 3342, 3274: 3343, 3275: 3344, 3276: 3345, 3277: 3346, 3278: 3347, 3279: 3348, 3280: 3349, 3281: 3350, 3282: 3351, 3283: 3352, 3284: 3353, 3285: 3354, 3286: 3355, 3287: 3356, 3288: 3357, 3289: 3358, 3290: 3359, 3291: 3360, 3292: 3361, 3293: 3362, 3294: 3363, 3295: 3364, 3296: 3365, 3297: 3366, 3298: 3367, 3299: 3368, 3300: 3369, 3301: 3370, 3302: 3371, 3303: 3372, 3304: 3373, 3305: 3374, 3306: 3375, 3307: 3376, 3308: 3377, 3309: 3378, 3310: 3379, 3311: 3380, 3312: 3381, 3313: 3382, 3314: 3383, 3315: 3384, 3316: 3385, 3317: 3386, 3318: 3387, 3319: 3388, 3320: 3389, 3321: 3390, 3322: 3391, 3323: 3392, 3324: 3393, 3325: 3394, 3326: 3395, 3327: 3396, 3328: 3397, 3329: 3398, 3330: 3399, 3331: 3400, 3332: 3401, 3333: 3402, 3334: 3403, 3335: 3404, 3336: 3405, 3337: 3406, 3338: 3407, 3339: 3408, 3340: 3409, 3341: 3410, 3342: 3411, 3343: 3412, 3344: 3413, 3345: 3414, 3346: 3415, 3347: 3416, 3348: 3417, 3349: 3418, 3350: 3419, 3351: 3420, 3352: 3421, 3353: 3422, 3354: 3423, 3355: 3424, 3356: 3425, 3357: 3426, 3358: 3427, 3359: 3428, 3360: 3429, 3361: 3430, 3362: 3431, 3363: 3432, 3364: 3433, 3365: 3434, 3366: 3435, 3367: 3436, 3368: 3437, 3369: 3438, 3370: 3439, 3371: 3440, 3372: 3441, 3373: 3442, 3374: 3443, 3375: 3444, 3376: 3445, 3377: 3446, 3378: 3447, 3379: 3448, 3380: 3449, 3381: 3450, 3382: 3451, 3383: 3452, 3384: 3453, 3385: 3454, 3386: 3455, 3387: 3456, 3388: 3457, 3389: 3458, 3390: 3459, 3391: 3460, 3392: 3461, 3393: 3462, 3394: 3463, 3395: 3464, 3396: 3465, 3397: 3466, 3398: 3467, 3399: 3468, 3400: 3469, 3401: 3470, 3402: 3471, 3403: 3472, 3404: 3473, 3405: 3474, 3406: 3475, 3407: 3476, 3408: 3477, 3409: 3478, 3410: 3479, 3411: 3480, 3412: 3481, 3413: 3482, 3414: 3483, 3415: 3484, 3416: 3485, 3417: 3486, 3418: 3487, 3419: 3488, 3420: 3489, 3421: 3490, 3422: 3491, 3423: 3492, 3424: 3493, 3425: 3494, 3426: 3495, 3427: 3496, 3428: 3497, 3429: 3498, 3430: 3499, 3431: 3500, 3432: 3501, 3433: 3502, 3434: 3503, 3435: 3504, 3436: 3505, 3437: 3506, 3438: 3507, 3439: 3508, 3440: 3509, 3441: 3510, 3442: 3511, 3443: 3512, 3444: 3513, 3445: 3514, 3446: 3515, 3447: 3516, 3448: 3517, 3449: 3518, 3450: 3519, 3451: 3520, 3452: 3521, 3453: 3522, 3454: 3523, 3455: 3524, 3456: 3525, 3457: 3526, 3458: 3527, 3459: 3528, 3460: 3529, 3461: 3530, 3462: 3531, 3463: 3532, 3464: 3533, 3465: 3534, 3466: 3535, 3467: 3536, 3468: 3537, 3469: 3538, 3470: 3539, 3471: 3540, 3472: 3541, 3473: 3542, 3474: 3543, 3475: 3544, 3476: 3545, 3477: 3546, 3478: 3547, 3479: 3548, 3480: 3549, 3481: 3550, 3482: 3551, 3483: 3552, 3484: 3553, 3485: 3554, 3486: 3555, 3487: 3556, 3488: 3557, 3489: 3558, 3490: 3559, 3491: 3560, 3492: 3561, 3493: 3562, 3494: 3563, 3495: 3564, 3496: 3565, 3497: 3566, 3498: 3567, 3499: 3568, 3500: 3569, 3501: 3570, 3502: 3571, 3503: 3572, 3504: 3573, 3505: 3574, 3506: 3575, 3507: 3576, 3508: 3577, 3509: 3578, 3510: 3579, 3511: 3580, 3512: 3581, 3513: 3582, 3514: 3583, 3515: 3584, 3516: 3585, 3517: 3586, 3518: 3587, 3519: 3588, 3520: 3589, 3521: 3590, 3522: 3591, 3523: 3592, 3524: 3593, 3525: 3594, 3526: 3595, 3527: 3596, 3528: 3597, 3529: 3598, 3530: 3599, 3531: 3600, 3532: 3601, 3533: 3602, 3534: 3603, 3535: 3604, 3536: 3605, 3537: 3606, 3538: 3607, 3539: 3608, 3540: 3609, 3541: 3610, 3542: 3611, 3543: 3612, 3544: 3613, 3545: 3614, 3546: 3615, 3547: 3616, 3548: 3617, 3549: 3618, 3550: 3619, 3551: 3620, 3552: 3621, 3553: 3622, 3554: 3623, 3555: 3624, 3556: 3625, 3557: 3626, 3558: 3627, 3559: 3628, 3560: 3629, 3561: 3630, 3562: 3631, 3563: 3632, 3564: 3633, 3565: 3634, 3566: 3635, 3567: 3636, 3568: 3637, 3569: 3638, 3570: 3639, 3571: 3640, 3572: 3641, 3573: 3642, 3574: 3643, 3575: 3644, 3576: 3645, 3577: 3646, 3578: 3647, 3579: 3648, 3580: 3649, 3581: 3650, 3582: 3651, 3583: 3652, 3584: 3653, 3585: 3654, 3586: 3655, 3587: 3656, 3588: 3657, 3589: 3658, 3590: 3659, 3591: 3660, 3592: 3661, 3593: 3662, 3594: 3663, 3595: 3664, 3596: 3665, 3597: 3666, 3598: 3667, 3599: 3668, 3600: 3669, 3601: 3670, 3602: 3671, 3603: 3672, 3604: 3673, 3605: 3674, 3606: 3675, 3607: 3676, 3608: 3677, 3609: 3678, 3610: 3679, 3611: 3680, 3612: 3681, 3613: 3682, 3614: 3683, 3615: 3684, 3616: 3685, 3617: 3686, 3618: 3687, 3619: 3688, 3620: 3689, 3621: 3690, 3622: 3691, 3623: 3692, 3624: 3693, 3625: 3694, 3626: 3695, 3627: 3696, 3628: 3697, 3629: 3698, 3630: 3699, 3631: 3700, 3632: 3701, 3633: 3702, 3634: 3703, 3635: 3704, 3636: 3705, 3637: 3706, 3638: 3707, 3639: 3708, 3640: 3709, 3641: 3710, 3642: 3711, 3643: 3712, 3644: 3713, 3645: 3714, 3646: 3715, 3647: 3716, 3648: 3717, 3649: 3718, 3650: 3719, 3651: 3720, 3652: 3721, 3653: 3722, 3654: 3723, 3655: 3724, 3656: 3725, 3657: 3726, 3658: 3727, 3659: 3728, 3660: 3729, 3661: 3730, 3662: 3731, 3663: 3732, 3664: 3733, 3665: 3734, 3666: 3735, 3667: 3736, 3668: 3737, 3669: 3738, 3670: 3739, 3671: 3740, 3672: 3741, 3673: 3742, 3674: 3743, 3675: 3744, 3676: 3745, 3677: 3746, 3678: 3747, 3679: 3748, 3680: 3749, 3681: 3750, 3682: 3751, 3683: 3752, 3684: 3753, 3685: 3754, 3686: 3755, 3687: 3756, 3688: 3757, 3689: 3758, 3690: 3759, 3691: 3760, 3692: 3761, 3693: 3762, 3694: 3763, 3695: 3764, 3696: 3765, 3697: 3766, 3698: 3767, 3699: 3768, 3700: 3769, 3701: 3770, 3702: 3771, 3703: 3772, 3704: 3773, 3705: 3774, 3706: 3775, 3707: 3776, 3708: 3777, 3709: 3778, 3710: 3779, 3711: 3780, 3712: 3781, 3713: 3782, 3714: 3783, 3715: 3784, 3716: 3785, 3717: 3786, 3718: 3787, 3719: 3788, 3720: 3789, 3721: 3790, 3722: 3791, 3723: 3792, 3724: 3793, 3725: 3794, 3726: 3795, 3727: 3796, 3728: 3797, 3729: 3798, 3730: 3799, 3731: 3800, 3732: 3801, 3733: 3802, 3734: 3803, 3735: 3804, 3736: 3805, 3737: 3806, 3738: 3807, 3739: 3808, 3740: 3809, 3741: 3810, 3742: 3811, 3743: 3812, 3744: 3813, 3745: 3814, 3746: 3816, 3747: 3817, 3748: 3818, 3749: 3819, 3750: 3820, 3751: 3821, 3752: 3822, 3753: 3823, 3754: 3824, 3755: 3825, 3756: 3826, 3757: 3827, 3758: 3828, 3759: 3829, 3760: 3830, 3761: 3831, 3762: 3832, 3763: 3833, 3764: 3834, 3765: 3835, 3766: 3836, 3767: 3837, 3768: 3838, 3769: 3839, 3770: 3840, 3771: 3841, 3772: 3842, 3773: 3843, 3774: 3844, 3775: 3845, 3776: 3846, 3777: 3847, 3778: 3848, 3779: 3849, 3780: 3850, 3781: 3851, 3782: 3852, 3783: 3853, 3784: 3854, 3785: 3855, 3786: 3856, 3787: 3857, 3788: 3858, 3789: 3859, 3790: 3860, 3791: 3861, 3792: 3862, 3793: 3863, 3794: 3864, 3795: 3865, 3796: 3866, 3797: 3867, 3798: 3868, 3799: 3869, 3800: 3870, 3801: 3871, 3802: 3872, 3803: 3873, 3804: 3874, 3805: 3875, 3806: 3876, 3807: 3877, 3808: 3878, 3809: 3879, 3810: 3880, 3811: 3881, 3812: 3882, 3813: 3883, 3814: 3884, 3815: 3885, 3816: 3886, 3817: 3887, 3818: 3888, 3819: 3889, 3820: 3890, 3821: 3891, 3822: 3892, 3823: 3893, 3824: 3894, 3825: 3895, 3826: 3896, 3827: 3897, 3828: 3898, 3829: 3899, 3830: 3900, 3831: 3901, 3832: 3902, 3833: 3903, 3834: 3904, 3835: 3905, 3836: 3906, 3837: 3907, 3838: 3908, 3839: 3909, 3840: 3910, 3841: 3911, 3842: 3912, 3843: 3913, 3844: 3914, 3845: 3915, 3846: 3916, 3847: 3917, 3848: 3918, 3849: 3919, 3850: 3920, 3851: 3921, 3852: 3922, 3853: 3923, 3854: 3924, 3855: 3925, 3856: 3926, 3857: 3927, 3858: 3928, 3859: 3929, 3860: 3930, 3861: 3931, 3862: 3932, 3863: 3933, 3864: 3934, 3865: 3935, 3866: 3936, 3867: 3937, 3868: 3938, 3869: 3939, 3870: 3940, 3871: 3941, 3872: 3942, 3873: 3943, 3874: 3944, 3875: 3945, 3876: 3946, 3877: 3947, 3878: 3948, 3879: 3949, 3880: 3950, 3881: 3951, 3882: 3952}}\n" + ] + } + ], + "source": [ + "print(tokenizer.query_id_encoder.mapping, tokenizer.query_id_encoder.inverse_mapping)\n", + "print(tokenizer.item_id_encoder.mapping, tokenizer.item_id_encoder.inverse_mapping)" + ] + }, + { + "metadata": {}, + "cell_type": "markdown", + "source": "### Load LLM-generated profiles for the dataset (should be precalculated)" + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": [ + "from replay.models.nn.sequential.sasrec_with_llm.utils import load_user_profile_embeddings\n", + "\n", + "USER_PROFILE_EMBEDDINGS_PATH = \"path_to_user_profile_embeddings\" # set the path to precalculated embeddings of user profiles\n", + "\n", + "user_profile_embeddings, existing_profile_binary_mask = \\\n", + " load_user_profile_embeddings(USER_PROFILE_EMBEDDINGS_PATH,\n", + " tokenizer.query_id_encoder.inverse_mapping['user_id'])\n", + "\n", + "print(f\"Number of users without profiles: {existing_profile_binary_mask[~existing_profile_binary_mask].size(0)}\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Train model with LLM-generated profiles\n", + "### Create SASRec model instance and run the training stage using lightning\n", + "After each epoch validation metrics are shown. You can change the list of validation metrics in ValidationMetricsCallback\n", + "The model is determined to be the best and is saved if the metric updates its maximum during validation (see the ModelCheckpoint)" + ] + }, + { + "metadata": {}, + "cell_type": "code", + "outputs": [], + "execution_count": null, + "source": [ + "MAX_SEQ_LEN = 200\n", + "BATCH_SIZE = 512\n", + "NUM_WORKERS = 4\n", + "MAX_EPOCHS = 5\n", + "PROFILE_DISTIL_EPOCHS = 3 # number of epochs for profile distillation\n", + "\n", + "model = SasRecLLM(\n", + " tensor_schema,\n", + " profile_emb_dim=user_profile_embeddings.size(-1),\n", + " block_count=2,\n", + " head_count=2,\n", + " max_seq_len=MAX_SEQ_LEN,\n", + " hidden_size=300,\n", + " dropout_rate=0.5,\n", + " optimizer_factory=FatOptimizerFactory(learning_rate=0.001),\n", + " scale_guide_loss=True,\n", + " alpha=0.8,\n", + " profile_distil_epochs=PROFILE_DISTIL_EPOCHS,\n", + " reconstruction_layer = -1,\n", + " weighting_scheme = 'mean',\n", + " use_down_scale = True,\n", + " use_upscale = False,\n", + " weight_scale = None,\n", + " multi_profile = False,\n", + " multi_profile_aggr_scheme = 'mean'\n", + ")\n", + "csv_logger = CSVLogger(save_dir=\".logs/train\", name=\"SASRec_example\")\n", + "\n", + "checkpoint_callback = ModelCheckpoint(\n", + " dirpath=\".checkpoints\",\n", + " save_top_k=1,\n", + " verbose=True,\n", + " # if you use multiple dataloaders, then add the serial number of the dataloader to the suffix of the metric name.\n", + " # For example,\"recall@10/dataloader_idx_0\"\n", + " monitor=\"recall@10\",\n", + " mode=\"max\",\n", + ")\n", + "\n", + "validation_metrics_callback = ValidationMetricsCallback(\n", + " metrics=[\"map\", \"ndcg\", \"recall\"],\n", + " ks=[1, 5, 10, 20],\n", + " item_count=train_dataset.item_count,\n", + " postprocessors=[RemoveSeenItems(sequential_validation_dataset)],\n", + ")\n", + "\n", + "trainer = L.Trainer(\n", + " max_epochs=MAX_EPOCHS,\n", + " callbacks=[checkpoint_callback, validation_metrics_callback],\n", + " logger=csv_logger,\n", + ")\n", + "\n", + "train_dataloader = DataLoader(\n", + " dataset=SasRecLLMTrainingDataset(\n", + " sequential_train_dataset,\n", + " max_sequence_length=MAX_SEQ_LEN,\n", + " user_profile_embeddings=user_profile_embeddings,\n", + " existing_profile_binary_mask=existing_profile_binary_mask,\n", + " ),\n", + " batch_size=BATCH_SIZE,\n", + " shuffle=True,\n", + " num_workers=NUM_WORKERS,\n", + " pin_memory=True,\n", + ")\n", + "\n", + "validation_dataloader = DataLoader(\n", + " dataset=SasRecValidationDataset(\n", + " sequential_validation_dataset,\n", + " sequential_validation_gt,\n", + " sequential_train_dataset,\n", + " max_sequence_length=MAX_SEQ_LEN,\n", + " ),\n", + " batch_size=BATCH_SIZE,\n", + " num_workers=NUM_WORKERS,\n", + " pin_memory=True,\n", + ")\n", + "\n", + "trainer.fit(\n", + " model,\n", + " train_dataloaders=train_dataloader,\n", + " val_dataloaders=validation_dataloader,\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.19" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "0857f111b041889635bea848a6a183706c3f1c18c9dafdb447caa5e8bea01452" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/replay/models/nn/sequential/__init__.py b/replay/models/nn/sequential/__init__.py index 5d319b8aa..940f9472f 100644 --- a/replay/models/nn/sequential/__init__.py +++ b/replay/models/nn/sequential/__init__.py @@ -3,3 +3,4 @@ if TORCH_AVAILABLE: from .bert4rec import Bert4Rec from .sasrec import SasRec + from .sasrec_with_llm import SasRecLLM diff --git a/replay/models/nn/sequential/sasrec_with_llm/__init__.py b/replay/models/nn/sequential/sasrec_with_llm/__init__.py new file mode 100644 index 000000000..d7798d4e0 --- /dev/null +++ b/replay/models/nn/sequential/sasrec_with_llm/__init__.py @@ -0,0 +1,3 @@ +from .dataset import SasRecLLMTrainingBatch, SasRecLLMTrainingDataset +from .lightning import SasRecLLM +from .model import SasRecLLMModel diff --git a/replay/models/nn/sequential/sasrec_with_llm/dataset.py b/replay/models/nn/sequential/sasrec_with_llm/dataset.py new file mode 100644 index 000000000..f5c117d73 --- /dev/null +++ b/replay/models/nn/sequential/sasrec_with_llm/dataset.py @@ -0,0 +1,89 @@ +from typing import NamedTuple, Optional, cast + +import torch + +from replay.data.nn import MutableTensorMap, SequentialDataset, TensorMap +from replay.models.nn.sequential.sasrec import SasRecTrainingDataset + + +class SasRecLLMTrainingBatch(NamedTuple): + """ + Batch of data for training. + Generated by `SasRecLLMTrainingDataset`. + """ + + user_profile_embeddings_batch: torch.Tensor + existing_profile_binary_mask_batch: torch.BoolTensor + query_id: torch.LongTensor + padding_mask: torch.BoolTensor + features: TensorMap + labels: torch.LongTensor + labels_padding_mask: torch.BoolTensor + + +class SasRecLLMTrainingDataset(SasRecTrainingDataset): + """ + Dataset that generates samples to train SasRecLLM-like model + """ + + def __init__( + self, + sequential: SequentialDataset, + max_sequence_length: int, + user_profile_embeddings: torch.FloatTensor, + existing_profile_binary_mask: torch.BoolTensor, + sequence_shift: int = 1, + sliding_window_step: Optional[None] = None, + padding_value: int = 0, + label_feature_name: Optional[str] = None, + ) -> None: + """ + :param sequential: Sequential dataset with training data. + :param max_sequence_length: Max length of sequence. + :param user_profile_embeddings: User profile embeddings tensor. + :param existing_profile_binary_mask: Binary mask for missing profiles. + :param sequence_shift: Shift of sequence to predict. + :param sliding_window_step: A sliding window step. + If not ``None`` provides iteration over sequences with window. + Default: ``None``. + :param padding_value: Value for padding a sequence to match the `max_sequence_length`. + Default: ``0``. + :param label_feature_name: Name of label feature in provided dataset. + If ``None`` set an item_id_feature name from sequential dataset. + Default: ``None``. + """ + super().__init__(sequential=sequential, + max_sequence_length=max_sequence_length, + sequence_shift=sequence_shift, + sliding_window_step=sliding_window_step, + padding_value=padding_value, + label_feature_name=label_feature_name) + + self.user_profile_embeddings = user_profile_embeddings + self.existing_profile_binary_mask = existing_profile_binary_mask + + + def __getitem__(self, index: int) -> SasRecLLMTrainingBatch: + query_id, padding_mask, features = self._inner[index] + user_profile_emb_batch = self.user_profile_embeddings[query_id].squeeze(0) + existing_profile_binary_mask_batch = self.existing_profile_binary_mask[query_id] + + assert self._label_feature_name + labels = features[self._label_feature_name][self._sequence_shift :] + labels_padding_mask = padding_mask[self._sequence_shift :] + + output_features: MutableTensorMap = {} + for feature_name in self._schema: + output_features[feature_name] = features[feature_name][: -self._sequence_shift] + + output_features_padding_mask = padding_mask[: -self._sequence_shift] + + return SasRecLLMTrainingBatch( + user_profile_embeddings_batch=user_profile_emb_batch, + existing_profile_binary_mask_batch=existing_profile_binary_mask_batch, + query_id=query_id, + features=output_features, + padding_mask=cast(torch.BoolTensor, output_features_padding_mask), + labels=cast(torch.LongTensor, labels), + labels_padding_mask=cast(torch.BoolTensor, labels_padding_mask), + ) diff --git a/replay/models/nn/sequential/sasrec_with_llm/lightning.py b/replay/models/nn/sequential/sasrec_with_llm/lightning.py new file mode 100644 index 000000000..920f80623 --- /dev/null +++ b/replay/models/nn/sequential/sasrec_with_llm/lightning.py @@ -0,0 +1,405 @@ +import gc +import math +from typing import Any, Optional, Tuple, cast + +import torch +from torch import nn + +from replay.data.nn import TensorMap, TensorSchema +from replay.models.nn.optimizer_utils import FatOptimizerFactory, LRSchedulerFactory, OptimizerFactory +from replay.models.nn.sequential.sasrec.lightning import SasRec +from replay.models.nn.sequential.sasrec_with_llm.dataset import SasRecLLMTrainingBatch +from replay.models.nn.sequential.sasrec_with_llm.model import SasRecLLMModel + + +class SasRecLLM(SasRec): + """ + SASRecLLM Lightning module. + + You can get initialization parameters with attribute `hparams` + for object of SasRecLLM instance. + """ + + def __init__( + self, + tensor_schema: TensorSchema, + profile_emb_dim: int, + block_count: int = 2, + head_count: int = 1, + hidden_size: int = 50, + max_seq_len: int = 200, + dropout_rate: float = 0.2, + ti_modification: bool = False, + time_span: int = 256, + loss_type: str = "CE", + loss_sample_count: Optional[int] = None, + negative_sampling_strategy: str = "global_uniform", + negatives_sharing: bool = False, + optimizer_factory: OptimizerFactory = FatOptimizerFactory(), + lr_scheduler_factory: Optional[LRSchedulerFactory] = None, + scale_guide_loss: bool = False, + alpha: float = 0.8, + profile_distil_epochs: int = 0, + reconstruction_layer: int = -1, + criterion_reconstruct_name: str = "MSE", + weighting_scheme="mean", + use_down_scale=True, + use_upscale=False, + weight_scale=None, + multi_profile=False, + multi_profile_aggr_scheme="mean" + ) -> None: + """ + :param tensor_schema: Tensor schema of features. + :param block_count: Number of Transformer blocks. + Default: ``2``. + :param head_count: Number of Attention heads. + Default: ``1``. + :param hidden_size: Hidden size of transformer. + Default: ``50``. + :param max_seq_len: Max length of sequence. + Default: ``200``. + :param dropout_rate: Dropout rate. + Default: ``0.2``. + :param ti_modification: Enable time relation. + Default: ``False``. + :param time_span: Time span value. + Default: ``256``. + :param loss_type: Loss type. Possible values: ``"CE"``, ``"BCE"``. + Default: ``CE``. + :param loss_sample_count (Optional[int]): Sample count to calculate loss. + Default: ``None``. + :param negative_sampling_strategy: Negative sampling strategy to calculate loss on sampled negatives. + Is used when large count of items in dataset. + Possible values: ``"global_uniform"``, ``"inbatch"`` + Default: ``global_uniform``. + :param negatives_sharing: Apply negative sharing in calculating sampled logits. + Default: ``False``. + :param optimizer_factory: Optimizer factory. + Default: ``FatOptimizerFactory``. + :param lr_scheduler_factory: Learning rate schedule factory. + Default: ``None``. + :param scale_guide_loss: Scale guide loss. + Default: ``False``. + :param alpha: Alpha value for loss. + Default: ``0.8``. + :param profile_distil_epochs: Profile distillation epochs. + Default: ``0``. + :param reconstruction_layer: Layer for reconstruction. + Default: ``-1``. + :param criterion_reconstruct_name: Name of criterion for reconstruction. + Default: ``MSE``. + :param weighting_scheme: Weighting scheme. + Default: ``mean``. + :param use_down_scale: Use down scale. + Default: ``True``. + :param use_upscale: Use upscale. + Default: ``False``. + :param weight_scale: Weight scale. + Default: ``None``. + :param multi_profile: Multi profile. + Default: ``False``. + :param multi_profile_aggr_scheme: Multi profile aggregation scheme. + Default: ``mean``. + """ + super().__init__( + tensor_schema=tensor_schema, + block_count=block_count, + head_count=head_count, + hidden_size=hidden_size, + max_seq_len=max_seq_len, + dropout_rate=dropout_rate, + ti_modification=ti_modification, + time_span=time_span, + loss_type=loss_type, + loss_sample_count=loss_sample_count, + negative_sampling_strategy=negative_sampling_strategy, + negatives_sharing=negatives_sharing, + optimizer_factory=optimizer_factory, + lr_scheduler_factory=lr_scheduler_factory, + ) + # override SASRec model + del self._model + gc.collect() + self._model = SasRecLLMModel(schema=tensor_schema, + profile_emb_dim=profile_emb_dim, + num_blocks=block_count, + num_heads=head_count, + hidden_size=hidden_size, + max_len=max_seq_len, + dropout=dropout_rate, + ti_modification=ti_modification, + reconstruction_layer=reconstruction_layer, + weighting_scheme=weighting_scheme, + use_down_scale=use_down_scale, + use_upscale=use_upscale, + weight_scale=weight_scale, + multi_profile=multi_profile, + multi_profile_aggr_scheme=multi_profile_aggr_scheme) + self.scale_guide_loss = scale_guide_loss + self.alpha = alpha + self.profile_distil_epochs = profile_distil_epochs + self.criterion_reconstruct = self._init_criterion_reconstruct(criterion_reconstruct_name) + + def _init_criterion_reconstruct(self, criterion_name: str) -> Any: + """ + :param criterion_name: Name of criterion for reconstruction. + :return: Criterion for reconstruction + """ + if criterion_name == "MSE": + return lambda x,y: nn.MSELoss()(x,y) + if criterion_name == "RMSE": + return lambda x,y: torch.sqrt(nn.MSELoss()(x,y)) + if criterion_name == "CosSim": + return lambda x,y: 1 - torch.mean(nn.CosineSimilarity(dim=1, eps=1e-6)(x,y)) + error_msg = f"Not existing reconstruction loss {criterion_name}" + raise NotImplementedError(error_msg) + + def _compute_loss(self, batch: SasRecLLMTrainingBatch) -> torch.Tensor: + if self._loss_type == "BCE": + loss_func = self._compute_loss_bce if self._loss_sample_count is None else self._compute_loss_bce_sampled + elif self._loss_type == "CE": + loss_func = self._compute_loss_ce if self._loss_sample_count is None else self._compute_loss_ce_sampled + else: + msg = f"Not supported loss type: {self._loss_type}" + raise ValueError(msg) + + # returns hidden states additionally + loss_model, hidden_state = loss_func( + batch.features, + batch.labels, + batch.padding_mask, + batch.labels_padding_mask, + ) + + epoch = self.trainer.current_epoch + if epoch >= self.profile_distil_epochs: + return loss_model + # reconstruction loss + loss_guide = self._compute_loss_reconstruction( + batch.user_profile_embeddings_batch, + hidden_state, + batch.existing_profile_binary_mask_batch, + ) + return self._merge_losses(loss_model, loss_guide) + + def _merge_losses(self, loss_model: torch.Tensor, loss_guide: torch.Tensor) -> torch.Tensor: + """ + :param loss_model: Model loss + :param loss_guide: Guide loss + + :return: Merged loss + """ + if self.scale_guide_loss: + loss_model_value = loss_model.item() + loss_guide_value = loss_guide.item() + eps = 1e-8 + + scale_for_guide = loss_model_value / (loss_guide_value + eps) + loss_guide = loss_guide * scale_for_guide + return self.alpha * loss_guide + (1 - self.alpha) * loss_model + + def _compute_loss_reconstruction( + self, + user_profile_emb: torch.Tensor, + hidden_for_reconstruction: torch.Tensor, + existing_profile_binary_mask_batch: torch.BoolTensor, + ) -> torch.Tensor: + user_profile_emb_transformed = self._model.aggregate_profile(user_profile_emb) + if self._model.use_upscale: + hidden_for_reconstruction = self._model.hidden_layer_transform(hidden_for_reconstruction) + + existing_profile_binary_mask_batch = existing_profile_binary_mask_batch.flatten() + + loss_guide = self.criterion_reconstruct(hidden_for_reconstruction[existing_profile_binary_mask_batch], + user_profile_emb_transformed[existing_profile_binary_mask_batch]) + return loss_guide + + def _compute_loss_bce( + self, + feature_tensors: TensorMap, + positive_labels: torch.LongTensor, + padding_mask: torch.BoolTensor, + target_padding_mask: torch.BoolTensor, + ) -> Tuple[torch.Tensor, torch.Tensor]: + # [B x L x V] + logits, hidden_state = self._model.forward(feature_tensors, padding_mask) + + """ + Take only logits which correspond to non-padded tokens + M = non_zero_count(target_padding_mask) + """ + logits = logits[target_padding_mask] # [M x V] + labels = positive_labels[target_padding_mask] # [M] + + bce_labels = torch.zeros( + (logits.size(0), logits.size(-1)), + device=logits.device, + ) + + # Fill positives with ones, all negatives are zeros + bce_labels.scatter_( + dim=-1, + index=labels.unsqueeze(-1), + value=1, + ) + + loss = self._loss(logits, bce_labels) / logits.size(0) + return loss, hidden_state + + def _compute_loss_bce_sampled( + self, + feature_tensors: TensorMap, + positive_labels: torch.LongTensor, + padding_mask: torch.BoolTensor, + target_padding_mask: torch.BoolTensor, + ) -> Tuple[torch.Tensor, torch.Tensor]: + (positive_logits, negative_logits, hidden_state, *_) = self._get_sampled_logits( + feature_tensors, positive_labels, padding_mask, target_padding_mask + ) + + positive_prob = torch.sigmoid(positive_logits) + negative_prob = torch.sigmoid(negative_logits) + + # Clamp and eps for numerical stability + clamp_border: float = 100.0 + eps = 1e-6 + positive_loss = torch.clamp(torch.log((positive_prob) + eps), -clamp_border, clamp_border).sum() + negative_loss = torch.clamp(torch.log((1 - negative_prob) + eps), -clamp_border, clamp_border).sum() + + loss = -(positive_loss + negative_loss) + loss /= positive_logits.size(0) + + return loss, hidden_state + + def _compute_loss_ce( + self, + feature_tensors: TensorMap, + positive_labels: torch.LongTensor, + padding_mask: torch.BoolTensor, + target_padding_mask: torch.BoolTensor, + ) -> Tuple[torch.Tensor, torch.Tensor]: + # logits: [B x L x V] + logits, hidden_state = self._model.forward( + feature_tensors, + padding_mask, + ) + + # labels: [B x L] + labels = positive_labels.masked_fill(mask=(~target_padding_mask), value=-100) + + logits_flat = logits.view(-1, logits.size(-1)) # [(B * L) x V] + labels_flat = labels.view(-1) # [(B * L)] + + loss = self._loss(logits_flat, labels_flat) + return loss, hidden_state + + def _compute_loss_ce_sampled( + self, + feature_tensors: TensorMap, + positive_labels: torch.LongTensor, + padding_mask: torch.BoolTensor, + target_padding_mask: torch.BoolTensor, + ) -> Tuple[torch.Tensor, torch.Tensor]: + assert self._loss_sample_count is not None + (positive_logits, negative_logits, hidden_state, positive_labels, negative_labels, vocab_size) =\ + self._get_sampled_logits(feature_tensors, + positive_labels, + padding_mask, + target_padding_mask + ) + n_negative_samples = min(self._loss_sample_count, vocab_size) + + # Reject negative samples matching target label & correct for remaining samples + reject_labels = positive_labels == negative_labels # [masked_batch_seq_size x n_negative_samples] + negative_logits += math.log(vocab_size - 1) + negative_logits -= 1e6 * reject_labels + negative_logits -= torch.log((n_negative_samples - reject_labels.sum(dim=-1, keepdim=True)).float()) + + # Apply regular softmax cross entropy + # [masked_batch_seq_size x (1 + n_negative_samples)] + logits = torch.cat([positive_logits, negative_logits], dim=1).float() + labels_flat = torch.zeros(positive_logits.size(0), dtype=torch.long, device=padding_mask.device) + loss = self._loss(logits, labels_flat) + return loss, hidden_state + + def _get_sampled_logits( + self, + feature_tensors: TensorMap, + positive_labels: torch.LongTensor, + padding_mask: torch.BoolTensor, + target_padding_mask: torch.BoolTensor, + ) -> Tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.LongTensor, torch.LongTensor, int]: + assert self._loss_sample_count is not None + n_negative_samples = self._loss_sample_count + positive_labels = cast( + torch.LongTensor, torch.masked_select(positive_labels, target_padding_mask) + ) # (masked_batch_seq_size,) + masked_batch_seq_size = positive_labels.size(0) + device = padding_mask.device + output_emb, hidden_state = self._model.forward_step(feature_tensors, padding_mask) + output_emb = output_emb[target_padding_mask] + + positive_labels = cast(torch.LongTensor, positive_labels.view(-1, 1)) + ids = torch.arange(masked_batch_seq_size, dtype=torch.long, device=device) + unique_positive_labels, positive_labels_indices = positive_labels.unique(return_inverse=True) + + if self._negative_sampling_strategy == "global_uniform": + vocab_size = self._vocab_size + multinomial_sample_distribution = torch.ones(vocab_size, device=device) + # positive_labels - 2d + positive_logits = self._model.get_logits(output_emb, positive_labels) + elif self._negative_sampling_strategy == "inbatch": + positive_labels_indices = positive_labels_indices.view(masked_batch_seq_size, 1) + # unique_positive_labels - 1d + positive_logits = self._model.get_logits(output_emb, unique_positive_labels) + vocab_size = unique_positive_labels.size(0) + if self._negatives_sharing: + multinomial_sample_distribution = torch.ones(vocab_size, device=device) + else: + multinomial_sample_distribution = torch.softmax(positive_logits, dim=-1) + else: + msg = f"Unknown negative sampling strategy: {self._negative_sampling_strategy}" + raise NotImplementedError(msg) + n_negative_samples = min(n_negative_samples, vocab_size) + + if self._negatives_sharing: + negative_labels = torch.multinomial( + multinomial_sample_distribution, + num_samples=n_negative_samples, + replacement=False, + ) + negative_labels = negative_labels.unsqueeze(0).repeat(masked_batch_seq_size, 1) + elif self._negative_sampling_strategy == "global_uniform": + negative_labels = torch.randint( + low=0, + high=vocab_size, + size=(masked_batch_seq_size, n_negative_samples), + dtype=torch.long, + device=device, + ) + else: + negative_labels = torch.multinomial( + multinomial_sample_distribution, + num_samples=n_negative_samples, + replacement=False, + ) + negative_labels = cast(torch.LongTensor, negative_labels) + + if self._negative_sampling_strategy == "global_uniform": + if self._negatives_sharing: + unique_negative_labels, negative_labels_indices = negative_labels.unique(return_inverse=True) + negative_labels_indices = negative_labels_indices.view(masked_batch_seq_size, n_negative_samples) + # unique_negative_labels - 1d + negative_logits = self._model.get_logits(output_emb, unique_negative_labels) + negative_logits = negative_logits[ids, negative_labels_indices.T].T + else: + # unique_negative_labels - 1d + negative_logits = self._model.get_logits(output_emb, negative_labels) + else: # self._negative_sampling_strategy == "inbatch": + negative_labels_indices = negative_labels + negative_logits = positive_logits + negative_logits = negative_logits[ids, negative_labels_indices.T].T + positive_logits = positive_logits[ids, positive_labels_indices.T].T + + return (positive_logits, negative_logits, hidden_state, positive_labels, negative_labels, vocab_size) diff --git a/replay/models/nn/sequential/sasrec_with_llm/model.py b/replay/models/nn/sequential/sasrec_with_llm/model.py new file mode 100644 index 000000000..a2a8dc724 --- /dev/null +++ b/replay/models/nn/sequential/sasrec_with_llm/model.py @@ -0,0 +1,329 @@ +import gc +from typing import Tuple, Union + +import torch +from torch import nn + +from replay.data.nn import TensorMap, TensorSchema +from replay.models.nn.sequential.sasrec import SasRecModel +from replay.models.nn.sequential.sasrec.model import SasRecLayers, TiSasRecLayers +from replay.models.nn.sequential.sasrec_with_llm.utils import ( + SimpleAttentionAggregator, + exponential_weightening, + mean_weightening, +) + + +class SasRecLLMModel(SasRecModel): + """ + SasRec model with LLM profiles + """ + + def __init__( + self, + schema: TensorSchema, + profile_emb_dim: int, + num_blocks: int = 2, + num_heads: int = 1, + hidden_size: int = 50, + max_len: int = 200, + dropout: float = 0.2, + ti_modification: bool = False, + time_span: int = 256, + reconstruction_layer: int = -1, + weighting_scheme="mean", + use_down_scale=True, + use_upscale=False, + weight_scale=None, + multi_profile=False, + multi_profile_aggr_scheme="mean" + ) -> None: + """ + :param schema: Tensor schema of features. + :param num_blocks: Number of Transformer blocks. + Default: ``2``. + :param num_heads: Number of Attention heads. + Default: ``1``. + :param hidden_size: Hidden size of transformer. + Default: ``50``. + :param max_len: Max length of sequence. + Default: ``200``. + :param dropout: Dropout rate. + Default: ``0.2``. + :param ti_modification: Enable time relation. + Default: ``False``. + :param time_span: Time span if `ti_modification` is `True`. + Default: ``256``. + :param reconstruction_layer: Layer to use for reconstruction. + Default: ``-1``. + :param weighting_scheme: Weighting scheme for aggregation. + Default: ``'mean'``. + :param use_down_scale: Use downscale. + Default: ``True``. + :param use_upscale: Use upscale. + Default: ``False``. + :param weight_scale: Weight scale for exponential weighting. + Default: ``None``. + :param multi_profile: Use multi-profile. + Default: ``False``. + :param multi_profile_aggr_scheme: Multi-profile aggregation scheme. + Default: ``'mean'``. + """ + super().__init__(schema=schema, + num_blocks=num_blocks, + num_heads=num_heads, + hidden_size=hidden_size, + max_len=max_len, + dropout=dropout, + ti_modification=ti_modification, + time_span=time_span) + + # override SASRec layers to return hidden states + del self.sasrec_layers + gc.collect() + + if self.ti_modification: + self.sasrec_layers = TiSasRecWithHiddenLayers( + hidden_size=self.hidden_size, + num_heads=self.num_heads, + num_blocks=self.num_blocks, + dropout=self.dropout, + ) + else: + self.sasrec_layers = SasRecWithHiddenLayers( + hidden_size=self.hidden_size, + num_heads=self.num_heads, + num_blocks=self.num_blocks, + dropout=self.dropout, + ) + + if weighting_scheme == "mean": + self.weighting_fn = mean_weightening + self.weighting_kwargs = {} + elif weighting_scheme == "exponential": + self.weighting_fn = exponential_weightening + self.weighting_kwargs = {"weight_scale": weight_scale} + elif weighting_scheme == "attention": + self.weighting_fn = SimpleAttentionAggregator(self.hidden_size) + self.weighting_kwargs = {} + else: + error_msg = f"No such weighting_scheme {weighting_scheme} exists" + raise NotImplementedError(error_msg) + + if multi_profile_aggr_scheme == "mean": + self.profile_aggregator = mean_weightening + self.multi_profile_weighting_kwargs = {} + elif multi_profile_aggr_scheme == "attention": + self.profile_aggregator = SimpleAttentionAggregator(profile_emb_dim if not use_down_scale + else self.hidden_size) + self.multi_profile_weighting_kwargs = {} + else: + error_msg = f"No such multi_profile_aggr_scheme {multi_profile_aggr_scheme} exists" + raise NotImplementedError(error_msg) + + self.use_down_scale = use_down_scale + self.use_upscale = use_upscale + self.multi_profile = multi_profile + self.reconstruction_layer = reconstruction_layer + + if use_down_scale: + self.profile_transform = nn.Linear(profile_emb_dim, self.hidden_size) + if use_upscale: + self.hidden_layer_transform = nn.Linear(self.hidden_size, profile_emb_dim) + + def forward( + self, + feature_tensor: TensorMap, + padding_mask: torch.BoolTensor, + ) -> Tuple[torch.Tensor, torch.Tensor]: + """ + :param feature_tensor: Batch of features. + :param padding_mask: Padding mask where 0 - , 1 otherwise. + + :returns: Calculated scores. + """ + output_embeddings, hidden_states = self.forward_step(feature_tensor, padding_mask) + all_scores = self.get_logits(output_embeddings) + return all_scores, hidden_states + + def get_query_embeddings( + self, + feature_tensor: TensorMap, + padding_mask: torch.BoolTensor, + ): + """ + :param feature_tensor: Batch of features. + :param padding_mask: Padding mask where 0 - , 1 otherwise. + + :returns: Query embeddings. + """ + output, hidden_state = self.forward_step(feature_tensor, padding_mask) + return output[:, -1, :] + + def forward_step( + self, + feature_tensor: TensorMap, + padding_mask: torch.BoolTensor, + ) -> Union[torch.Tensor, Tuple[torch.Tensor, list]]: + """ + :param feature_tensor: Batch of features. + :param padding_mask: Padding mask where 0 - , 1 otherwise. + + :returns: Output embeddings. + """ + device = feature_tensor[self.item_feature_name].device + attention_mask, padding_mask, feature_tensor = self.masking(feature_tensor, padding_mask) + if self.ti_modification: + seqs, ti_embeddings = self.item_embedder(feature_tensor, padding_mask) + seqs, hidden_states__list = self.sasrec_layers(seqs, attention_mask, padding_mask, ti_embeddings, device) + else: + seqs = self.item_embedder(feature_tensor, padding_mask) + seqs, hidden_states__list = self.sasrec_layers(seqs, attention_mask, padding_mask) + output_embeddings = self.output_normalization(seqs) + if self.reconstruction_layer == -1: + hidden_states = output_embeddings + else: + hidden_states = hidden_states__list[self.reconstruction_layer] + hidden_states_agg = self.weighting_fn(hidden_states, **self.weighting_kwargs) + return output_embeddings, hidden_states_agg + + def aggregate_profile(self, user_profile_emb): + """ + :param user_profile_emb: User profile embeddings. + + :returns: Aggregated user profile embeddings. + """ + if user_profile_emb is None: + return None + + if user_profile_emb.dim() == 2: + if self.use_down_scale: + return self.profile_transform(user_profile_emb) + else: + return user_profile_emb.detach().clone() + + bsz, k, edim = user_profile_emb.shape + + if self.use_down_scale: + user_profile_emb = user_profile_emb.view(bsz * k, edim) + user_profile_emb = self.profile_transform(user_profile_emb) + user_profile_emb = user_profile_emb.view(bsz, k, self.hidden_size) + + aggregated = self.profile_aggregator(user_profile_emb, + *self.multi_profile_weighting_kwargs) + return aggregated + + +class SasRecWithHiddenLayers(SasRecLayers): + """ + SasRec vanilla layers with hidden states: + 1. SelfAttention layers + 2. FeedForward layers + + Link: https://arxiv.org/pdf/1808.09781.pdf + """ + + def __init__( + self, + hidden_size: int, + num_heads: int, + num_blocks: int, + dropout: float, + ) -> None: + """ + :param hidden_size: Hidden size of transformer. + :param num_heads: Number of Attention heads. + :param num_blocks: Number of Transformer blocks. + :param dropout: Dropout rate. + """ + super().__init__(hidden_size=hidden_size, + num_heads=num_heads, + num_blocks=num_blocks, + dropout=dropout) + + def forward( + self, + seqs: torch.Tensor, + attention_mask: torch.BoolTensor, + padding_mask: torch.BoolTensor, + ) -> Tuple[torch.Tensor, list]: + """ + :param seqs: Item embeddings. + :param attention_mask: Attention mask. + :param padding_mask: Padding mask where 0 - , 1 otherwise. + + :returns: Output embeddings. + """ + hidden_states__list = [] + num_blocks = len(self.attention_layers) + for i in range(num_blocks): + query = self.attention_layernorms[i](seqs) + attent_emb, _ = self.attention_layers[i]( + query, seqs, seqs, attn_mask=attention_mask, need_weights=False) + seqs = query + attent_emb + + seqs = self.forward_layernorms[i](seqs) + seqs = self.forward_layers[i](seqs) + seqs *= padding_mask + + hidden_states__list.append(seqs.clone()) + return seqs, hidden_states__list + + +class TiSasRecWithHiddenLayers(TiSasRecLayers): + """ + TiSasRec layers with hidden states: + 1. Time-relative SelfAttention layers + 2. FeedForward layers + + Link: https://cseweb.ucsd.edu/~jmcauley/pdfs/wsdm20b.pdf + """ + + def __init__( + self, + hidden_size: int, + num_heads: int, + num_blocks: int, + dropout: float, + ) -> None: + """ + :param hidden_size: Hidden size of transformer. + :param num_heads: Number of Attention heads. + :param num_blocks: Number of Transformer blocks. + :param dropout: Dropout rate. + """ + super().__init__(hidden_size=hidden_size, + num_heads=num_heads, + num_blocks=num_blocks, + dropout=dropout) + + def forward( + self, + seqs: torch.Tensor, + attention_mask: torch.BoolTensor, + padding_mask: torch.BoolTensor, + ti_embeddings: Tuple[torch.Tensor, torch.Tensor, torch.Tensor, torch.Tensor], + device: torch.device, + ) -> Tuple[torch.Tensor, list]: + """ + :param seqs: Item embeddings. + :param attention_mask: Attention mask. + :param padding_mask: Padding mask where 0 - , 1 otherwise. + :param ti_embeddings: Output embeddings, key and value time interval matrices, + key and value positional embeddings. + :param device: Selected device. + + :returns: Output embeddings. + """ + hidden_states = [] + length = len(self.attention_layers) + for i in range(length): + query = self.attention_layernorms[i](seqs) + attent_emb = self.attention_layers[i](query, seqs, ~padding_mask, attention_mask, ti_embeddings, device) + seqs = query + attent_emb + seqs = self.forward_layernorms[i](seqs) + seqs = self.forward_layers[i](seqs) + seqs *= padding_mask + + hidden_states.append(seqs.clone()) + return seqs, hidden_states diff --git a/replay/models/nn/sequential/sasrec_with_llm/utils.py b/replay/models/nn/sequential/sasrec_with_llm/utils.py new file mode 100644 index 000000000..6712a7930 --- /dev/null +++ b/replay/models/nn/sequential/sasrec_with_llm/utils.py @@ -0,0 +1,74 @@ +import json + +import torch +from torch import nn +from torch.nn.functional import softmax + + +def load_user_profile_embeddings(file_path: str, user_id_mapping: dict): + """ + Load user profile embeddings from a single JSON file + :param file_path: Path to the JSON file + :param user_id_mapping: Mapping from user IDs to indices + + :return: Tuple of user profile embeddings tensor and binary mask for missing profiles + """ + with open(file_path, "r") as f: + user_profiles_data = json.load(f) + + embedding_dim = len(next(iter(user_profiles_data.values()))) + max_idx = max(user_id_mapping.values()) + 1 # Ensure list can accommodate the highest index + user_profiles_list = [[0.0] * embedding_dim for _ in range(max_idx)] + existing_profile_binary_mask = [True for _ in range(max_idx)] + + for original_id, idx in user_id_mapping.items(): + embedding = user_profiles_data.get(str(original_id)) + if embedding is not None: + user_profiles_list[idx] = embedding + else: + existing_profile_binary_mask[idx] = False + + user_profiles_tensor = torch.tensor(user_profiles_list, dtype=torch.float) + existing_profile_binary_mask_tensor = torch.BoolTensor(existing_profile_binary_mask) + return user_profiles_tensor, existing_profile_binary_mask_tensor + + +def mean_weightening(hidden_states: torch.Tensor) -> torch.Tensor: + """ + :param hidden_states: [batch_size, seq_len, hidden_size] + :return: [batch_size, hidden_size] + """ + return hidden_states.mean(dim=1) + + +def exponential_weightening(hidden_states: torch.Tensor, weight_scale: float) -> torch.Tensor: + """ + :param hidden_states: hidden states of SASRec layers - [batch_size, seq_len, hidden_size] + :param weight_scale: scale factor for the exponential weights + """ + device = hidden_states.device + + indices = torch.arange(hidden_states.shape[1]).float().to(device) + weights = torch.exp(weight_scale * indices) + weights = weights / weights.sum() + weights = weights.view(1, hidden_states.shape[1], 1) + + weighted_tensor = hidden_states * weights + result = weighted_tensor.sum(dim=1) + return result + + +class SimpleAttentionAggregator(nn.Module): + def __init__(self, hidden_units: int) -> None: + super(SimpleAttentionAggregator, self).__init__() + self.attention = nn.Linear(hidden_units, 1) + + def forward(self, x): + """ + :param x: Input tensor of shape [batch_size, n_items, hidden_units] + :returns: Aggregated tensor of shape [batch_size, hidden_units] + """ + scores = self.attention(x) + weights = softmax(scores, dim=1) + weighted_sum = (x * weights).sum(dim=1) + return weighted_sum diff --git a/tests/models/nn/sequential/conftest.py b/tests/models/nn/sequential/conftest.py index 735bda564..e6da7ab17 100644 --- a/tests/models/nn/sequential/conftest.py +++ b/tests/models/nn/sequential/conftest.py @@ -4,6 +4,7 @@ import pytest from replay.data import FeatureHint, FeatureType +from replay.models.nn.sequential.sasrec_with_llm import SasRecLLMTrainingDataset from replay.utils import TORCH_AVAILABLE if TORCH_AVAILABLE: @@ -383,3 +384,28 @@ def val_sasrec_loader(item_user_sequential_dataset): def pred_sasrec_loader(item_user_sequential_dataset): pred = SasRecPredictionDataset(item_user_sequential_dataset, max_sequence_length=5) return torch.utils.data.DataLoader(pred) + + +@pytest.fixture(scope="module") +def user_profile_embeddings(): + """Provides a static profile embedding for tests.""" + return torch.zeros((100, 1024), dtype=torch.float32) + + +@pytest.fixture(scope="module") +def profile_binary_mask_getter(): + def _get_profile_binary_mask(dataset, user_profile_embeddings): + existing_profile_binary_mask = torch.BoolTensor([True] * len(dataset)) + existing_profile_binary_mask[:len(dataset) - len(user_profile_embeddings)] = False + return existing_profile_binary_mask + return _get_profile_binary_mask + + +@pytest.fixture(scope="module") +def train_sasrec_llm_loader(item_user_sequential_dataset, user_profile_embeddings, profile_binary_mask_getter): + train = SasRecLLMTrainingDataset(sequential=item_user_sequential_dataset, + max_sequence_length=5, + user_profile_embeddings=user_profile_embeddings, + existing_profile_binary_mask=profile_binary_mask_getter(item_user_sequential_dataset, + user_profile_embeddings)) + return torch.utils.data.DataLoader(train) diff --git a/tests/models/nn/sequential/sasrec_with_llm/conftest.py b/tests/models/nn/sequential/sasrec_with_llm/conftest.py new file mode 100644 index 000000000..7fd1be827 --- /dev/null +++ b/tests/models/nn/sequential/sasrec_with_llm/conftest.py @@ -0,0 +1,91 @@ +import pandas as pd +import pytest + +from replay.data import Dataset, FeatureHint, FeatureInfo, FeatureSchema, FeatureSource, FeatureType +from replay.utils import TORCH_AVAILABLE + +if TORCH_AVAILABLE: + import lightning as L + import torch + + from replay.data.nn import SequenceTokenizer, TensorFeatureInfo, TensorFeatureSource, TensorSchema + from replay.models.nn.sequential.sasrec_with_llm import SasRecLLM, SasRecLLMTrainingDataset + + +@pytest.fixture(scope="module") +def feature_schema_for_sasrec(): + schema = FeatureSchema( + [ + FeatureInfo( + column="user_id", + feature_hint=FeatureHint.QUERY_ID, + feature_type=FeatureType.CATEGORICAL, + ), + FeatureInfo( + column="item_id", + feature_hint=FeatureHint.ITEM_ID, + feature_type=FeatureType.CATEGORICAL, + ), + ] + ) + + return schema + + +@pytest.fixture(scope="class") +def fitted_sasrec(feature_schema_for_sasrec): + data = pd.DataFrame( + { + "user_id": [0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2], + "item_id": [0, 1, 2, 0, 1, 3, 1, 2, 0, 2, 3, 1, 2], + } + ) + + profile_emb_dim = 1024 + + user_profile_embeddings = torch.zeros((3, profile_emb_dim), dtype=torch.float32) + existing_profile_binary_mask = torch.BoolTensor([True, True, True]) + + train_dataset = Dataset(feature_schema=feature_schema_for_sasrec, interactions=data) + tensor_schema = TensorSchema( + TensorFeatureInfo( + name="item_id", + is_seq=True, + cardinality=train_dataset.item_count, + feature_type=FeatureType.CATEGORICAL, + feature_sources=[ + TensorFeatureSource(FeatureSource.INTERACTIONS, train_dataset.feature_schema.item_id_column) + ], + feature_hint=FeatureHint.ITEM_ID, + ) + ) + + tokenizer = SequenceTokenizer(tensor_schema, allow_collect_to_master=True) + tokenizer.fit(train_dataset) + sequential_train_dataset = tokenizer.transform(train_dataset) + + model = SasRecLLM(tensor_schema, profile_emb_dim=profile_emb_dim, max_seq_len=5) + trainer = L.Trainer(max_epochs=1) + train_loader = torch.utils.data.DataLoader( + SasRecLLMTrainingDataset(sequential=sequential_train_dataset, + max_sequence_length=5, + user_profile_embeddings=user_profile_embeddings, + existing_profile_binary_mask=existing_profile_binary_mask + ) + ) + + trainer.fit(model, train_dataloaders=train_loader) + + return model, tokenizer + + +@pytest.fixture(scope="module") +def new_items_dataset(): + data = pd.DataFrame( + { + "user_id": [0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2], + "item_id": [0, 1, 2, 0, 1, 3, 1, 2, 0, 2, 3, 1, 2, 4], + } + ) + + return data diff --git a/tests/models/nn/sequential/sasrec_with_llm/test_sasrec_with_llm_dataset.py b/tests/models/nn/sequential/sasrec_with_llm/test_sasrec_with_llm_dataset.py new file mode 100644 index 000000000..253eb1b58 --- /dev/null +++ b/tests/models/nn/sequential/sasrec_with_llm/test_sasrec_with_llm_dataset.py @@ -0,0 +1,61 @@ +import pytest + +from replay.utils import TORCH_AVAILABLE + +if TORCH_AVAILABLE: + from replay.models.nn.sequential.sasrec_with_llm import SasRecLLMTrainingDataset + +torch = pytest.importorskip("torch") + + +@pytest.mark.torch +@pytest.mark.parametrize( + "max_len, feature_name, exception, exception_text", + [ + (8, "fake_user_id", pytest.raises(ValueError), "Label feature name not found in provided schema"), + (8, "some_item_feature", pytest.raises(ValueError), "Label feature must be categorical"), + (8, "some_user_feature", pytest.raises(ValueError), "Label feature must be sequential"), + ], +) +def test_sasrec_training_dataset_exceptions(wrong_sequential_dataset, + max_len, + feature_name, + exception, + exception_text, + user_profile_embeddings, + profile_binary_mask_getter): + with exception as exc: + existing_profile_binary_mask = profile_binary_mask_getter(wrong_sequential_dataset, user_profile_embeddings) + SasRecLLMTrainingDataset(sequential=wrong_sequential_dataset, + max_sequence_length=max_len, + user_profile_embeddings=user_profile_embeddings, + existing_profile_binary_mask=existing_profile_binary_mask, + label_feature_name=feature_name) + + assert str(exc.value) == exception_text + + +@pytest.mark.torch +def test_sasrec_datasets_length(sequential_dataset, user_profile_embeddings, profile_binary_mask_getter): + existing_profile_binary_mask = profile_binary_mask_getter(sequential_dataset, user_profile_embeddings) + assert len(SasRecLLMTrainingDataset(sequential=sequential_dataset, + max_sequence_length=8, + user_profile_embeddings=user_profile_embeddings, + existing_profile_binary_mask=existing_profile_binary_mask, + )) == 4 + + +@pytest.mark.torch +def test_sasrec_training_dataset_getitem(sequential_dataset, user_profile_embeddings, profile_binary_mask_getter): + existing_profile_binary_mask = profile_binary_mask_getter(sequential_dataset, user_profile_embeddings) + batch = SasRecLLMTrainingDataset(sequential=sequential_dataset, + max_sequence_length=8, + user_profile_embeddings=user_profile_embeddings, + existing_profile_binary_mask=existing_profile_binary_mask, + label_feature_name="item_id")[0] + + assert batch.query_id.item() == 0 + assert all(batch.padding_mask == torch.tensor([0, 0, 0, 0, 0, 0, 0, 1], dtype=torch.bool)) + assert all(batch.labels_padding_mask == torch.tensor([0, 0, 0, 0, 0, 0, 1, 1], dtype=torch.bool)) + assert all(batch.labels == torch.tensor([-1, -1, -1, -1, -1, -1, 0, 1], dtype=torch.long)) + diff --git a/tests/models/nn/sequential/sasrec_with_llm/test_sasrec_with_llm_lightning.py b/tests/models/nn/sequential/sasrec_with_llm/test_sasrec_with_llm_lightning.py new file mode 100644 index 000000000..337ec274c --- /dev/null +++ b/tests/models/nn/sequential/sasrec_with_llm/test_sasrec_with_llm_lightning.py @@ -0,0 +1,449 @@ +import pytest + +from replay.utils import TORCH_AVAILABLE + +if TORCH_AVAILABLE: + from replay.models.nn.optimizer_utils import FatLRSchedulerFactory, FatOptimizerFactory + from replay.models.nn.sequential.sasrec import SasRecPredictionBatch, SasRecPredictionDataset + from replay.models.nn.sequential.sasrec_with_llm import SasRecLLM + +torch = pytest.importorskip("torch") +L = pytest.importorskip("lightning") + + + +@pytest.mark.torch +@pytest.mark.parametrize( + "loss_type, loss_sample_count", + [ + ("BCE", 6), + ("CE", 6), + ("BCE", None), + ("CE", None), + ], +) +def test_training_sasrec_with_different_losses( + item_user_sequential_dataset, + train_sasrec_llm_loader, + val_sasrec_loader, + loss_type, + loss_sample_count, +): + trainer = L.Trainer(max_epochs=1) + model = SasRecLLM( + tensor_schema=item_user_sequential_dataset._tensor_schema, + profile_emb_dim=train_sasrec_llm_loader.dataset.user_profile_embeddings.shape[0], + max_seq_len=5, + hidden_size=64, + loss_type=loss_type, + loss_sample_count=loss_sample_count, + profile_distil_epochs=0, + ) + trainer.fit(model, train_sasrec_llm_loader, val_sasrec_loader) + + +@pytest.mark.torch +def test_init_sasrec_with_invalid_loss_type(item_user_sequential_dataset): + with pytest.raises(NotImplementedError) as exc: + SasRecLLM(tensor_schema=item_user_sequential_dataset._tensor_schema, + profile_emb_dim=1024, + max_seq_len=5, + hidden_size=64, + loss_type="") + + assert str(exc.value) == "Not supported loss_type" + + +@pytest.mark.torch +def test_train_sasrec_with_invalid_loss_type(item_user_sequential_dataset, train_sasrec_llm_loader): + with pytest.raises(ValueError): + trainer = L.Trainer(max_epochs=1) + model = SasRecLLM(tensor_schema=item_user_sequential_dataset._tensor_schema, + profile_emb_dim=train_sasrec_llm_loader.dataset.user_profile_embeddings.shape[0], + max_seq_len=5, + hidden_size=64 + ) + model._loss_type = "" + trainer.fit(model, train_dataloaders=train_sasrec_llm_loader) + + +@pytest.mark.torch +def test_prediction_sasrec(item_user_sequential_dataset, train_sasrec_llm_loader): + pred = SasRecPredictionDataset(item_user_sequential_dataset, max_sequence_length=5) + pred_sasrec_loader = torch.utils.data.DataLoader(pred) + trainer = L.Trainer(max_epochs=1) + model = SasRecLLM(tensor_schema=item_user_sequential_dataset._tensor_schema, + profile_emb_dim=train_sasrec_llm_loader.dataset.user_profile_embeddings.shape[0], + max_seq_len=5, + hidden_size=64) + trainer.fit(model, train_sasrec_llm_loader) + predicted = trainer.predict(model, pred_sasrec_loader) + + assert len(predicted) == len(pred) + assert predicted[0].size() == (1, 6) + + +@pytest.mark.torch +@pytest.mark.parametrize( + "candidates", + [torch.LongTensor([1]), torch.LongTensor([1, 2, 3, 4]), torch.LongTensor([0, 1, 2, 3, 4, 5]), None], +) +def test_prediction_sasrec_with_candidates(item_user_sequential_dataset, train_sasrec_llm_loader, candidates): + pred = SasRecPredictionDataset(item_user_sequential_dataset, max_sequence_length=5) + pred_sasrec_loader = torch.utils.data.DataLoader(pred, batch_size=1) + trainer = L.Trainer(max_epochs=1) + model = SasRecLLM(tensor_schema=item_user_sequential_dataset._tensor_schema, + profile_emb_dim=train_sasrec_llm_loader.dataset.user_profile_embeddings.shape[0], + max_seq_len=5, + hidden_size=64) + trainer.fit(model, train_sasrec_llm_loader) + + # test online inference with candidates + for batch in pred_sasrec_loader: + predicted = model.predict(batch, candidates) + assert model.candidates_to_score is None + if candidates is not None: + assert predicted.size() == (1, candidates.shape[0]) + else: + assert predicted.size() == (1, item_user_sequential_dataset.schema["item_id"].cardinality) + + # test offline inference with candidates + model.candidates_to_score = candidates + predicted = trainer.predict(model, pred_sasrec_loader) + if candidates is not None: + assert torch.equal(model.candidates_to_score, candidates) + else: + assert model.candidates_to_score is None + + for pred in predicted: + if candidates is not None: + assert pred.size() == (1, candidates.shape[0]) + else: + assert pred.size() == (1, item_user_sequential_dataset.schema["item_id"].cardinality) + + +@pytest.mark.torch +def test_predictions_sasrec_equal_with_permuted_candidates(item_user_sequential_dataset, train_sasrec_llm_loader): + pred = SasRecPredictionDataset(item_user_sequential_dataset, max_sequence_length=5) + pred_sasrec_loader = torch.utils.data.DataLoader(pred) + trainer = L.Trainer(max_epochs=1) + model = SasRecLLM(tensor_schema=item_user_sequential_dataset._tensor_schema, + profile_emb_dim=train_sasrec_llm_loader.dataset.user_profile_embeddings.shape[0], + max_seq_len=5, + hidden_size=64) + trainer.fit(model, train_sasrec_llm_loader) + + sorted_candidates = torch.LongTensor([0, 1, 2, 3]) + permuted_candidates = torch.LongTensor([3, 0, 2, 1]) + _, ordering = torch.sort(permuted_candidates) + + model.candidates_to_score = sorted_candidates + predictions_sorted_candidates = trainer.predict(model, pred_sasrec_loader) + + model.candidates_to_score = permuted_candidates + predictions_permuted_candidates = trainer.predict(model, pred_sasrec_loader) + for i in range(len(predictions_permuted_candidates)): + assert torch.equal(predictions_permuted_candidates[i][:, ordering], predictions_sorted_candidates[i]) + + +@pytest.mark.torch +@pytest.mark.parametrize( + "candidates", + [torch.FloatTensor([1]), torch.LongTensor([1] * 100000)], +) +def test_prediction_optimized_sasrec_invalid_candidates_to_score( + item_user_sequential_dataset, train_sasrec_llm_loader, candidates +): + trainer = L.Trainer(max_epochs=1) + model = SasRecLLM(tensor_schema=item_user_sequential_dataset._tensor_schema, + profile_emb_dim=train_sasrec_llm_loader.dataset.user_profile_embeddings.shape[0], + max_seq_len=5, + hidden_size=64 + ) + trainer.fit(model, train_sasrec_llm_loader) + + with pytest.raises(ValueError): + model.candidates_to_score = candidates + + +@pytest.mark.torch +@pytest.mark.parametrize( + "optimizer_factory, lr_scheduler_factory", + [ + (None, None), + (FatOptimizerFactory(), None), + (None, FatLRSchedulerFactory()), + (FatOptimizerFactory(), FatLRSchedulerFactory()), + ], +) +def test_sasrec_configure_optimizers(item_user_sequential_dataset, optimizer_factory, lr_scheduler_factory): + if optimizer_factory: + model = SasRecLLM( + tensor_schema=item_user_sequential_dataset._tensor_schema, + profile_emb_dim=1024, + max_seq_len=5, + hidden_size=64, + lr_scheduler_factory=lr_scheduler_factory, + optimizer_factory=optimizer_factory, + ) + else: + model = SasRecLLM( + tensor_schema=item_user_sequential_dataset._tensor_schema, + profile_emb_dim=1024, + max_seq_len=5, + hidden_size=64, + lr_scheduler_factory=lr_scheduler_factory, + ) + + parameters = model.configure_optimizers() + if isinstance(parameters, tuple): + assert isinstance(parameters[0][0], torch.optim.Adam) + assert isinstance(parameters[1][0], torch.optim.lr_scheduler.StepLR) + else: + assert isinstance(parameters, torch.optim.Adam) + + +@pytest.mark.torch +@pytest.mark.parametrize( + "negative_sampling_strategy, negatives_sharing", + [ + ("global_uniform", False), + ("global_uniform", True), + ("inbatch", False), + ("inbatch", True), + ], +) +def test_different_sampling_strategies( + item_user_sequential_dataset, + train_sasrec_llm_loader, + val_sasrec_loader, + negative_sampling_strategy, + negatives_sharing, +): + trainer = L.Trainer(max_epochs=1) + model = SasRecLLM( + tensor_schema=item_user_sequential_dataset._tensor_schema, + profile_emb_dim=train_sasrec_llm_loader.dataset.user_profile_embeddings.shape[0], + max_seq_len=5, + hidden_size=64, + loss_type="BCE", + loss_sample_count=6, + negative_sampling_strategy=negative_sampling_strategy, + negatives_sharing=negatives_sharing, + ) + trainer.fit(model, train_sasrec_llm_loader, val_sasrec_loader) + + +@pytest.mark.torch +def test_not_implemented_sampling_strategy(item_user_sequential_dataset, train_sasrec_llm_loader, val_sasrec_loader): + trainer = L.Trainer(max_epochs=1) + model = SasRecLLM( + tensor_schema=item_user_sequential_dataset._tensor_schema, + profile_emb_dim=train_sasrec_llm_loader.dataset.user_profile_embeddings.shape[0], + max_seq_len=5, + hidden_size=64, + loss_sample_count=6, + ) + model._negative_sampling_strategy = "" + with pytest.raises(NotImplementedError): + trainer.fit(model, train_sasrec_llm_loader, val_sasrec_loader) + + +@pytest.mark.torch +def test_model_predict_with_nn_parallel(item_user_sequential_dataset, simple_masks): + item_sequences, padding_mask, tokens_mask, _ = simple_masks + + model = SasRecLLM( + tensor_schema=item_user_sequential_dataset._tensor_schema, + profile_emb_dim=1024, + max_seq_len=5, + hidden_size=64, + loss_sample_count=6, + ) + + model._model = torch.nn.DataParallel(model._model) + model._model_predict({"item_id": item_sequences}, padding_mask) + + +@pytest.mark.torch +def test_sasrec_get_embeddings(tensor_schema): + model = SasRecLLM(tensor_schema, profile_emb_dim=1024) + model_ti = SasRecLLM(tensor_schema, profile_emb_dim=1024, ti_modification=True) + + model_embeddings = model.get_all_embeddings() + model_ti_embeddings = model_ti.get_all_embeddings() + + model_item_embedding = model_embeddings["item_embedding"] + model_ti_item_embedding = model_ti_embeddings["item_embedding"] + + # Check number of embeddings for each layer in sasrec + assert len(model_embeddings) == 2 + assert len(model_ti_embeddings) == 5 + + # Check types + assert isinstance(model_item_embedding, torch.Tensor) + assert isinstance(model_ti_item_embedding, torch.Tensor) + + # Ensure we got copies + assert id(model_item_embedding) != id(model._model.item_embedder.item_emb) + assert id(model_ti_item_embedding) != id(model_ti._model.item_embedder.item_emb) + + # Ensure we got same values + assert torch.eq(model_item_embedding, model._model.item_embedder.item_emb.weight.data[:-1, :]).all() + assert torch.eq(model_ti_item_embedding, model_ti._model.item_embedder.item_emb.weight.data[:-1, :]).all() + + +@pytest.mark.torch +def test_sasrec_fine_tuning_on_new_items_by_size(fitted_sasrec, new_items_dataset): + model, tokenizer = fitted_sasrec + old_items_data = model._model.item_embedder.item_emb.weight.data + shape = old_items_data.shape + old_vocab_size = len(tokenizer.item_id_encoder.mapping["item_id"]) + + tokenizer.item_id_encoder.partial_fit(new_items_dataset) + new_vocab_size = len(tokenizer.item_id_encoder.mapping["item_id"]) + + model.set_item_embeddings_by_size(new_vocab_size) + new_items_data = model._model.item_embedder.item_emb.weight.data + new_shape = new_items_data.shape + + assert shape == (5, 50) + assert old_vocab_size == 4 + assert new_vocab_size == 5 + assert new_shape == (6, 50) + for item_num in range(old_vocab_size): + assert torch.eq(old_items_data[item_num], new_items_data[item_num]).all() + + +@pytest.mark.torch +def test_sasrec_fine_tuning_on_new_items_by_tensor(fitted_sasrec, new_items_dataset): + model, tokenizer = fitted_sasrec + tokenizer.item_id_encoder.partial_fit(new_items_dataset) + + new_items_tensor = torch.rand(5, 50) + model.set_item_embeddings_by_tensor(new_items_tensor) + + new_items_data = model._model.item_embedder.item_emb.weight.data + new_shape = new_items_data.shape + + assert new_shape == (6, 50) + for item_num in range(new_shape[0] - 1): + assert torch.eq(new_items_tensor[item_num], new_items_data[item_num]).all() + + +@pytest.mark.torch +def test_sasrec_fine_tuning_on_new_items_by_appending(fitted_sasrec, new_items_dataset): + model, tokenizer = fitted_sasrec + tokenizer.item_id_encoder.partial_fit(new_items_dataset) + old_items_tensor = model._model.item_embedder.item_emb.weight.data + + only_new_items_tensor = torch.rand(1, 50) + model.append_item_embeddings(only_new_items_tensor) + + new_items_data = model._model.item_embedder.item_emb.weight.data + new_shape = new_items_data.shape + + assert new_shape == (6, 50) + for item_num in range(old_items_tensor.shape[0] - 1): + assert torch.eq(old_items_tensor[item_num], new_items_data[item_num]).all() + assert torch.eq(only_new_items_tensor, new_items_data[4]).all() + + +@pytest.mark.torch +def test_sasrec_fine_tuning_save_load(fitted_sasrec, new_items_dataset, train_sasrec_llm_loader): + model, tokenizer = fitted_sasrec + trainer = L.Trainer(max_epochs=1) + tokenizer.item_id_encoder.partial_fit(new_items_dataset) + new_vocab_size = len(tokenizer.item_id_encoder.mapping["item_id"]) + model.set_item_embeddings_by_size(new_vocab_size) + trainer.fit(model, train_sasrec_llm_loader) + trainer.save_checkpoint("test.ckpt") + best_model = SasRecLLM.load_from_checkpoint("test.ckpt") + + assert best_model.get_all_embeddings()["item_embedding"].shape[0] == new_vocab_size + + +@pytest.mark.torch +def test_sasrec_fine_tuning_errors(fitted_sasrec): + model, _ = fitted_sasrec + + with pytest.raises(ValueError): + model.set_item_embeddings_by_size(3) + with pytest.raises(ValueError): + model.set_item_embeddings_by_tensor(torch.rand(1, 1, 1)) + with pytest.raises(ValueError): + model.set_item_embeddings_by_tensor(torch.rand(3, 50)) + with pytest.raises(ValueError): + model.set_item_embeddings_by_tensor(torch.rand(4, 1)) + with pytest.raises(ValueError): + model.append_item_embeddings(torch.rand(1, 1, 1)) + with pytest.raises(ValueError): + model.append_item_embeddings(torch.rand(1, 1)) + + +@pytest.mark.torch +def test_sasrec_get_init_parameters(fitted_sasrec): + model, _ = fitted_sasrec + params = model.hparams + + assert params["tensor_schema"].item().cardinality == 4 + assert params["max_seq_len"] == 5 + assert params["hidden_size"] == 50 + + +def test_predict_step_with_small_seq_len(item_user_num_sequential_dataset, simple_masks): + item_sequences, padding_mask, _, _ = simple_masks + + model = SasRecLLM( + tensor_schema=item_user_num_sequential_dataset._tensor_schema, + profile_emb_dim=1024, + max_seq_len=10, + hidden_size=64, + loss_sample_count=6, + ) + + batch = SasRecPredictionBatch( + torch.arange(0, 4), + padding_mask, + {"item_id": item_sequences, "num_feature": item_sequences}, + ) + model.predict_step(batch, 0) + + +@pytest.mark.torch +def test_predict_step_with_big_seq_len(item_user_sequential_dataset, simple_masks): + item_sequences, padding_mask, _, _ = simple_masks + + model = SasRecLLM( + tensor_schema=item_user_sequential_dataset._tensor_schema, + profile_emb_dim=1024, + max_seq_len=3, + hidden_size=64, + loss_sample_count=6, + ) + + batch = SasRecPredictionBatch(torch.arange(0, 4), padding_mask, {"item_id": item_sequences}) + with pytest.raises(ValueError): + model.predict_step(batch, 0) + + +@pytest.mark.torch +def test_sasrec_get_set_optim_factory(item_user_sequential_dataset): + optim_factory = FatOptimizerFactory() + model = SasRecLLM(tensor_schema=item_user_sequential_dataset._tensor_schema, + profile_emb_dim=1024, + optimizer_factory=optim_factory + ) + + assert model.optimizer_factory is optim_factory + new_factory = FatOptimizerFactory(learning_rate=0.1) + model.optimizer_factory = new_factory + assert model.optimizer_factory is new_factory + + +@pytest.mark.torch +def test_sasrec_set_invalid_optim_factory(item_user_sequential_dataset): + model = SasRecLLM(tensor_schema=item_user_sequential_dataset._tensor_schema, profile_emb_dim=1024) + new_factory = "Let's say it's an optimizer_factory" + with pytest.raises(ValueError): + model.optimizer_factory = new_factory diff --git a/tests/models/nn/sequential/sasrec_with_llm/test_sasrec_with_llm_model.py b/tests/models/nn/sequential/sasrec_with_llm/test_sasrec_with_llm_model.py new file mode 100644 index 000000000..77a80af60 --- /dev/null +++ b/tests/models/nn/sequential/sasrec_with_llm/test_sasrec_with_llm_model.py @@ -0,0 +1,93 @@ +import pytest + +from replay.utils import TORCH_AVAILABLE + +if TORCH_AVAILABLE: + import torch + + from replay.models.nn.sequential.sasrec_with_llm import SasRecLLMModel + + +@pytest.mark.torch +@pytest.mark.parametrize( + "ti_modification", + [ + (False), + (True), + ], +) +def test_sasrec_forward(tensor_schema, simple_masks, ti_modification): + model = SasRecLLMModel( + tensor_schema.subset(["item_id", "timestamp"]), + profile_emb_dim=1024, + hidden_size=64, + max_len=5, + ti_modification=ti_modification, + ) + item_sequences, padding_mask, _, timestamp_sequences = simple_masks + inputs = {"item_id": item_sequences, "timestamp": timestamp_sequences} + output, hidden_states = model(inputs, padding_mask) + assert output.size() == (4, 5, 4) + + +@pytest.mark.torch +def test_sasrec_predictions(tensor_schema, simple_masks): + model = SasRecLLMModel(tensor_schema.subset(["item_id"]), profile_emb_dim=1024, hidden_size=64, max_len=5) + item_sequences, padding_mask, _, _ = simple_masks + inputs = { + "item_id": item_sequences, + } + + candidates_to_score = torch.range(0, tensor_schema["item_id"].cardinality - 1, 1, dtype=torch.long) + predictions_all_candidates = model.predict(inputs, padding_mask, candidates_to_score) + predictions_all = model.predict(inputs, padding_mask) + assert predictions_all.size() == predictions_all_candidates.size() + + candidates_to_score = torch.tensor([0, 1]) + predictions_candidates = model.predict(inputs, padding_mask, candidates_to_score) + assert predictions_candidates.size() == torch.Size([padding_mask.shape[0], candidates_to_score.shape[0]]) + + +def test_predictions_equal_with_permuted_candidates(tensor_schema, simple_masks): + model = SasRecLLMModel(tensor_schema.subset(["item_id"]), profile_emb_dim=1024, hidden_size=64, max_len=5) + item_sequences, padding_mask, _, _ = simple_masks + inputs = { + "item_id": item_sequences, + } + sorted_candidates = torch.LongTensor([0, 1, 2, 3]) + permuted_candidates = torch.LongTensor([3, 0, 2, 1]) + _, ordering = torch.sort(permuted_candidates) + model.eval() + + predictions_sorted_candidates = model.predict(inputs, padding_mask, sorted_candidates) + predictions_permuted_candidates = model.predict(inputs, padding_mask, permuted_candidates) + assert torch.equal(predictions_permuted_candidates[:, ordering], predictions_sorted_candidates) + + +@pytest.mark.torch +def test_item_embedder_weights(tensor_schema): + item_embedder = SasRecLLMModel( + tensor_schema.subset(["item_id", "timestamp"]), + profile_emb_dim=1024, + hidden_size=64, + max_len=5, + ti_modification=True, + ).item_embedder + + assert item_embedder.get_item_weights(torch.tensor([0, 1, 2, 3])).size() == (4, 64) + + +@pytest.mark.torch +def test_sasrec_forward_with_float_timematrix(tensor_schema, simple_masks): + model = SasRecLLMModel( + tensor_schema.subset(["item_id", "timestamp"]), + profile_emb_dim=1024, + hidden_size=64, + max_len=5, + ti_modification=True, + ) + item_sequences, padding_mask, _, timestamp_sequences = simple_masks + timestamp_sequences = timestamp_sequences.float() + inputs = {"item_id": item_sequences, "timestamp": timestamp_sequences} + output, hidden_states = model(inputs, padding_mask) + assert output.size() == (4, 5, 4)