aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh de Kock <joshdk@obe.tv>2018-10-09 13:07:15 +0100
committerKieran Kunhya <kierank@obe.tv>2018-10-26 11:51:04 +0100
commitfb7925ba2fa10e1ecf63eb4bada268e25627a88d (patch)
treeaa088ab03e7ac48aea3d02278bc98e4ab745b9c4
parent0a055f463a60af764c083fd0ba3112037557de4b (diff)
downloadffmpeg-fb7925ba2fa10e1ecf63eb4bada268e25627a88d.tar.gz
fate: add api-h264-slice test
This test ensures that you are able to send N number of slice NALUs in slice threaded mode to be decoded simultaneously
-rw-r--r--tests/api/Makefile1
-rw-r--r--tests/api/api-h264-slice-test.c221
-rw-r--r--tests/fate/api.mak4
-rw-r--r--tests/ref/fate/api-h264-slice309
4 files changed, 535 insertions, 0 deletions
diff --git a/tests/api/Makefile b/tests/api/Makefile
index 759dd9d243..b5c4ccae23 100644
--- a/tests/api/Makefile
+++ b/tests/api/Makefile
@@ -1,5 +1,6 @@
APITESTPROGS-$(call ENCDEC, FLAC, FLAC) += api-flac
APITESTPROGS-$(call DEMDEC, H264, H264) += api-h264
+APITESTPROGS-$(call DEMDEC, H264, H264) += api-h264-slice
APITESTPROGS-yes += api-seek
APITESTPROGS-yes += api-codec-param
APITESTPROGS-$(call DEMDEC, H263, H263) += api-band
diff --git a/tests/api/api-h264-slice-test.c b/tests/api/api-h264-slice-test.c
new file mode 100644
index 0000000000..1d37a85d95
--- /dev/null
+++ b/tests/api/api-h264-slice-test.c
@@ -0,0 +1,221 @@
+/*
+ * Copyright (c) 2001 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#define MAX_SLICES 8
+
+// ./fate 2 ./crew_cif out.y4m
+
+#include "config.h"
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#if HAVE_IO_H
+#include <io.h>
+#endif
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "libavformat/network.h"
+#include "libavcodec/avcodec.h"
+#include "libavutil/pixdesc.h"
+#include "libavutil/hash.h"
+
+static int header = 0;
+
+static void decode(AVCodecContext *dec_ctx, AVFrame *frame,
+ AVPacket *pkt)
+{
+ static uint64_t frame_cnt = 0;
+ int ret;
+
+ ret = avcodec_send_packet(dec_ctx, pkt);
+ if (ret < 0) {
+ fprintf(stderr, "Error sending a packet for decoding: %s\n", av_err2str(ret));
+ exit(1);
+ }
+
+ while (ret >= 0) {
+ const AVPixFmtDescriptor *desc;
+ char *sum;
+ struct AVHashContext *hash;
+
+ ret = avcodec_receive_frame(dec_ctx, frame);
+ if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
+ return;
+ } else if (ret < 0) {
+ fprintf(stderr, "Error during decoding: %s\n", av_err2str(ret));
+ exit(1);
+ }
+
+ if (!header) {
+ printf(
+ "#format: frame checksums\n"
+ "#version: 2\n"
+ "#hash: MD5\n"
+ "#tb 0: 1/30\n"
+ "#media_type 0: video\n"
+ "#codec_id 0: rawvideo\n"
+ "#dimensions 0: 352x288\n"
+ "#sar 0: 128/117\n"
+ "#stream#, dts, pts, duration, size, hash\n");
+ header = 1;
+ }
+ desc = av_pix_fmt_desc_get(dec_ctx->pix_fmt);
+ av_hash_alloc(&hash, "md5");
+ av_hash_init(hash);
+ sum = av_mallocz(av_hash_get_size(hash) * 2 + 1);
+
+ for (int i = 0; i < frame->height; i++)
+ av_hash_update(hash, &frame->data[0][i * frame->linesize[0]], frame->width);
+ for (int i = 0; i < frame->height >> desc->log2_chroma_h; i++)
+ av_hash_update(hash, &frame->data[1][i * frame->linesize[1]], frame->width >> desc->log2_chroma_w);
+ for (int i = 0; i < frame->height >> desc->log2_chroma_h; i++)
+ av_hash_update(hash, &frame->data[2][i * frame->linesize[2]], frame->width >> desc->log2_chroma_w);
+
+ av_hash_final_hex(hash, sum, av_hash_get_size(hash) * 2 + 1);
+ printf("0, %10"PRId64", %10"PRId64", 1, %8d, %s\n",
+ frame_cnt, frame_cnt,
+ (frame->width * frame->height + 2 * (frame->height >> desc->log2_chroma_h) * (frame->width >> desc->log2_chroma_w)), sum);
+ frame_cnt += 1;
+ av_free(hash);
+ av_free(sum);
+ }
+}
+
+int main(int argc, char **argv)
+{
+ const AVCodec *codec;
+ AVCodecContext *c = NULL;
+ AVFrame *frame;
+ unsigned int threads;
+ AVPacket *pkt;
+ FILE *fd;
+ char nal[MAX_SLICES * UINT16_MAX + AV_INPUT_BUFFER_PADDING_SIZE];
+ int nals = 0;
+ char *p = nal;
+
+ if (argc < 4) {
+ fprintf(stderr, "Usage: %s <threads> <input file> <output file>\n", argv[0]);
+ exit(1);
+ }
+
+ if (!(threads = strtoul(argv[1], NULL, 0)))
+ threads = 1;
+ else if (threads > MAX_SLICES)
+ threads = MAX_SLICES;
+
+#ifdef _WIN32
+ setmode(fileno(stdout), O_BINARY);
+#endif
+
+ if (!(pkt = av_packet_alloc()))
+ exit(1);
+
+ if (!(codec = avcodec_find_decoder(AV_CODEC_ID_H264))) {
+ fprintf(stderr, "Codec not found\n");
+ exit(1);
+ }
+
+ if (!(c = avcodec_alloc_context3(codec))) {
+ fprintf(stderr, "Could not allocate video codec context\n");
+ exit(1);
+ }
+
+ c->width = 352;
+ c->height = 288;
+
+ c->flags2 |= AV_CODEC_FLAG2_CHUNKS;
+ c->thread_type = FF_THREAD_SLICE;
+ c->thread_count = threads;
+
+ if (avcodec_open2(c, codec, NULL) < 0) {
+ fprintf(stderr, "Could not open codec\n");
+ exit(1);
+ }
+
+#if HAVE_THREADS
+ if (c->active_thread_type != FF_THREAD_SLICE) {
+ fprintf(stderr, "Couldn't activate slice threading: %d\n", c->active_thread_type);
+ exit(1);
+ }
+#else
+ fprintf(stderr, "WARN: not using threads, only checking decoding slice NALUs\n");
+#endif
+
+ if (!(frame = av_frame_alloc())) {
+ fprintf(stderr, "Could not allocate video frame\n");
+ exit(1);
+ }
+
+ if (!(fd = fopen(argv[2], "rb"))) {
+ fprintf(stderr, "Couldn't open NALU file: %s\n", argv[2]);
+ exit(1);
+ }
+
+ while(1) {
+ uint16_t size = 0;
+ ssize_t ret = fread(&size, 1, sizeof(uint16_t), fd);
+ if (ret < 0) {
+ perror("Couldn't read size");
+ exit(1);
+ } else if (ret != sizeof(uint16_t))
+ break;
+ size = ntohs(size);
+ ret = fread(p, 1, size, fd);
+ if (ret < 0 || ret != size) {
+ perror("Couldn't read data");
+ exit(1);
+ }
+ p += ret;
+
+ if (++nals >= threads) {
+ pkt->data = nal;
+ pkt->size = p - nal;
+ decode(c, frame, pkt);
+ memset(nal, 0, MAX_SLICES * UINT16_MAX + AV_INPUT_BUFFER_PADDING_SIZE);
+ nals = 0;
+ p = nal;
+ }
+ }
+
+ if (nals) {
+ pkt->data = nal;
+ pkt->size = p - nal;
+ decode(c, frame, pkt);
+ }
+
+ decode(c, frame, NULL);
+
+ fclose(fd);
+ avcodec_free_context(&c);
+ av_frame_free(&frame);
+ av_packet_free(&pkt);
+
+ return 0;
+}
diff --git a/tests/fate/api.mak b/tests/fate/api.mak
index eb656e68a3..132c38f2c2 100644
--- a/tests/fate/api.mak
+++ b/tests/fate/api.mak
@@ -12,6 +12,10 @@ FATE_API_SAMPLES_LIBAVFORMAT-$(call DEMDEC, H264, H264) += fate-api-h264
fate-api-h264: $(APITESTSDIR)/api-h264-test$(EXESUF)
fate-api-h264: CMD = run $(APITESTSDIR)/api-h264-test $(TARGET_SAMPLES)/h264-conformance/SVA_NL2_E.264
+FATE_API_SAMPLES_LIBAVFORMAT-$(call DEMDEC, H264, H264) += fate-api-h264-slice
+fate-api-h264-slice: $(APITESTSDIR)/api-h264-slice-test$(EXESUF)
+fate-api-h264-slice: CMD = run $(APITESTSDIR)/api-h264-slice-test 2 $(TARGET_SAMPLES)/h264/crew_cif.nal api-h264-slice.h264
+
FATE_API_LIBAVFORMAT-$(call DEMDEC, FLV, FLV) += fate-api-seek
fate-api-seek: $(APITESTSDIR)/api-seek-test$(EXESUF) fate-lavf-flv_fmt
fate-api-seek: CMD = run $(APITESTSDIR)/api-seek-test $(TARGET_PATH)/tests/data/lavf/lavf.flv 0 720
diff --git a/tests/ref/fate/api-h264-slice b/tests/ref/fate/api-h264-slice
new file mode 100644
index 0000000000..1d463d30ac
--- /dev/null
+++ b/tests/ref/fate/api-h264-slice
@@ -0,0 +1,309 @@
+#format: frame checksums
+#version: 2
+#hash: MD5
+#tb 0: 1/30
+#media_type 0: video
+#codec_id 0: rawvideo
+#dimensions 0: 352x288
+#sar 0: 128/117
+#stream#, dts, pts, duration, size, hash
+0, 0, 0, 1, 152064, 28a2f99d62b553403fcffc1f680d5403
+0, 1, 1, 1, 152064, cd95f40841e08160ace0d64506f8adbf
+0, 2, 2, 1, 152064, 32f37a1b3ddc2b8b0f6283f0c403a976
+0, 3, 3, 1, 152064, 643c0b0702072038578ef5ae2000c1a0
+0, 4, 4, 1, 152064, 8d9c9660705f7533e7f49f11693aedf9
+0, 5, 5, 1, 152064, 66a794f8a116c055451091e0e4cd911e
+0, 6, 6, 1, 152064, 8ad529648796ae6da279de0b7ca34f72
+0, 7, 7, 1, 152064, 898ad4170eb740d713de254eb4bfe255
+0, 8, 8, 1, 152064, f96cfc1f00df10003e144529a5fae6c6
+0, 9, 9, 1, 152064, 0351a3b68dc87ba5963624e1461788da
+0, 10, 10, 1, 152064, 6718e4086a0039584bcc37dcd4be6a67
+0, 11, 11, 1, 152064, fb4fec78d9434b9579b31f8ad0472762
+0, 12, 12, 1, 152064, ec2dcc547d84e15383dcee8462bb9d0c
+0, 13, 13, 1, 152064, ea62711bf59b4d1d56cb9dbcb68a8eda
+0, 14, 14, 1, 152064, 75b1cb899a9d9e695106f187c20b91f8
+0, 15, 15, 1, 152064, 44a13e4235c2ed3692af5ef698efe4d3
+0, 16, 16, 1, 152064, 6d5f1249d96573782fa95e9228d1ad0a
+0, 17, 17, 1, 152064, fce8503dd9472fc7932ffbe21425d45a
+0, 18, 18, 1, 152064, e93489a6b4c38d611493a3721aa994d7
+0, 19, 19, 1, 152064, 04580677a663ddba1b747c2ab0d598e6
+0, 20, 20, 1, 152064, a28cceb666c92eaecc3da3e092b83715
+0, 21, 21, 1, 152064, ba9ce0f84fb16c27453666265ad54e35
+0, 22, 22, 1, 152064, 946e014822ab2b45c52d3e08e7db97c2
+0, 23, 23, 1, 152064, b7a40ebb6ac72b322ccfca2568fa521a
+0, 24, 24, 1, 152064, cb5a0564af00a00496950ad705a160ce
+0, 25, 25, 1, 152064, dbad9e8e79c04b1df497884ec28e3a59
+0, 26, 26, 1, 152064, 3c748cdc0e6ec79ca72482e22f0c3ef8
+0, 27, 27, 1, 152064, 1740911da2ebbdc729cbbea0df466c44
+0, 28, 28, 1, 152064, 3b322e03fcc16d6a0dea651634ce0b40
+0, 29, 29, 1, 152064, a7fca405425015b85cb58ec1aece575b
+0, 30, 30, 1, 152064, 2004eec0c923f1855b4b918e6dcb5e02
+0, 31, 31, 1, 152064, 20542f58f1622f58f3cbf4b2bf0b772f
+0, 32, 32, 1, 152064, 8872f5cb900ed8d317f3abe50a147934
+0, 33, 33, 1, 152064, 774ba43dc0cd7932099e3e0633e25721
+0, 34, 34, 1, 152064, 4f2d9b7e6d115bd103ccd9945f85582f
+0, 35, 35, 1, 152064, f53542ca7f6d5ec462770ffff3f4bfd0
+0, 36, 36, 1, 152064, 43b5f8c4e6dc3dc1acc903687bc90293
+0, 37, 37, 1, 152064, aa7d265ab285ded777a970debe6a08d5
+0, 38, 38, 1, 152064, 818ae082b3dd9557e04710d7cfd700be
+0, 39, 39, 1, 152064, 44cfe472ccedf8a44d0b90c97932caae
+0, 40, 40, 1, 152064, 5d2756c81c90bb10484e2e892fce0e0c
+0, 41, 41, 1, 152064, c1b254a4b66dc9d769e10316976f5538
+0, 42, 42, 1, 152064, 03808a3f7b01293dbe6089b33e3dc103
+0, 43, 43, 1, 152064, 8c689a6143a8a89415d2e645bb0fe925
+0, 44, 44, 1, 152064, 24268cac7d78eefd8e247ec599e60b4f
+0, 45, 45, 1, 152064, ac3195c57a3ebe3871992acfc3182e2f
+0, 46, 46, 1, 152064, 8730a99fb5a2573475f61d4e7998ba44
+0, 47, 47, 1, 152064, 651042c34273096db82879fcdd91310d
+0, 48, 48, 1, 152064, 972b47241098a9b6471ba6c8ccc2b83b
+0, 49, 49, 1, 152064, e8e53022355e6bf7ac50d53bcb1bdc92
+0, 50, 50, 1, 152064, e5b003b04a88e0d60d446eb5b600cc66
+0, 51, 51, 1, 152064, 1c2317c071a33b0b465bbcea04411ddf
+0, 52, 52, 1, 152064, 7bd53f4e852370aaeb6b0d042d24b94a
+0, 53, 53, 1, 152064, 6ef30966b0d9c0d92b2350e2f45197a8
+0, 54, 54, 1, 152064, 354e2afff0d056193d6c4c2667c638d3
+0, 55, 55, 1, 152064, e67767e97f44c3ef80ea4acee41af0ff
+0, 56, 56, 1, 152064, 32589395bf7d07c1c6df644d43b5bbba
+0, 57, 57, 1, 152064, 2f2b56210b87142fa3620cce5c56af02
+0, 58, 58, 1, 152064, 599781773ace555c82ac591cc2acf8ec
+0, 59, 59, 1, 152064, 2465cf6313dab6bda9171993ff6168de
+0, 60, 60, 1, 152064, 54cc6c8a9b3fd95b9700d319c4a69297
+0, 61, 61, 1, 152064, 9e813429ebf7ee4e11fcd4976974fea0
+0, 62, 62, 1, 152064, fac0303897b4d1bd1a202fe0a7d1c6f7
+0, 63, 63, 1, 152064, accb382b99f2d27cefbc9f7ea315f80c
+0, 64, 64, 1, 152064, b88711feaee9f7f84da34028b7e2cc81
+0, 65, 65, 1, 152064, 80549aebdcc5629dfc3bee8112536bac
+0, 66, 66, 1, 152064, 9c63aa480b5d9937d839b809ba67eee2
+0, 67, 67, 1, 152064, 5e5a729c45a995ba2a97083fca69c9e9
+0, 68, 68, 1, 152064, 6b59c5d4460d78fa337b94b080e72215
+0, 69, 69, 1, 152064, 166d675f774f4f74dbce7e2728afd16c
+0, 70, 70, 1, 152064, 3051629ff9281ea8879bce0ed62c1e71
+0, 71, 71, 1, 152064, c2ff4493434ca4fea45c724c10bcbe55
+0, 72, 72, 1, 152064, 907274f16ebeb7c09de8bc124c1fe586
+0, 73, 73, 1, 152064, 88efefc9fc00d88fbce20f4d74a55d25
+0, 74, 74, 1, 152064, 357bdbcb828c088b748022df9e47b9c7
+0, 75, 75, 1, 152064, 4550087923c1d4195ab536899a99d429
+0, 76, 76, 1, 152064, 2b07777d9109577eaedc87321dd3ff69
+0, 77, 77, 1, 152064, 4a377c552c62cba06d5285aa8478a540
+0, 78, 78, 1, 152064, a0e893c028e106c2394f0578f00ae88a
+0, 79, 79, 1, 152064, c0db0e2ee3768d2e4e71581a2be30707
+0, 80, 80, 1, 152064, 954e0cd38b00ea2181b8c322511536f0
+0, 81, 81, 1, 152064, 53ff687670a2490ac3f94405014251b8
+0, 82, 82, 1, 152064, 64a588b7adbc560ec4ad6823c37e41c6
+0, 83, 83, 1, 152064, 60d65e899976214cd3b2b5abb10f2b83
+0, 84, 84, 1, 152064, 1bf0efef4b204a72d05b21c18a569585
+0, 85, 85, 1, 152064, 65d814be6b698ab1185f082c9c9d7de3
+0, 86, 86, 1, 152064, de26e7e663aaeb642e0a94776c5bf22c
+0, 87, 87, 1, 152064, f7b0b259ccf21e59fcacd95945a013c3
+0, 88, 88, 1, 152064, 7f3185bb4dc3368733bd29c9aa9e08eb
+0, 89, 89, 1, 152064, 3cedc14798d145fcdc8b8a3082de3b88
+0, 90, 90, 1, 152064, c5792622ca4a04d21e1f2c2b2ff692fe
+0, 91, 91, 1, 152064, d13199fa94e53643902a8a26e33c9862
+0, 92, 92, 1, 152064, b380359e836896d7698a8dadfe6d6fdc
+0, 93, 93, 1, 152064, 4c7c5f1f093f7bcaddf06068b9b1d2e5
+0, 94, 94, 1, 152064, 73f33e1eedea9aa5e6c3f2b636dd2c23
+0, 95, 95, 1, 152064, f0d2aad6477ace945f87b25cb44f3ff0
+0, 96, 96, 1, 152064, d90bddd7c2279bbd0266a26915202712
+0, 97, 97, 1, 152064, 0b377a48dea8fc2702395796808af63f
+0, 98, 98, 1, 152064, ea0099179e806a9680f019446e39d125
+0, 99, 99, 1, 152064, a77dd3069c54b255e45b261f31be80d2
+0, 100, 100, 1, 152064, d362dcbe415329e713ff6ef9e6447d87
+0, 101, 101, 1, 152064, 15441bcb307ac24766ceba8db42f9413
+0, 102, 102, 1, 152064, 79b953e72d11d3fa6d6974e4b8b13392
+0, 103, 103, 1, 152064, ec8c35c829fac56ca8ae2f0160ae5d7f
+0, 104, 104, 1, 152064, c104f8f1d17629b0449f4a2af2e40f73
+0, 105, 105, 1, 152064, 4661c4b3c2b1a03a8e23e7e88e974f22
+0, 106, 106, 1, 152064, 7cb48bae9841f67294b2e25a73d46a8e
+0, 107, 107, 1, 152064, bddcb2c64a4257760f50714ec8c49243
+0, 108, 108, 1, 152064, c2123750802357c25c352f09bd1b1de2
+0, 109, 109, 1, 152064, 6eb5af4f3ad69cc88e0c08f6aa9bb034
+0, 110, 110, 1, 152064, 063991a633a051d6889f0fff41059e5f
+0, 111, 111, 1, 152064, fa736839a01ad04fe08d437c7fa60a2d
+0, 112, 112, 1, 152064, 85a43397c5a1defe15b61464c8d1457a
+0, 113, 113, 1, 152064, da50c437613be59486012b69c7953f63
+0, 114, 114, 1, 152064, eb32e24757a98192928324d3a389a3dc
+0, 115, 115, 1, 152064, 1bf511fb8245e3be71ebefdcf506575d
+0, 116, 116, 1, 152064, 4479c195c4cd4111afe561a07c0f626d
+0, 117, 117, 1, 152064, 0b1815f0c28bb55aae515a5dc3a34f3b
+0, 118, 118, 1, 152064, 300d3c32442bd554384b3c804dd519ad
+0, 119, 119, 1, 152064, 197df868e0488b8b12c0b42d8c4b2aec
+0, 120, 120, 1, 152064, 03bce34c3214e0144a0928b9b9acc8e8
+0, 121, 121, 1, 152064, ba73a879b8fca5db4a354075b26ccb6a
+0, 122, 122, 1, 152064, b1c34c6d2535bf1e7af3a6936d1627df
+0, 123, 123, 1, 152064, 77d162995974428c5c7766ee5627eac1
+0, 124, 124, 1, 152064, fa4c70aa68850bcae2579046557c0b5f
+0, 125, 125, 1, 152064, 63ce618e67f380000030c97db78ac4ae
+0, 126, 126, 1, 152064, 7e32538d501127faf058792e83fbbe43
+0, 127, 127, 1, 152064, 61bc1d685553a97a7c3b0cbb3790faad
+0, 128, 128, 1, 152064, 57f3b97e4a80ded30b9e8f12cfc8ff44
+0, 129, 129, 1, 152064, 31db51a64307ca6f1db866a01befa301
+0, 130, 130, 1, 152064, 59924d342068caf1ad7329b947279e2d
+0, 131, 131, 1, 152064, 2f0f9dd3056cac40c17684bcccdf267d
+0, 132, 132, 1, 152064, b00df17142f99bdc077cb2e4c5c8b747
+0, 133, 133, 1, 152064, e7c40734dea5433038b975666be7b21e
+0, 134, 134, 1, 152064, 51d77965d3a9d431a2c409244c9bc465
+0, 135, 135, 1, 152064, 15b54bdc5e2098fe7c01ce689babe08b
+0, 136, 136, 1, 152064, 3fa3284ae3f714ea197ad614bff7c5c5
+0, 137, 137, 1, 152064, c6512a19b7b1b29c05c7b825b41ab930
+0, 138, 138, 1, 152064, b13c8bc436186d47595dc69186f1f927
+0, 139, 139, 1, 152064, d5eff490784883a93dd3aaea08c46d5b
+0, 140, 140, 1, 152064, a005ac77851ea3a44e261d9067ee835f
+0, 141, 141, 1, 152064, 6706b74dc10c72f27e9f6341710e56ac
+0, 142, 142, 1, 152064, 46479f86f53f55d2094354eb9bed78df
+0, 143, 143, 1, 152064, 17f5cd040eb766ece29d1c1e283e9c20
+0, 144, 144, 1, 152064, 4f34c43eeeac2c751aac486ba42d9b9a
+0, 145, 145, 1, 152064, 24c16b9d01c316305686af1a12f7be49
+0, 146, 146, 1, 152064, 9ae9b1f109fa3d02f226fefdaf395be6
+0, 147, 147, 1, 152064, eb98c1c6e473d8b53069206ffc69a9cb
+0, 148, 148, 1, 152064, f0768d9cb981d277b70d1b3b928f4915
+0, 149, 149, 1, 152064, c1a5cef2bdb3f3b932a051c29d31f889
+0, 150, 150, 1, 152064, 8f75fb3a6f994b90999f8b0c664ad7c4
+0, 151, 151, 1, 152064, 3a778c9c86afaf03f2e60668d849e25b
+0, 152, 152, 1, 152064, 4c3dd11965a2cf55790088a99289981a
+0, 153, 153, 1, 152064, 763f810845e6f4e798a6edb6633f5506
+0, 154, 154, 1, 152064, 6b305b9d79151c1644c924d522091eea
+0, 155, 155, 1, 152064, e981ce0e01f24eca2e89c7c81480fb07
+0, 156, 156, 1, 152064, 91349f36d44383dc1cd72f0a3f9c76ed
+0, 157, 157, 1, 152064, 9a67f029ed2370983ff3e24d8c2c65d2
+0, 158, 158, 1, 152064, cf5717cb593fbafad6abf8bdb7ca2737
+0, 159, 159, 1, 152064, 7ece8c2497ca72e4f8e9eb69048391f8
+0, 160, 160, 1, 152064, 9dccce22ca32a7ec8890f77e4de1fa42
+0, 161, 161, 1, 152064, f418dc75e266c47ba84275741f0635cb
+0, 162, 162, 1, 152064, aeddab213baab78ed0c44abb7409e291
+0, 163, 163, 1, 152064, a0b5e3c0616105580a310529ed71d072
+0, 164, 164, 1, 152064, e0e96da8724b472868634b6b145ebb2e
+0, 165, 165, 1, 152064, bdaaf9623f5d329c8706e4850db0beea
+0, 166, 166, 1, 152064, 6566ddd82da9096458e039caa7d56674
+0, 167, 167, 1, 152064, b882cb5f1c6059d338273e8fdb18e41e
+0, 168, 168, 1, 152064, f9723e59ce02828e64c16d32216441b2
+0, 169, 169, 1, 152064, 98b5a843bf125eeae0240bde40016d6a
+0, 170, 170, 1, 152064, 8958b81f8a028928c4b9a7024a4eebff
+0, 171, 171, 1, 152064, 25a8acfdd14a472a8090d41626472070
+0, 172, 172, 1, 152064, 6faf859c0b264b6d76e0823c6045cebd
+0, 173, 173, 1, 152064, 0774a3470360c37ede375d19aebe1844
+0, 174, 174, 1, 152064, 5dd921d4f05976fb6bbf5cc6996254e0
+0, 175, 175, 1, 152064, d03d789e3c439420a07e3e919ddd1cf0
+0, 176, 176, 1, 152064, 1fad139023f7d7022f8f65a6e31f68a9
+0, 177, 177, 1, 152064, 0c706070d649da054eeaf686d2e14a1d
+0, 178, 178, 1, 152064, 51e4156b19bdc55e993d1956473827e3
+0, 179, 179, 1, 152064, e447458fd86c022852cedf56dc58f34f
+0, 180, 180, 1, 152064, 59732caeb824f052044b4434ef564227
+0, 181, 181, 1, 152064, cf5ccf671ddc89e1f430878afb86fced
+0, 182, 182, 1, 152064, e3e98f92e4cf8f0ccce27482407ebbf1
+0, 183, 183, 1, 152064, 089d236d04d1918b319524e3002d21c8
+0, 184, 184, 1, 152064, 7063afc35aa2c24b1e3dc781bb612af1
+0, 185, 185, 1, 152064, 902e5153028215ac60bf0f998673e3ca
+0, 186, 186, 1, 152064, 2360fb2ed2b0e7c37a318fb7f9df7550
+0, 187, 187, 1, 152064, be0788a6a06906f57f7ad1e0e4c0aba7
+0, 188, 188, 1, 152064, db90ee89bbeefcd54b79f022ed9d62d9
+0, 189, 189, 1, 152064, 7237b5c1e6f182805d4e324e636f2a45
+0, 190, 190, 1, 152064, e5da5c0643e457087f54935cfa50f7c0
+0, 191, 191, 1, 152064, 89b5d462accdc4cfaed1e57de4589f39
+0, 192, 192, 1, 152064, b670710e2f897f20d83c42bcd0ee7d85
+0, 193, 193, 1, 152064, 9c7ceba12895f2a670e4a1498d28951c
+0, 194, 194, 1, 152064, 4b426b0719a67bc228e1928e83b47b53
+0, 195, 195, 1, 152064, b2c646cd4d3b100619fd6e626ea8b3cb
+0, 196, 196, 1, 152064, ad9abc825e1b87ec0defb1df032364e6
+0, 197, 197, 1, 152064, 21423e23c708f43a9d615bc2bc700d97
+0, 198, 198, 1, 152064, 14a42211968cd4b8416ebc0285eb02b3
+0, 199, 199, 1, 152064, a45eb0c4f6a9c5beeb90a292be71461e
+0, 200, 200, 1, 152064, f9bfba991f0a0ea6bbfdde5d23bd8785
+0, 201, 201, 1, 152064, 49d33752288ddef86dc702652f688c75
+0, 202, 202, 1, 152064, 97b50290b4a1e2f31c704cc302fe89d8
+0, 203, 203, 1, 152064, c3006dcc89d2f45379c840c7dd5f7559
+0, 204, 204, 1, 152064, 4a861c22e63478ffe73571909da9a15f
+0, 205, 205, 1, 152064, e7a8bff496059d3cd40470920fb26c75
+0, 206, 206, 1, 152064, 989d818e0d7d8eea14da209c37ad3e0b
+0, 207, 207, 1, 152064, 1732c746805ca221c85fb5570911378d
+0, 208, 208, 1, 152064, 60ece5f795f5756bef34ba84fb6fec2a
+0, 209, 209, 1, 152064, 9fd355648ef40dd0e15c81554b111637
+0, 210, 210, 1, 152064, 2a3b9220b98ea648e395ab9ea12023d2
+0, 211, 211, 1, 152064, eea2a06e68196917ba2a754563953cd5
+0, 212, 212, 1, 152064, 3c2ec831a9802a968654df1bee81ca40
+0, 213, 213, 1, 152064, 590abeedce1cfa9df8a00d7ab9cf2c8e
+0, 214, 214, 1, 152064, bc07f89391568a78854f99ad9fd62c49
+0, 215, 215, 1, 152064, 0bd866450376be96a85690595d96d909
+0, 216, 216, 1, 152064, 33483531a4d760bdc30a77d5de49aff7
+0, 217, 217, 1, 152064, b0294c6e784fa3f15532331063c5036f
+0, 218, 218, 1, 152064, f4f3ba2781b2a9be3c2dd5b4c445e0d9
+0, 219, 219, 1, 152064, 8550626512e0602a1c53bfb8c51427d8
+0, 220, 220, 1, 152064, 0c2d0229196825910e5f487c33b45ef3
+0, 221, 221, 1, 152064, 93dbbed468f0012b921aa0b2b6751a70
+0, 222, 222, 1, 152064, 2f0d99dc6d4b5c65bc18946b1e6cdc4c
+0, 223, 223, 1, 152064, fb25cbe655fc050bbcbfe9cc3fa06ffe
+0, 224, 224, 1, 152064, 376d3f894957b3bac2308f2662ad5c82
+0, 225, 225, 1, 152064, 46b5c54ea38987b9e3d371a64d06300d
+0, 226, 226, 1, 152064, 9bd24bc1a94aed633ff63aac5b720269
+0, 227, 227, 1, 152064, df0bb3f7724048f67c4a60a1dbb3d5e6
+0, 228, 228, 1, 152064, a9d1c8b8007ea61c0ab2f97b3cfc2aea
+0, 229, 229, 1, 152064, fd5a4ccab51773b09edca30e665999e8
+0, 230, 230, 1, 152064, 0eaf8218244c9b2e78660cf923755557
+0, 231, 231, 1, 152064, 40f4fc64016fd148b14aea2da7652125
+0, 232, 232, 1, 152064, 6f075b312e9f7e1b4c3343441a9e1f7f
+0, 233, 233, 1, 152064, 93f7523632abfe91fa701208aafdc29a
+0, 234, 234, 1, 152064, 3c3ea7aa12a89df2309b76c22053b0ff
+0, 235, 235, 1, 152064, 2181a1aec4278efa70dec025878d88c0
+0, 236, 236, 1, 152064, 35dffda6543fdf43ad182484564abda8
+0, 237, 237, 1, 152064, bf2b65551a8fcf3b1b4185e0ebfca2a7
+0, 238, 238, 1, 152064, 49fd2dd18ddbb7f005c3705910bff99f
+0, 239, 239, 1, 152064, 9f6826599ebd45a1159e46d293fc8f7b
+0, 240, 240, 1, 152064, 5b88b8ec1da51a165e2741f8a6b710ad
+0, 241, 241, 1, 152064, a81229c0d464cc8d376f8b0153b50fc2
+0, 242, 242, 1, 152064, 07ef482c1c9967700a6cef5cdd010384
+0, 243, 243, 1, 152064, d4ebe4de6e096f7cccd5ae2be856e983
+0, 244, 244, 1, 152064, 6daf25ffb2c2baf02e483e84733fc37b
+0, 245, 245, 1, 152064, d52f485c747e945bfe34aeeaaec4fe78
+0, 246, 246, 1, 152064, 408e5b502af7a10454af6f388e2722be
+0, 247, 247, 1, 152064, 684d285dc9c08791ce16e02a1f65e22b
+0, 248, 248, 1, 152064, 5de9b8f8678c6b7a1ff04f217ef8c0c3
+0, 249, 249, 1, 152064, b60f9e37dcfc3924adcfc96d08fb2656
+0, 250, 250, 1, 152064, 8975d551bb7c01cb520b5694e73d1809
+0, 251, 251, 1, 152064, af55f9897a3fa51eacdcebf3a21f5fe5
+0, 252, 252, 1, 152064, 10c21c5167cba09ce54f361e88e6e3c9
+0, 253, 253, 1, 152064, 8cb92c4a8d32fe00a92c5bd4a163cc45
+0, 254, 254, 1, 152064, 3d39fd1222c8421f0eed3c8249c3d772
+0, 255, 255, 1, 152064, 43c5629af47dc4fd659bffe481e84999
+0, 256, 256, 1, 152064, ad6d5a0f4d2d2738809b7f610f6da823
+0, 257, 257, 1, 152064, d2f0dbca68098d58468e94b84ef0fb8b
+0, 258, 258, 1, 152064, 247487ae60500313df92dd0175ac4e0f
+0, 259, 259, 1, 152064, cfbbabb4b8c93c87c221f76a155bb0fc
+0, 260, 260, 1, 152064, c708254a644abc41788d717dd59b8baf
+0, 261, 261, 1, 152064, fa710d87bddd1a65970c5618a8a0158f
+0, 262, 262, 1, 152064, 31210937c8a67c6aafda2e03226b9770
+0, 263, 263, 1, 152064, ac518a56fc537de251f3d28d380e25cb
+0, 264, 264, 1, 152064, afcb7642c336bcef9b605a40e518d305
+0, 265, 265, 1, 152064, 15fd29e16aaebae6f74e49455631c1f8
+0, 266, 266, 1, 152064, 938b90999b05595e9875c6d4f9836407
+0, 267, 267, 1, 152064, 2fe744b939902a5f4bb69e9243c55d08
+0, 268, 268, 1, 152064, a902057edac1638a1cd218fe5b88bfc2
+0, 269, 269, 1, 152064, 78087115b9600b5499866c127d175c0f
+0, 270, 270, 1, 152064, 877c729e2d2b599dd6cac1f59f12e068
+0, 271, 271, 1, 152064, 77e6b4b761902fbe27fb0ff9eb6d02ac
+0, 272, 272, 1, 152064, dd3ee373cb4935eca46947aedda3b991
+0, 273, 273, 1, 152064, b3ee6b4a18f6d20f9b9fd8dc9e8af90e
+0, 274, 274, 1, 152064, 492afb7421667468fa95017c693ec47b
+0, 275, 275, 1, 152064, 9abb912d8101de895b8f482c199934c2
+0, 276, 276, 1, 152064, 08ca372dfb5e90382f1b58345a0e51b1
+0, 277, 277, 1, 152064, 805559cb3f3385e7865df692336dba29
+0, 278, 278, 1, 152064, c5cc85e4d44010e048fd2013535d7180
+0, 279, 279, 1, 152064, ef9a05a7a4e0b5beff9a8119af44ebc7
+0, 280, 280, 1, 152064, e6983be0a0c1705cfede1e7476aad381
+0, 281, 281, 1, 152064, a4bb0c3d4deb17784b07d3713db05302
+0, 282, 282, 1, 152064, 0fd5bb9259e8c27aba7670b08cd9a26b
+0, 283, 283, 1, 152064, 43d6df9fd672b13e2c59db924e9fe30b
+0, 284, 284, 1, 152064, 3aaf3b87705c46495c9d1b9f4ea706bf
+0, 285, 285, 1, 152064, 0d2ba631f5c716d9c5e5b2a75d3b6433
+0, 286, 286, 1, 152064, bf29cc016dce85e621aaa7647fae1544
+0, 287, 287, 1, 152064, 3374284a808d79e9be32bf3610b0fd17
+0, 288, 288, 1, 152064, ea3f305e76009f3bf2cd5014d339eafa
+0, 289, 289, 1, 152064, 95ce7320a841a71b5a8871cef385ce41
+0, 290, 290, 1, 152064, 88613d96dbda681edab4ed41c3f08536
+0, 291, 291, 1, 152064, b9e9e9045b91c4f7917274088de64a5e
+0, 292, 292, 1, 152064, e0b90055449e7403289a8dda9c02add0
+0, 293, 293, 1, 152064, 367ee1603fa7778dad3e99be8db779ee
+0, 294, 294, 1, 152064, 6bb0eaa6140d673b452eee6ac6c262c2
+0, 295, 295, 1, 152064, 9af4ef919ae61e1597db1b9acd6af95a
+0, 296, 296, 1, 152064, e8f29872e86e54ac26b5fb0a20f10d3e
+0, 297, 297, 1, 152064, 09aaad95cd7d173bfe609b79440cbfc8
+0, 298, 298, 1, 152064, c03abe502be10f76e33d93e1c40cc674
+0, 299, 299, 1, 152064, 3e7e315be8aef281714a63f4cf086085